diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..3171155 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,4 @@ +# The benchmark producer golden fixtures are asserted byte-for-byte against the serializer +# output, which is UTF-8 without BOM and uses LF newlines. Pin them to LF so Git's autocrlf +# setting cannot rewrite them to CRLF on checkout and break the byte-stability comparison. +benchmark/**/*.json text eol=lf diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 45e997d..02f145d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -89,6 +89,62 @@ jobs: # Current sow branch: base_ref on PR events, ref_name on push events. $sowRef = if ($baseRef -match '^sow/') { $baseRef } elseif ($refName -match '^sow/') { $refName } else { '' } if ($sowRef -and $sowRef -ne $headRef) { $candidates += $sowRef } + # Feature branches off a quarterly sow branch (e.g. sow/2026-Q3-feature): the + # quarter branch itself carries the matching dependency state. Without this a + # push-event build (no head/base ref) falls straight to the stale fallback below. + # NOTE: the loop variable must NOT be $r — that is the outer repo-name variable. + foreach ($branchRef in @($headRef, $baseRef, $refName)) { + if ($branchRef -match '^sow/(\d{4}-Q\d)') { + $quarterRef = "sow/$($Matches[1])" + if ($candidates -notcontains $quarterRef) { $candidates += $quarterRef } + } + } + $candidates += 'sow/2026-Q2' + $cloned = $false + foreach ($cand in $candidates) { + $has = (git ls-remote --heads "https://github.com/$org/$r.git" $cand 2>$null | Out-String).Trim() + if ($has) { + Write-Host "Cloning $org/$r @ $cand" + git clone --depth 1 --branch $cand "https://github.com/$org/$r.git" $r + $cloned = $true + break + } + } + if (-not $cloned) { + Write-Host "Cloning $org/$r @ default branch" + git clone --depth 1 "https://github.com/$org/$r.git" $r + } + } + + + - name: Build benchmark schema (SAM_Validation) + shell: pwsh + run: | + $ErrorActionPreference = 'Stop' + + $org = '${{ env.ORG_NAME }}' + $r = 'SAM_Validation' + + # Clone SAM_Validation as a sibling (same branch-candidate fallback as the deps step + # above), then build ONLY the engine-neutral benchmark schema (B1a) into its build\ + # folder. The B1b producer references it by HintPath + # (..\..\..\SAM_Validation\build\SAM.Analytical.Benchmark.dll), so it must exist before + # SAM_OpenStudio is built below. The schema project is standalone (netstandard2.0, + # System.Text.Json only) — no other SAM_Validation project is built. + if (-not (Test-Path $r)) { + $headRef = '${{ github.head_ref }}' + $baseRef = '${{ github.base_ref }}' + $refName = '${{ github.ref_name }}' + $candidates = @() + if ($headRef) { $candidates += $headRef } + $sowRef = if ($baseRef -match '^sow/') { $baseRef } elseif ($refName -match '^sow/') { $refName } else { '' } + if ($sowRef -and $sowRef -ne $headRef) { $candidates += $sowRef } + foreach ($branchRef in @($headRef, $baseRef, $refName)) { + if ($branchRef -match '^sow/(\d{4}-Q\d)') { + $quarterRef = "sow/$($Matches[1])" + if ($candidates -notcontains $quarterRef) { $candidates += $quarterRef } + } + } $candidates += 'sow/2026-Q2' $cloned = $false foreach ($cand in $candidates) { @@ -106,6 +162,14 @@ jobs: } } + $csproj = Join-Path $r 'SAM.Analytical.Benchmark/SAM.Analytical.Benchmark.csproj' + Write-Host "==> Building benchmark schema: $csproj" + & dotnet build $csproj -c Release '/p:SAMVersion=${{ steps.ver.outputs.samversion }}' + if ($LASTEXITCODE -ne 0) { throw "Benchmark schema build failed" } + + $dll = Join-Path $r 'build/SAM.Analytical.Benchmark.dll' + if (-not (Test-Path $dll)) { throw "Expected schema DLL missing after build: $dll" } + Write-Host "Schema DLL present: $dll" - name: Restore + Rebuild in order (safe Platform handling) shell: pwsh @@ -188,6 +252,27 @@ jobs: if ($LASTEXITCODE -ne 0) { throw "Rebuild failed: $($it.Repo)" } } + - name: Run benchmark producer tests (offline) + shell: pwsh + run: | + $ErrorActionPreference = 'Stop' + + $repo = '${{ env.REPO_NAME }}' + + # Run the portable B1b producer tests: the C5 -> B1a mapping, the committed golden + # JSON byte-stability check and the CLI contract tests. The single live end-to-end + # test is [Category("Simulation")] and is excluded here (it needs an OpenStudio/ + # EnergyPlus install); it remains available for an environment-gated run. + $testProject = Join-Path $repo 'benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/SAM.Analytical.OpenStudio.Benchmark.Tests.csproj' + Write-Host "==> Testing (excluding Simulation): $testProject" + & dotnet test $testProject ` + -c Release ` + '/p:Platform=x64' ` + '/p:SAMVersion=${{ steps.ver.outputs.samversion }}' ` + --filter 'TestCategory!=Simulation' ` + --logger 'console;verbosity=normal' + if ($LASTEXITCODE -ne 0) { throw "Benchmark producer tests failed" } + - name: Upload build folders (optional) uses: actions/upload-artifact@v4 with: diff --git a/Grasshopper/SAM.Analytical.Grasshopper.OpenStudio/Component/MenuHelper.cs b/Grasshopper/SAM.Analytical.Grasshopper.OpenStudio/Component/MenuHelper.cs new file mode 100644 index 0000000..ba3ff25 --- /dev/null +++ b/Grasshopper/SAM.Analytical.Grasshopper.OpenStudio/Component/MenuHelper.cs @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using Grasshopper.Kernel; +using Grasshopper.Kernel.Types; +using System.Linq; + +namespace SAM.Analytical.Grasshopper.OpenStudio +{ + /// + /// Shared helpers for the "Go to Directory" context-menu item (same behaviour as + /// SAMAnalytical.Paths in the SAM repository): the path is read from the volatile data + /// of an input parameter and opened in Windows Explorer. + /// + internal static class MenuHelper + { + internal static string GetVolatileString(GH_Component component, string name) + { + int index = component.Params.IndexOfInputParam(name); + if (index == -1) + { + return null; + } + + object @object = component.Params.Input[index].VolatileData.AllData(true)?.OfType()?.FirstOrDefault(); + if (@object is IGH_Goo) + { + return (@object as dynamic).Value?.ToString(); + } + + return null; + } + + internal static void GoToDirectory(string directory, bool create) + { + if (string.IsNullOrWhiteSpace(directory)) + { + return; + } + + if (create) + { + Core.Create.Directory(directory); + } + + if (!System.IO.Directory.Exists(directory)) + { + return; + } + + Core.Query.StartProcess(directory); + } + + internal static void GoToFileDirectory(string path) + { + if (string.IsNullOrWhiteSpace(path) || !System.IO.File.Exists(path)) + { + return; + } + + GoToDirectory(System.IO.Path.GetDirectoryName(path), false); + } + } +} diff --git a/Grasshopper/SAM.Analytical.Grasshopper.OpenStudio/Component/OpenStudioCreateDesignDaysBySQL.cs b/Grasshopper/SAM.Analytical.Grasshopper.OpenStudio/Component/OpenStudioCreateDesignDaysBySQL.cs index 10b7cf0..90f381e 100644 --- a/Grasshopper/SAM.Analytical.Grasshopper.OpenStudio/Component/OpenStudioCreateDesignDaysBySQL.cs +++ b/Grasshopper/SAM.Analytical.Grasshopper.OpenStudio/Component/OpenStudioCreateDesignDaysBySQL.cs @@ -1,11 +1,15 @@ -using Grasshopper.Kernel; +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using Grasshopper.Kernel; using SAM.Core.Grasshopper; using System; using System.Collections.Generic; +using System.Windows.Forms; namespace SAM.Analytical.Grasshopper.OpenStudio { - public class OpenStudioCreateDesignDaysBySQL : GH_SAMComponent + public class OpenStudioCreateDesignDaysBySQL : GH_SAMVariableOutputParameterComponent { /// /// Gets the unique ID for this component. Do not change this ID after release. @@ -15,7 +19,7 @@ public class OpenStudioCreateDesignDaysBySQL : GH_SAMComponent /// /// The latest version of this component /// - public override string LatestComponentVersion => "1.0.0"; + public override string LatestComponentVersion => "1.0.3"; /// /// Provides an Icon for the component. @@ -32,20 +36,43 @@ public OpenStudioCreateDesignDaysBySQL() { } + public override void AppendAdditionalMenuItems(ToolStripDropDown menu) + { + base.AppendAdditionalMenuItems(menu); + + Menu_AppendSeparator(menu); + Menu_AppendItem(menu, "Go to Directory", Menu_GoToDirectory, Properties.Resources.SAM_Small, true, false); + } + + void Menu_GoToDirectory(object sender, EventArgs e) + { + MenuHelper.GoToFileDirectory(MenuHelper.GetVolatileString(this, "_sQLPath")); + } + /// /// Registers all the input parameters for this component. /// - protected override void RegisterInputParams(GH_InputParamManager inputParamManager) + protected override GH_SAMParam[] Inputs { - inputParamManager.AddTextParameter("_sQLPath", "_sQLPath", "SQL File Path", GH_ParamAccess.item); + get + { + List result = new List(); + result.Add(new GH_SAMParam(new global::Grasshopper.Kernel.Parameters.Param_String() { Name = "_sQLPath", NickName = "_sQLPath", Description = "SQL File Path", Access = GH_ParamAccess.item }, ParamVisibility.Binding)); + return result.ToArray(); + } } /// /// Registers all the output parameters for this component. /// - protected override void RegisterOutputParams(GH_OutputParamManager outputParamManager) + protected override GH_SAMParam[] Outputs { - outputParamManager.AddParameter(new GooAnalyticalObjectParam(), "designDays", "designDays", "SAM Analytical DesignDays", GH_ParamAccess.list); + get + { + List result = new List(); + result.Add(new GH_SAMParam(new GooAnalyticalObjectParam() { Name = "designDays", NickName = "designDays", Description = "SAM Analytical DesignDays", Access = GH_ParamAccess.list }, ParamVisibility.Binding)); + return result.ToArray(); + } } /// @@ -55,15 +82,38 @@ protected override void RegisterOutputParams(GH_OutputParamManager outputParamMa protected override void SolveInstance(IGH_DataAccess dataAccess) { string path = null; - if (!dataAccess.GetData(0, ref path) || path == null) + int index = Params.IndexOfInputParam("_sQLPath"); + if (index == -1 || !dataAccess.GetData(index, ref path) || path == null) { AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Invalid data"); return; } - List result = Analytical.OpenStudio.Create.DesignDays(path); + List result = null; + List diagnostics = null; + try + { + result = Analytical.OpenStudio.Create.DesignDays(path, out diagnostics); + } + catch (Exception exception) + { + // Malformed SQL content is a structured diagnostic, never a solution exception. + AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, string.Format("Design days could not be read: {0}", exception.Message)); + } + + if (diagnostics != null) + { + foreach (string diagnostic in diagnostics) + { + AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, diagnostic); + } + } - dataAccess.SetDataList(0, result); + index = Params.IndexOfOutputParam("designDays"); + if (index != -1) + { + dataAccess.SetDataList(index, result); + } } } -} \ No newline at end of file +} diff --git a/Grasshopper/SAM.Analytical.Grasshopper.OpenStudio/Component/OpenStudioCreateSpaceSimulationResultsBySQL.cs b/Grasshopper/SAM.Analytical.Grasshopper.OpenStudio/Component/OpenStudioCreateSpaceSimulationResultsBySQL.cs index 13da133..f3ec30b 100644 --- a/Grasshopper/SAM.Analytical.Grasshopper.OpenStudio/Component/OpenStudioCreateSpaceSimulationResultsBySQL.cs +++ b/Grasshopper/SAM.Analytical.Grasshopper.OpenStudio/Component/OpenStudioCreateSpaceSimulationResultsBySQL.cs @@ -1,10 +1,15 @@ -using Grasshopper.Kernel; +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using Grasshopper.Kernel; using SAM.Core.Grasshopper; using System; +using System.Collections.Generic; +using System.Windows.Forms; namespace SAM.Analytical.Grasshopper.OpenStudio { - public class OpenStudioCreateSpaceSimulationResultsBySQL : GH_SAMComponent + public class OpenStudioCreateSpaceSimulationResultsBySQL : GH_SAMVariableOutputParameterComponent { /// /// Gets the unique ID for this component. Do not change this ID after release. @@ -14,7 +19,7 @@ public class OpenStudioCreateSpaceSimulationResultsBySQL : GH_SAMComponent /// /// The latest version of this component /// - public override string LatestComponentVersion => "1.0.1"; + public override string LatestComponentVersion => "1.0.3"; /// /// Provides an Icon for the component. @@ -31,20 +36,43 @@ public OpenStudioCreateSpaceSimulationResultsBySQL() { } + public override void AppendAdditionalMenuItems(ToolStripDropDown menu) + { + base.AppendAdditionalMenuItems(menu); + + Menu_AppendSeparator(menu); + Menu_AppendItem(menu, "Go to Directory", Menu_GoToDirectory, Properties.Resources.SAM_Small, true, false); + } + + void Menu_GoToDirectory(object sender, EventArgs e) + { + MenuHelper.GoToFileDirectory(MenuHelper.GetVolatileString(this, "_sQLPath")); + } + /// /// Registers all the input parameters for this component. /// - protected override void RegisterInputParams(GH_InputParamManager inputParamManager) + protected override GH_SAMParam[] Inputs { - inputParamManager.AddTextParameter("_sQLPath", "_sQLPath", "SQL File Path", GH_ParamAccess.item); + get + { + List result = new List(); + result.Add(new GH_SAMParam(new global::Grasshopper.Kernel.Parameters.Param_String() { Name = "_sQLPath", NickName = "_sQLPath", Description = "SQL File Path", Access = GH_ParamAccess.item }, ParamVisibility.Binding)); + return result.ToArray(); + } } /// /// Registers all the output parameters for this component. /// - protected override void RegisterOutputParams(GH_OutputParamManager outputParamManager) + protected override GH_SAMParam[] Outputs { - outputParamManager.AddParameter(new GooResultParam(), "spaceSymulationResults", "spaceSymulationResults", "SAM Analytical SpaceSimulationResults", GH_ParamAccess.list); + get + { + List result = new List(); + result.Add(new GH_SAMParam(new GooResultParam() { Name = "spaceSymulationResults", NickName = "spaceSymulationResults", Description = "SAM Analytical SpaceSimulationResults", Access = GH_ParamAccess.list }, ParamVisibility.Binding)); + return result.ToArray(); + } } /// @@ -55,13 +83,18 @@ protected override void SolveInstance(IGH_DataAccess dataAccess) { string path = null; - if (!dataAccess.GetData(0, ref path) || path == null) + int index = Params.IndexOfInputParam("_sQLPath"); + if (index == -1 || !dataAccess.GetData(index, ref path) || path == null) { AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Invalid data"); return; } - dataAccess.SetDataList(0, Analytical.OpenStudio.Create.SpaceSimulationResults(path)?.ConvertAll(x => new GooResult(x))); + index = Params.IndexOfOutputParam("spaceSymulationResults"); + if (index != -1) + { + dataAccess.SetDataList(index, Analytical.OpenStudio.Create.SpaceSimulationResults(path)?.ConvertAll(x => new GooResult(x))); + } } } -} \ No newline at end of file +} diff --git a/Grasshopper/SAM.Analytical.Grasshopper.OpenStudio/Component/OpenStudioRunModel.cs b/Grasshopper/SAM.Analytical.Grasshopper.OpenStudio/Component/OpenStudioRunModel.cs new file mode 100644 index 0000000..fc96a19 --- /dev/null +++ b/Grasshopper/SAM.Analytical.Grasshopper.OpenStudio/Component/OpenStudioRunModel.cs @@ -0,0 +1,218 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using Grasshopper.Kernel; +using SAM.Core.Grasshopper; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace SAM.Analytical.Grasshopper.OpenStudio +{ + public class OpenStudioRunModel : GH_SAMAsyncComponent + { + /// + /// Gets the unique ID for this component. Do not change this ID after release. + /// + public override Guid ComponentGuid => new Guid("2e9d5b40-6c17-4f8a-b3e2-95a4d0c8f176"); + + /// + /// The latest version of this component + /// + public override string LatestComponentVersion => "1.2.0"; + + /// + /// Provides an Icon for the component. + /// + protected override System.Drawing.Bitmap Icon => Properties.Resources.SAM_OpenStudio; + + /// + /// Runs an existing OpenStudio model (OSM or OSW) through the OpenStudio CLI and returns + /// paths, diagnostics and annual Ideal Loads energy. Non-blocking (C6): the simulation + /// executes on a background task with cancellation; results are harvested on the UI + /// thread. Thin wrapper over SAM.Analytical.OpenStudio.OpenStudioSimulationRunner — no + /// run logic lives here. + /// + public OpenStudioRunModel() + : base("OpenStudio.RunModel", "OpenStudio.RunModel", + "Runs an existing OpenStudio model (OSM or OSW) through the OpenStudio CLI (EnergyPlus) — asynchronous, cancellable", + "SAM", "OpenStudio") + { + } + + public override void AppendAdditionalMenuItems(ToolStripDropDown menu) + { + base.AppendAdditionalMenuItems(menu); + + Menu_AppendSeparator(menu); + Menu_AppendItem(menu, "Go to Directory", Menu_GoToDirectory, Properties.Resources.SAM_Small, true, false); + } + + void Menu_GoToDirectory(object sender, EventArgs e) + { + string outputDirectory = MenuHelper.GetVolatileString(this, "outputDirectory_"); + if (!string.IsNullOrWhiteSpace(outputDirectory)) + { + MenuHelper.GoToDirectory(outputDirectory, true); + return; + } + + MenuHelper.GoToFileDirectory(MenuHelper.GetVolatileString(this, "_path")); + } + + /// + /// Registers all the input parameters for this component. + /// + protected override GH_SAMParam[] Inputs + { + get + { + List result = new List(); + result.Add(new GH_SAMParam(new global::Grasshopper.Kernel.Parameters.Param_String() { Name = "_path", NickName = "_path", Description = "OSM or OSW file path", Access = GH_ParamAccess.item }, ParamVisibility.Binding)); + result.Add(new GH_SAMParam(new global::Grasshopper.Kernel.Parameters.Param_String() { Name = "epwPath_", NickName = "epwPath_", Description = "EPW weather file path (required for OSM input)", Access = GH_ParamAccess.item, Optional = true }, ParamVisibility.Binding)); + result.Add(new GH_SAMParam(new global::Grasshopper.Kernel.Parameters.Param_String() { Name = "outputDirectory_", NickName = "outputDirectory_", Description = "Directory for the generated OSW and run folder (defaults next to the input)", Access = GH_ParamAccess.item, Optional = true }, ParamVisibility.Binding)); + + global::Grasshopper.Kernel.Parameters.Param_Boolean param_Boolean = new global::Grasshopper.Kernel.Parameters.Param_Boolean() { Name = "_run", NickName = "_run", Description = "True executes the simulation", Access = GH_ParamAccess.item }; + param_Boolean.SetPersistentData(false); + result.Add(new GH_SAMParam(param_Boolean, ParamVisibility.Binding)); + + result.Add(CreateCancelParam()); + + return result.ToArray(); + } + } + + /// + /// Registers all the output parameters for this component. + /// + protected override GH_SAMParam[] Outputs + { + get + { + List result = new List(); + result.Add(new GH_SAMParam(new global::Grasshopper.Kernel.Parameters.Param_String() { Name = "sqlPath", NickName = "sqlPath", Description = "EnergyPlus SQLite results path", Access = GH_ParamAccess.item }, ParamVisibility.Binding)); + result.Add(new GH_SAMParam(new global::Grasshopper.Kernel.Parameters.Param_Number() { Name = "heating", NickName = "heating", Description = "Annual Ideal Loads heating energy [kWh]", Access = GH_ParamAccess.item }, ParamVisibility.Binding)); + result.Add(new GH_SAMParam(new global::Grasshopper.Kernel.Parameters.Param_Number() { Name = "cooling", NickName = "cooling", Description = "Annual Ideal Loads cooling energy [kWh]", Access = GH_ParamAccess.item }, ParamVisibility.Binding)); + result.Add(new GH_SAMParam(new global::Grasshopper.Kernel.Parameters.Param_String() { Name = "diagnostics", NickName = "diagnostics", Description = "Run diagnostics", Access = GH_ParamAccess.list }, ParamVisibility.Binding)); + result.Add(new GH_SAMParam(new global::Grasshopper.Kernel.Parameters.Param_Boolean() { Name = "successful", NickName = "successful", Description = "True when the CLI exited 0 with no fatal errors and results exist", Access = GH_ParamAccess.item }, ParamVisibility.Binding)); + return result.ToArray(); + } + } + + protected override string ComputeSignature(IGH_DataAccess dataAccess) + { + bool run = false; + int index = Params.IndexOfInputParam("_run"); + if (index != -1) + { + dataAccess.GetData(index, ref run); + } + + if (!run) + { + AddRuntimeMessage(GH_RuntimeMessageLevel.Remark, "Set _run to True to execute the simulation"); + return null; + } + + string path = null; + index = Params.IndexOfInputParam("_path"); + if (index == -1 || !dataAccess.GetData(index, ref path) || string.IsNullOrWhiteSpace(path)) + { + AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Invalid _path data"); + return null; + } + + string epwPath = null; + index = Params.IndexOfInputParam("epwPath_"); + if (index != -1) + { + dataAccess.GetData(index, ref epwPath); + } + + string outputDirectory = null; + index = Params.IndexOfInputParam("outputDirectory_"); + if (index != -1) + { + dataAccess.GetData(index, ref outputDirectory); + } + + return string.Format("{0}|{1}|{2}", path, epwPath, outputDirectory); + } + + protected override Task CreateTask(IGH_DataAccess dataAccess, CancellationToken cancellationToken) + { + string path = null; + dataAccess.GetData(Params.IndexOfInputParam("_path"), ref path); + + string epwPath = null; + dataAccess.GetData(Params.IndexOfInputParam("epwPath_"), ref epwPath); + + string outputDirectory = null; + dataAccess.GetData(Params.IndexOfInputParam("outputDirectory_"), ref outputDirectory); + + return Task.Run(() => + { + List diagnostics = new List(); + Core.OpenStudio.OpenStudioRunResult openStudioRunResult = Analytical.OpenStudio.OpenStudioSimulationRunner.Run(path, epwPath, outputDirectory, null, out Analytical.OpenStudio.OpenStudioLoadSummary openStudioLoadSummary, diagnostics, cancellationToken); + return new RunOutcome(openStudioRunResult, openStudioLoadSummary, diagnostics); + }, cancellationToken); + } + + protected override void Harvest(Task task, IGH_DataAccess dataAccess) + { + if (task.IsFaulted) + { + AddRuntimeMessage(GH_RuntimeMessageLevel.Error, task.Exception?.GetBaseException().Message ?? "Simulation failed"); + return; + } + + RunOutcome runOutcome = ((Task)task).Result; + + int index = Params.IndexOfOutputParam("successful"); + if (index != -1) + { + dataAccess.SetData(index, runOutcome.RunResult.Success); + } + + index = Params.IndexOfOutputParam("sqlPath"); + if (index != -1) + { + dataAccess.SetData(index, runOutcome.RunResult.SqlPath); + } + + index = Params.IndexOfOutputParam("heating"); + if (index != -1 && runOutcome.Loads != null) + { + dataAccess.SetData(index, runOutcome.Loads.TotalHeating); + } + + index = Params.IndexOfOutputParam("cooling"); + if (index != -1 && runOutcome.Loads != null) + { + dataAccess.SetData(index, runOutcome.Loads.TotalCooling); + } + + index = Params.IndexOfOutputParam("diagnostics"); + if (index != -1) + { + dataAccess.SetDataList(index, runOutcome.Diagnostics.ConvertAll(x => x.ToString())); + } + } + + private sealed class RunOutcome + { + internal Core.OpenStudio.OpenStudioRunResult RunResult { get; } + internal Analytical.OpenStudio.OpenStudioLoadSummary Loads { get; } + internal List Diagnostics { get; } + + internal RunOutcome(Core.OpenStudio.OpenStudioRunResult runResult, Analytical.OpenStudio.OpenStudioLoadSummary loads, List diagnostics) + { + RunResult = runResult; + Loads = loads; + Diagnostics = diagnostics; + } + } + } +} diff --git a/Grasshopper/SAM.Analytical.Grasshopper.OpenStudio/Component/OpenStudioToSAMAnalytical.cs b/Grasshopper/SAM.Analytical.Grasshopper.OpenStudio/Component/OpenStudioToSAMAnalytical.cs new file mode 100644 index 0000000..2916984 --- /dev/null +++ b/Grasshopper/SAM.Analytical.Grasshopper.OpenStudio/Component/OpenStudioToSAMAnalytical.cs @@ -0,0 +1,221 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using Grasshopper.Kernel; +using SAM.Core.Grasshopper; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace SAM.Analytical.Grasshopper.OpenStudio +{ + public class OpenStudioToSAMAnalytical : GH_SAMAsyncComponent + { + /// + /// Gets the unique ID for this component. Do not change this ID after release. + /// + public override Guid ComponentGuid => new Guid("3c8b41d7-92e5-4a06-b1f4-6d2a7c9e08b3"); + + /// + /// The latest version of this component + /// + public override string LatestComponentVersion => "1.0.0"; + + /// + /// Provides an Icon for the component. + /// + protected override System.Drawing.Bitmap Icon => Properties.Resources.SAM_OpenStudio; + + /// + /// Imports an OpenStudio model (OSM) or workflow (OSW) into a SAM AnalyticalModel. + /// Non-blocking: the import runs on a background task with cancellation, mirroring + /// OpenStudio.RunModel, because an executed OSW workflow can take minutes. A direct OSM + /// takes the same path so the component contract does not change with the input kind. + /// Thin wrapper over SAM.Analytical.OpenStudio.Convert.ToSAM — no conversion rules live + /// here. + /// + public OpenStudioToSAMAnalytical() + : base("OpenStudio.SAMAnalytical", "OpenStudio.SAMAnalytical", + "Imports an OpenStudio model (OSM) or workflow (OSW) into a SAM AnalyticalModel — asynchronous, cancellable", + "SAM", "OpenStudio") + { + } + + public override void AppendAdditionalMenuItems(ToolStripDropDown menu) + { + base.AppendAdditionalMenuItems(menu); + + Menu_AppendSeparator(menu); + Menu_AppendItem(menu, "Go to Directory", Menu_GoToDirectory, Properties.Resources.SAM_Small, true, false); + } + + void Menu_GoToDirectory(object sender, EventArgs e) + { + string outputDirectory = MenuHelper.GetVolatileString(this, "outputDirectory_"); + if (!string.IsNullOrWhiteSpace(outputDirectory)) + { + MenuHelper.GoToDirectory(outputDirectory, true); + return; + } + + MenuHelper.GoToFileDirectory(MenuHelper.GetVolatileString(this, "_path")); + } + + /// + /// Registers all the input parameters for this component. + /// + protected override GH_SAMParam[] Inputs + { + get + { + // Input order is part of the released contract: a Grasshopper document stores + // connections by index, so these must never be reordered. Optional inputs are + // placed after the required path and before the cancel parameter, which the + // asynchronous base class expects last. + List result = new List(); + result.Add(new GH_SAMParam(new global::Grasshopper.Kernel.Parameters.Param_String() { Name = "_path", NickName = "_path", Description = "OSM or OSW file path", Access = GH_ParamAccess.item }, ParamVisibility.Binding)); + + global::Grasshopper.Kernel.Parameters.Param_Boolean param_Boolean = new global::Grasshopper.Kernel.Parameters.Param_Boolean() { Name = "executeWorkflow_", NickName = "executeWorkflow_", Description = "OSW input only. False (default) imports the workflow's seed model and warns that its measures were NOT applied. True runs the workflow through the OpenStudio CLI and imports the final post-model-measure model. Ignored for OSM input.", Access = GH_ParamAccess.item, Optional = true }; + param_Boolean.SetPersistentData(false); + result.Add(new GH_SAMParam(param_Boolean, ParamVisibility.Binding)); + + result.Add(new GH_SAMParam(new global::Grasshopper.Kernel.Parameters.Param_String() { Name = "outputDirectory_", NickName = "outputDirectory_", Description = "Directory for OSW workflow execution (an isolated run folder is created inside it). Defaults to the OSW's own directory. Unused for OSM input.", Access = GH_ParamAccess.item, Optional = true }, ParamVisibility.Binding)); + + result.Add(CreateCancelParam()); + + return result.ToArray(); + } + } + + /// + /// Registers all the output parameters for this component. + /// + protected override GH_SAMParam[] Outputs + { + get + { + List result = new List(); + result.Add(new GH_SAMParam(new GooAnalyticalModelParam() { Name = "analyticalModel", NickName = "analyticalModel", Description = "Imported SAM AnalyticalModel", Access = GH_ParamAccess.item }, ParamVisibility.Binding)); + result.Add(new GH_SAMParam(new global::Grasshopper.Kernel.Parameters.Param_String() { Name = "resolvedOsmPath", NickName = "resolvedOsmPath", Description = "The OSM actually converted: the input itself for an OSM, the resolved seed for a non-executed OSW, or the final post-model-measure OSM for an executed workflow", Access = GH_ParamAccess.item }, ParamVisibility.Binding)); + result.Add(new GH_SAMParam(new global::Grasshopper.Kernel.Parameters.Param_String() { Name = "diagnostics", NickName = "diagnostics", Description = "Import diagnostics: every approximation, unsupported object and failure", Access = GH_ParamAccess.list }, ParamVisibility.Binding)); + result.Add(new GH_SAMParam(new global::Grasshopper.Kernel.Parameters.Param_Boolean() { Name = "successful", NickName = "successful", Description = "True when a SAM AnalyticalModel was produced and no diagnostic has Error severity", Access = GH_ParamAccess.item }, ParamVisibility.Binding)); + return result.ToArray(); + } + } + + protected override string ComputeSignature(IGH_DataAccess dataAccess) + { + string path = null; + int index = Params.IndexOfInputParam("_path"); + if (index == -1 || !dataAccess.GetData(index, ref path) || string.IsNullOrWhiteSpace(path)) + { + AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Invalid _path data"); + return null; + } + + bool executeWorkflow = false; + index = Params.IndexOfInputParam("executeWorkflow_"); + if (index != -1) + { + dataAccess.GetData(index, ref executeWorkflow); + } + + string outputDirectory = null; + index = Params.IndexOfInputParam("outputDirectory_"); + if (index != -1) + { + dataAccess.GetData(index, ref outputDirectory); + } + + return string.Format("{0}|{1}|{2}", path, executeWorkflow, outputDirectory); + } + + protected override Task CreateTask(IGH_DataAccess dataAccess, CancellationToken cancellationToken) + { + string path = null; + dataAccess.GetData(Params.IndexOfInputParam("_path"), ref path); + + bool executeWorkflow = false; + dataAccess.GetData(Params.IndexOfInputParam("executeWorkflow_"), ref executeWorkflow); + + string outputDirectory = null; + dataAccess.GetData(Params.IndexOfInputParam("outputDirectory_"), ref outputDirectory); + + Core.OpenStudio.OpenStudioImportOptions openStudioImportOptions = new Core.OpenStudio.OpenStudioImportOptions + { + ExecuteWorkflow = executeWorkflow, + OutputDirectory = string.IsNullOrWhiteSpace(outputDirectory) ? null : outputDirectory, + }; + + return Analytical.OpenStudio.Convert.ToSAMAsync(path, openStudioImportOptions, null, null, cancellationToken); + } + + protected override void Harvest(Task task, IGH_DataAccess dataAccess) + { + if (task.IsFaulted) + { + AddRuntimeMessage(GH_RuntimeMessageLevel.Error, task.Exception?.GetBaseException().Message ?? "Import failed"); + return; + } + + Analytical.OpenStudio.OpenStudioImportResult openStudioImportResult = ((Task)task).Result; + if (openStudioImportResult == null) + { + AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Import produced no result"); + return; + } + + int index = Params.IndexOfOutputParam("analyticalModel"); + if (index != -1 && openStudioImportResult.AnalyticalModel != null) + { + dataAccess.SetData(index, new GooAnalyticalModel(openStudioImportResult.AnalyticalModel)); + } + + index = Params.IndexOfOutputParam("resolvedOsmPath"); + if (index != -1) + { + dataAccess.SetData(index, openStudioImportResult.ResolvedOsmPath); + } + + index = Params.IndexOfOutputParam("diagnostics"); + if (index != -1) + { + List diagnostics = new List(); + foreach (Core.OpenStudio.OpenStudioDiagnostic openStudioDiagnostic in openStudioImportResult.Diagnostics) + { + diagnostics.Add(openStudioDiagnostic.ToString()); + } + + dataAccess.SetDataList(index, diagnostics); + } + + index = Params.IndexOfOutputParam("successful"); + if (index != -1) + { + dataAccess.SetData(index, openStudioImportResult.IsValid); + } + + // Surface the outcome on the component itself: a Grasshopper user reads the canvas + // long before they read a diagnostics panel, and an import that silently produced an + // errored model would otherwise look like it worked. + foreach (Core.OpenStudio.OpenStudioDiagnostic openStudioDiagnostic in openStudioImportResult.Diagnostics) + { + if (openStudioDiagnostic == null) + { + continue; + } + + if (openStudioDiagnostic.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error) + { + AddRuntimeMessage(GH_RuntimeMessageLevel.Error, openStudioDiagnostic.ToString()); + } + else if (openStudioDiagnostic.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning) + { + AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, openStudioDiagnostic.ToString()); + } + } + } + } +} diff --git a/Grasshopper/SAM.Analytical.Grasshopper.OpenStudio/Component/SAMAnalyticalAddResultsBySQL.cs b/Grasshopper/SAM.Analytical.Grasshopper.OpenStudio/Component/SAMAnalyticalAddResultsBySQL.cs index fee8621..21919be 100644 --- a/Grasshopper/SAM.Analytical.Grasshopper.OpenStudio/Component/SAMAnalyticalAddResultsBySQL.cs +++ b/Grasshopper/SAM.Analytical.Grasshopper.OpenStudio/Component/SAMAnalyticalAddResultsBySQL.cs @@ -1,11 +1,15 @@ -using Grasshopper.Kernel; +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using Grasshopper.Kernel; using SAM.Core.Grasshopper; using System; using System.Collections.Generic; +using System.Windows.Forms; namespace SAM.Analytical.Grasshopper.OpenStudio { - public class SAMAnalyticalAddResultsBySQL : GH_SAMComponent + public class SAMAnalyticalAddResultsBySQL : GH_SAMVariableOutputParameterComponent { /// /// Gets the unique ID for this component. Do not change this ID after release. @@ -15,7 +19,7 @@ public class SAMAnalyticalAddResultsBySQL : GH_SAMComponent /// /// The latest version of this component /// - public override string LatestComponentVersion => "1.0.3"; + public override string LatestComponentVersion => "1.0.6"; /// /// Provides an Icon for the component. @@ -32,25 +36,52 @@ public SAMAnalyticalAddResultsBySQL() { } + public override void AppendAdditionalMenuItems(ToolStripDropDown menu) + { + base.AppendAdditionalMenuItems(menu); + + Menu_AppendSeparator(menu); + Menu_AppendItem(menu, "Go to Directory", Menu_GoToDirectory, Properties.Resources.SAM_Small, true, false); + } + + void Menu_GoToDirectory(object sender, EventArgs e) + { + MenuHelper.GoToFileDirectory(MenuHelper.GetVolatileString(this, "_sQLPath")); + } + /// /// Registers all the input parameters for this component. /// - protected override void RegisterInputParams(GH_InputParamManager inputParamManager) + protected override GH_SAMParam[] Inputs { - inputParamManager.AddParameter(new GooAnalyticalObjectParam(), "_analytical", "_analytical", "SAM Analytical Object such as AdjacencyCluster or AnalyticalModel", GH_ParamAccess.item); - inputParamManager.AddTextParameter("_sQLPath", "_sQLPath", "SQL File Path", GH_ParamAccess.item); - inputParamManager.AddBooleanParameter("_run", "_run", "Run", GH_ParamAccess.item, false); + get + { + List result = new List(); + result.Add(new GH_SAMParam(new GooAnalyticalObjectParam() { Name = "_analytical", NickName = "_analytical", Description = "SAM Analytical Object such as AdjacencyCluster or AnalyticalModel", Access = GH_ParamAccess.item }, ParamVisibility.Binding)); + result.Add(new GH_SAMParam(new global::Grasshopper.Kernel.Parameters.Param_String() { Name = "_sQLPath", NickName = "_sQLPath", Description = "SQL File Path", Access = GH_ParamAccess.item }, ParamVisibility.Binding)); + + global::Grasshopper.Kernel.Parameters.Param_Boolean param_Boolean = new global::Grasshopper.Kernel.Parameters.Param_Boolean() { Name = "_run", NickName = "_run", Description = "Run", Access = GH_ParamAccess.item }; + param_Boolean.SetPersistentData(false); + result.Add(new GH_SAMParam(param_Boolean, ParamVisibility.Binding)); + + return result.ToArray(); + } } /// /// Registers all the output parameters for this component. /// - protected override void RegisterOutputParams(GH_OutputParamManager outputParamManager) + protected override GH_SAMParam[] Outputs { - outputParamManager.AddParameter(new GooAnalyticalObjectParam(), "analytical", "analytical", "SAM Analytical Object such as AdjacencyCluster or AnalyticalModel", GH_ParamAccess.item); - outputParamManager.AddParameter(new GooResultParam(), "spaceSimulationResults", "spaceSimulationResults", "SAM Analytical SpaceSimulationResults", GH_ParamAccess.list); - outputParamManager.AddParameter(new GooResultParam(), "panelSimulationResults", "panelSimulationResults", "SAM Analytical PanelSimulationResults", GH_ParamAccess.list); - outputParamManager.AddBooleanParameter("Successful", "Successful", "Correctly saved?", GH_ParamAccess.item); + get + { + List result = new List(); + result.Add(new GH_SAMParam(new GooAnalyticalObjectParam() { Name = "analytical", NickName = "analytical", Description = "SAM Analytical Object such as AdjacencyCluster or AnalyticalModel", Access = GH_ParamAccess.item }, ParamVisibility.Binding)); + result.Add(new GH_SAMParam(new GooResultParam() { Name = "spaceSimulationResults", NickName = "spaceSimulationResults", Description = "SAM Analytical SpaceSimulationResults", Access = GH_ParamAccess.list }, ParamVisibility.Binding)); + result.Add(new GH_SAMParam(new GooResultParam() { Name = "panelSimulationResults", NickName = "panelSimulationResults", Description = "SAM Analytical panel simulation results (the SAM class is SurfaceSimulationResult; the output name is kept for compatibility)", Access = GH_ParamAccess.list }, ParamVisibility.Binding)); + result.Add(new GH_SAMParam(new global::Grasshopper.Kernel.Parameters.Param_Boolean() { Name = "successful", NickName = "successful", Description = "Correctly saved?", Access = GH_ParamAccess.item }, ParamVisibility.Binding)); + return result.ToArray(); + } } /// @@ -59,36 +90,49 @@ protected override void RegisterOutputParams(GH_OutputParamManager outputParamMa /// The DA object is used to retrieve from inputs and store in outputs. protected override void SolveInstance(IGH_DataAccess dataAccess) { - dataAccess.SetData(3, false); + int index = Params.IndexOfOutputParam("successful"); + if (index != -1) + { + dataAccess.SetData(index, false); + } bool run = false; - if (!dataAccess.GetData(2, ref run) || !run) + index = Params.IndexOfInputParam("_run"); + if (index == -1 || !dataAccess.GetData(index, ref run) || !run) return; IAnalyticalObject analyticalObject = null; - if (!dataAccess.GetData(0, ref analyticalObject) || analyticalObject == null) + index = Params.IndexOfInputParam("_analytical"); + if (index == -1 || !dataAccess.GetData(index, ref analyticalObject) || analyticalObject == null) { AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Invalid data"); return; } string path = null; - dataAccess.GetData(1, ref path); + index = Params.IndexOfInputParam("_sQLPath"); + if (index != -1) + { + dataAccess.GetData(index, ref path); + } List results = null; + List diagnostics = null; - if(!string.IsNullOrWhiteSpace(path) && System.IO.File.Exists(path)) + if (!string.IsNullOrWhiteSpace(path) && System.IO.File.Exists(path)) { if (analyticalObject is AdjacencyCluster) { AdjacencyCluster adjacencyCluster = new AdjacencyCluster((AdjacencyCluster)analyticalObject); - results = Analytical.OpenStudio.Modify.AddResults(adjacencyCluster, path); + results = Analytical.OpenStudio.Modify.AddResults(adjacencyCluster, path, out diagnostics); analyticalObject = adjacencyCluster; } else if (analyticalObject is AnalyticalModel) { - AdjacencyCluster adjacencyCluster = ((AnalyticalModel)analyticalObject).AdjacencyCluster; - results = Analytical.OpenStudio.Modify.AddResults(adjacencyCluster, path); + // Non-mutating convention: the source model's cluster is cloned before any + // result is attached (previously the original cluster was modified in place). + AdjacencyCluster adjacencyCluster = new AdjacencyCluster(((AnalyticalModel)analyticalObject).AdjacencyCluster); + results = Analytical.OpenStudio.Modify.AddResults(adjacencyCluster, path, out diagnostics); analyticalObject = new AnalyticalModel((AnalyticalModel)analyticalObject, adjacencyCluster); } @@ -99,11 +143,42 @@ protected override void SolveInstance(IGH_DataAccess dataAccess) analyticalObject = buildingModel; } } + else + { + AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, string.Format("SQL file not found: {0}", path)); + } + + if (diagnostics != null) + { + foreach (string diagnostic in diagnostics) + { + AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, diagnostic); + } + } + + index = Params.IndexOfOutputParam("analytical"); + if (index != -1) + { + dataAccess.SetData(index, analyticalObject); + } - dataAccess.SetData(0, analyticalObject); - dataAccess.SetDataList(1, results?.FindAll(x => x is SpaceSimulationResult).ConvertAll(x => new GooResult(x))); - dataAccess.SetDataList(2, results?.FindAll(x => x is SurfaceSimulationResult).ConvertAll(x => new GooResult(x))); - dataAccess.SetData(3, results != null && results.Count != 0); + index = Params.IndexOfOutputParam("spaceSimulationResults"); + if (index != -1) + { + dataAccess.SetDataList(index, results?.FindAll(x => x is SpaceSimulationResult).ConvertAll(x => new GooResult(x))); + } + + index = Params.IndexOfOutputParam("panelSimulationResults"); + if (index != -1) + { + dataAccess.SetDataList(index, results?.FindAll(x => x is SurfaceSimulationResult).ConvertAll(x => new GooResult(x))); + } + + index = Params.IndexOfOutputParam("successful"); + if (index != -1) + { + dataAccess.SetData(index, results != null && results.Count != 0); + } } } -} \ No newline at end of file +} diff --git a/Grasshopper/SAM.Analytical.Grasshopper.OpenStudio/Component/SAMAnalyticalToOpenStudio.cs b/Grasshopper/SAM.Analytical.Grasshopper.OpenStudio/Component/SAMAnalyticalToOpenStudio.cs new file mode 100644 index 0000000..919b640 --- /dev/null +++ b/Grasshopper/SAM.Analytical.Grasshopper.OpenStudio/Component/SAMAnalyticalToOpenStudio.cs @@ -0,0 +1,293 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using Grasshopper.Kernel; +using SAM.Core.Grasshopper; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace SAM.Analytical.Grasshopper.OpenStudio +{ + public class SAMAnalyticalToOpenStudio : GH_SAMAsyncComponent + { + /// + /// Gets the unique ID for this component. Do not change this ID after release. + /// + public override Guid ComponentGuid => new Guid("7f3a2c91-4b6e-4d28-9c5a-8e1f0b7d3a64"); + + /// + /// The latest version of this component + /// + public override string LatestComponentVersion => "1.3.1"; + + /// + /// Provides an Icon for the component. + /// + protected override System.Drawing.Bitmap Icon => Properties.Resources.SAM_OpenStudio; + + /// + /// Converts a SAM AnalyticalModel to an OpenStudio model (OSM + OSW) and optionally runs + /// the annual EnergyPlus Ideal Loads simulation through the OpenStudio CLI. Non-blocking + /// (C6): the simulation executes on a background task with cancellation; results are + /// harvested on the UI thread. Thin wrapper over SAM.Analytical.OpenStudio.Convert — + /// no conversion rules live here. Weather/design-day source precedence: explicit + /// _epwPath/ddyPath_ override the WeatherData and design days embedded in the model. + /// + public SAMAnalyticalToOpenStudio() + : base("SAMAnalytical.ToOpenStudio", "SAMAnalytical.ToOpenStudio", + "Converts SAM AnalyticalModel to OpenStudio model (OSM/OSW) and optionally runs the annual EnergyPlus Ideal Loads simulation (asynchronous, cancellable)", + "SAM", "OpenStudio") + { + } + + public override void AppendAdditionalMenuItems(ToolStripDropDown menu) + { + base.AppendAdditionalMenuItems(menu); + + Menu_AppendSeparator(menu); + Menu_AppendItem(menu, "Go to Directory", Menu_GoToDirectory, Properties.Resources.SAM_Small, true, false); + } + + void Menu_GoToDirectory(object sender, EventArgs e) + { + MenuHelper.GoToDirectory(MenuHelper.GetVolatileString(this, "_outputDirectory"), true); + } + + /// + /// Registers all the input parameters for this component. + /// + protected override GH_SAMParam[] Inputs + { + get + { + List result = new List(); + result.Add(new GH_SAMParam(new GooAnalyticalModelParam() { Name = "_analyticalModel", NickName = "_analyticalModel", Description = "SAM AnalyticalModel", Access = GH_ParamAccess.item }, ParamVisibility.Binding)); + result.Add(new GH_SAMParam(new global::Grasshopper.Kernel.Parameters.Param_String() { Name = "_epwPath", NickName = "_epwPath", Description = "EPW weather file path (optional — when empty the WeatherData embedded in the AnalyticalModel is used)", Access = GH_ParamAccess.item, Optional = true }, ParamVisibility.Binding)); + result.Add(new GH_SAMParam(new global::Grasshopper.Kernel.Parameters.Param_String() { Name = "_outputDirectory", NickName = "_outputDirectory", Description = "Directory for the OSM/OSW and the simulation run folder", Access = GH_ParamAccess.item }, ParamVisibility.Binding)); + + global::Grasshopper.Kernel.Parameters.Param_Boolean param_Boolean = new global::Grasshopper.Kernel.Parameters.Param_Boolean() { Name = "_run", NickName = "_run", Description = "True executes the OpenStudio CLI simulation; False converts and saves OSM/OSW only", Access = GH_ParamAccess.item }; + param_Boolean.SetPersistentData(false); + result.Add(new GH_SAMParam(param_Boolean, ParamVisibility.Binding)); + + result.Add(CreateCancelParam()); + + // Appended last on purpose: Grasshopper pairs archived inputs with registered + // inputs by position, so inserting ddyPath_ earlier would mis-wire existing + // documents (their _outputDirectory/_run sources would shift one position). + result.Add(new GH_SAMParam(new global::Grasshopper.Kernel.Parameters.Param_String() { Name = "ddyPath_", NickName = "ddyPath_", Description = "DDY design-day file path (optional — overrides the design days embedded in the AnalyticalModel)", Access = GH_ParamAccess.item, Optional = true }, ParamVisibility.Voluntary)); + + result.Add(new GH_SAMParam(new global::Grasshopper.Kernel.Parameters.Param_String() { Name = "measures_", NickName = "measures_", Description = "An optional list of OpenStudio measure directories (each containing measure.xml and measure.rb) applied to the OSM as OSW workflow steps, in order, with arguments at their measure defaults. Measures can be downloaded from the NREL Building Components Library (BCL) at https://bcl.nrel.gov/.", Access = GH_ParamAccess.list, Optional = true }, ParamVisibility.Voluntary)); + result.Add(new GH_SAMParam(new global::Grasshopper.Kernel.Parameters.Param_String() { Name = "add_str_", NickName = "add_str_", Description = "THIS OPTION IS JUST FOR ADVANCED USERS OF ENERGYPLUS. Complete EnergyPlus objects as single strings following the IDF format, written into the IDF verbatim through a generated EnergyPlus measure — for objects not currently supported by the conversion. An object that does not parse fails the run; invalid objects are never silently dropped.", Access = GH_ParamAccess.list, Optional = true }, ParamVisibility.Voluntary)); + + return result.ToArray(); + } + } + + /// + /// Registers all the output parameters for this component. + /// + protected override GH_SAMParam[] Outputs + { + get + { + List result = new List(); + result.Add(new GH_SAMParam(new global::Grasshopper.Kernel.Parameters.Param_String() { Name = "osmPath", NickName = "osmPath", Description = "Saved OpenStudio model path", Access = GH_ParamAccess.item }, ParamVisibility.Binding)); + result.Add(new GH_SAMParam(new global::Grasshopper.Kernel.Parameters.Param_String() { Name = "oswPath", NickName = "oswPath", Description = "Generated OpenStudio workflow path", Access = GH_ParamAccess.item }, ParamVisibility.Binding)); + result.Add(new GH_SAMParam(new global::Grasshopper.Kernel.Parameters.Param_String() { Name = "sqlPath", NickName = "sqlPath", Description = "EnergyPlus SQLite results path (after a run)", Access = GH_ParamAccess.item }, ParamVisibility.Binding)); + result.Add(new GH_SAMParam(new global::Grasshopper.Kernel.Parameters.Param_Number() { Name = "heating", NickName = "heating", Description = "Annual Ideal Loads heating energy [kWh]", Access = GH_ParamAccess.item }, ParamVisibility.Binding)); + result.Add(new GH_SAMParam(new global::Grasshopper.Kernel.Parameters.Param_Number() { Name = "cooling", NickName = "cooling", Description = "Annual Ideal Loads cooling energy [kWh]", Access = GH_ParamAccess.item }, ParamVisibility.Binding)); + result.Add(new GH_SAMParam(new global::Grasshopper.Kernel.Parameters.Param_String() { Name = "diagnostics", NickName = "diagnostics", Description = "Conversion and simulation diagnostics", Access = GH_ParamAccess.list }, ParamVisibility.Binding)); + result.Add(new GH_SAMParam(new global::Grasshopper.Kernel.Parameters.Param_Boolean() { Name = "successful", NickName = "successful", Description = "True when the conversion (and run, when requested) succeeded", Access = GH_ParamAccess.item }, ParamVisibility.Binding)); + return result.ToArray(); + } + } + + protected override string ComputeSignature(IGH_DataAccess dataAccess) + { + AnalyticalModel analyticalModel = null; + int index = Params.IndexOfInputParam("_analyticalModel"); + if (index == -1 || !dataAccess.GetData(index, ref analyticalModel) || analyticalModel == null) + { + AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Invalid _analyticalModel data"); + return null; + } + + string epwPath = null; + index = Params.IndexOfInputParam("_epwPath"); + if (index != -1) + { + dataAccess.GetData(index, ref epwPath); + } + + string outputDirectory = null; + index = Params.IndexOfInputParam("_outputDirectory"); + if (index == -1 || !dataAccess.GetData(index, ref outputDirectory) || string.IsNullOrWhiteSpace(outputDirectory)) + { + AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Invalid _outputDirectory data"); + return null; + } + + bool run = false; + index = Params.IndexOfInputParam("_run"); + if (index != -1) + { + dataAccess.GetData(index, ref run); + } + + string ddyPath = null; + index = Params.IndexOfInputParam("ddyPath_"); + if (index != -1) + { + dataAccess.GetData(index, ref ddyPath); + } + + List measures = ReadStringList(dataAccess, "measures_"); + List additionalIdfStrings = ReadStringList(dataAccess, "add_str_"); + + // Embedded weather/design-day content is part of the signature: changing it on the + // same AnalyticalModel reference (same Guid) must trigger a new conversion. + string embeddedFingerprint = Analytical.OpenStudio.Query.EmbeddedWeatherFingerprint(analyticalModel); + + return string.Format("{0:N}|{1}|{2}|{3}|{4}|{5}|{6}|{7}", analyticalModel.Guid, epwPath ?? string.Empty, outputDirectory, run, ddyPath ?? string.Empty, embeddedFingerprint ?? string.Empty, string.Join("|", measures), string.Join("|", additionalIdfStrings)); + } + + private List ReadStringList(IGH_DataAccess dataAccess, string name) + { + List result = new List(); + int index = Params.IndexOfInputParam(name); + if (index != -1) + { + List values = new List(); + if (dataAccess.GetDataList(index, values)) + { + foreach (string value in values) + { + result.Add(value ?? string.Empty); + } + } + } + + return result; + } + + protected override Task CreateTask(IGH_DataAccess dataAccess, CancellationToken cancellationToken) + { + AnalyticalModel analyticalModel = null; + dataAccess.GetData(Params.IndexOfInputParam("_analyticalModel"), ref analyticalModel); + + string epwPath = null; + dataAccess.GetData(Params.IndexOfInputParam("_epwPath"), ref epwPath); + + string outputDirectory = null; + dataAccess.GetData(Params.IndexOfInputParam("_outputDirectory"), ref outputDirectory); + + bool run = false; + dataAccess.GetData(Params.IndexOfInputParam("_run"), ref run); + + string ddyPath = null; + int index = Params.IndexOfInputParam("ddyPath_"); + if (index != -1) + { + dataAccess.GetData(index, ref ddyPath); + } + + Core.OpenStudio.OpenStudioConversionOptions openStudioConversionOptions = new Core.OpenStudio.OpenStudioConversionOptions(); + if (!string.IsNullOrWhiteSpace(ddyPath)) + { + openStudioConversionOptions.DdyPath = ddyPath; + } + + List measures = ReadStringList(dataAccess, "measures_"); + if (measures.Count > 0) + { + openStudioConversionOptions.MeasurePaths = measures; + } + + List additionalIdfStrings = ReadStringList(dataAccess, "add_str_"); + if (additionalIdfStrings.Count > 0) + { + openStudioConversionOptions.AdditionalIdfStrings = additionalIdfStrings; + } + + return Analytical.OpenStudio.Convert.ToOpenStudioAsync(analyticalModel, epwPath, outputDirectory, openStudioConversionOptions, null, run, null, cancellationToken); + } + + protected override void Harvest(Task task, IGH_DataAccess dataAccess) + { + if (task.IsFaulted) + { + AddRuntimeMessage(GH_RuntimeMessageLevel.Error, task.Exception?.GetBaseException().Message ?? "Simulation failed"); + return; + } + + Analytical.OpenStudio.OpenStudioConversionResult openStudioConversionResult = ((Task)task).Result; + if (openStudioConversionResult == null) + { + AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Conversion failed"); + return; + } + + using (openStudioConversionResult) + { + int index = Params.IndexOfOutputParam("osmPath"); + if (index != -1) + { + dataAccess.SetData(index, openStudioConversionResult.OsmPath); + } + + index = Params.IndexOfOutputParam("oswPath"); + if (index != -1) + { + dataAccess.SetData(index, openStudioConversionResult.OswPath); + } + + index = Params.IndexOfOutputParam("sqlPath"); + if (index != -1) + { + dataAccess.SetData(index, openStudioConversionResult.RunResult?.SqlPath); + } + + index = Params.IndexOfOutputParam("heating"); + if (index != -1 && openStudioConversionResult.Loads != null) + { + dataAccess.SetData(index, openStudioConversionResult.Loads.TotalHeating); + } + + index = Params.IndexOfOutputParam("cooling"); + if (index != -1 && openStudioConversionResult.Loads != null) + { + dataAccess.SetData(index, openStudioConversionResult.Loads.TotalCooling); + } + + index = Params.IndexOfOutputParam("diagnostics"); + if (index != -1) + { + List diagnostics = new List(); + foreach (Core.OpenStudio.OpenStudioDiagnostic openStudioDiagnostic in openStudioConversionResult.Diagnostics) + { + diagnostics.Add(openStudioDiagnostic.ToString()); + } + + dataAccess.SetDataList(index, diagnostics); + } + + index = Params.IndexOfOutputParam("successful"); + if (index != -1) + { + bool run = false; + int runIndex = Params.IndexOfInputParam("_run"); + if (runIndex != -1) + { + dataAccess.GetData(runIndex, ref run); + } + + bool successful = openStudioConversionResult.IsValid && (!run || (openStudioConversionResult.RunResult != null && openStudioConversionResult.RunResult.Success)); + dataAccess.SetData(index, successful); + } + } + } + } +} diff --git a/Grasshopper/SAM.Analytical.Grasshopper.OpenStudio/SAM.Analytical.Grasshopper.OpenStudio.csproj b/Grasshopper/SAM.Analytical.Grasshopper.OpenStudio/SAM.Analytical.Grasshopper.OpenStudio.csproj index a4f75fa..e62fac2 100644 --- a/Grasshopper/SAM.Analytical.Grasshopper.OpenStudio/SAM.Analytical.Grasshopper.OpenStudio.csproj +++ b/Grasshopper/SAM.Analytical.Grasshopper.OpenStudio/SAM.Analytical.Grasshopper.OpenStudio.csproj @@ -97,4 +97,35 @@ + + + + <_SAMDeployDir>$(APPDATA)\SAM\ + <_SAMNativeSubDir>runtimes\win-x64\native\ + + + <_SAMSQLiteManaged Include="@(RuntimeCopyLocalItems)" Condition="'%(RuntimeCopyLocalItems.NuGetPackageId)' == 'Stub.System.Data.SQLite.Core.NetStandard'" /> + <_SAMSQLiteNative Include="@(RuntimeTargetsCopyLocalItems)" Condition="'%(RuntimeTargetsCopyLocalItems.NuGetPackageId)' == 'Stub.System.Data.SQLite.Core.NetStandard' AND '%(RuntimeTargetsCopyLocalItems.RuntimeIdentifier)' == 'win-x64'" /> + + + + + + + + + \ No newline at end of file diff --git a/Grasshopper/SAM.Analytical.Grasshopper.OpenStudio/app.config b/Grasshopper/SAM.Analytical.Grasshopper.OpenStudio/app.config deleted file mode 100644 index 72259e8..0000000 --- a/Grasshopper/SAM.Analytical.Grasshopper.OpenStudio/app.config +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/README.md b/README.md index b67616c..474271e 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,12 @@ and process analytical building models for energy and environmental analysis. This repository provides **OpenStudio model generation and interoperability utilities** and is intended to be used alongside the SAM core libraries and related SAM-BIM modules. +Native SAM → OpenStudio conversion of the full non-HVAC `AnalyticalModel` (geometry, +constructions, schedules, internal gains, frames, weather/design days, Ideal Loads) with +cancellable asynchronous CLI execution and structured results extraction — see +[docs/openstudio-mvp-usage.md](docs/openstudio-mvp-usage.md) and +[docs/openstudio-analytical-completeness-status.md](docs/openstudio-analytical-completeness-status.md). + Welcome — and let’s keep the open-source journey going. 🤝 --- diff --git a/SAM_OpenStudio.sln b/SAM_OpenStudio.sln index a3f5425..30ace78 100644 --- a/SAM_OpenStudio.sln +++ b/SAM_OpenStudio.sln @@ -1,6 +1,7 @@ + Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 -VisualStudioVersion = 17.14.36804.6 d17.14 +VisualStudioVersion = 17.14.36804.6 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SAM_OpenStudio", "SAM_OpenStudio", "{4FDEDAD6-FCEC-4426-9A3B-086BF3C99CC0}" EndProject @@ -21,6 +22,16 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution .editorconfig = .editorconfig EndProjectSection EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{0AB3BF05-4346-4AA6-1389-037BE0695223}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SAM.Analytical.OpenStudio.Tests", "tests\SAM.Analytical.OpenStudio.Tests\SAM.Analytical.OpenStudio.Tests.csproj", "{45966997-BBBF-4272-B77F-86B401A1CE45}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "benchmark", "benchmark", "{09EED85C-BE3C-7566-DC0E-2E8E43466740}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SAM.Analytical.OpenStudio.Benchmark", "benchmark\SAM.Analytical.OpenStudio.Benchmark\SAM.Analytical.OpenStudio.Benchmark.csproj", "{E21DBAA0-8078-43F7-8A49-D9535DFD63D0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SAM.Analytical.OpenStudio.Benchmark.Tests", "benchmark\SAM.Analytical.OpenStudio.Benchmark.Tests\SAM.Analytical.OpenStudio.Benchmark.Tests.csproj", "{A845555D-DDC0-49C9-8BAD-ADEF4F5E7C6F}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -91,6 +102,42 @@ Global {CC834A2E-7DE2-A07E-9DE3-BC14FF5B43E8}.Release|x64.Build.0 = Release|x64 {CC834A2E-7DE2-A07E-9DE3-BC14FF5B43E8}.Release|x86.ActiveCfg = Release|x64 {CC834A2E-7DE2-A07E-9DE3-BC14FF5B43E8}.Release|x86.Build.0 = Release|x64 + {45966997-BBBF-4272-B77F-86B401A1CE45}.Debug|Any CPU.ActiveCfg = Debug|x64 + {45966997-BBBF-4272-B77F-86B401A1CE45}.Debug|Any CPU.Build.0 = Debug|x64 + {45966997-BBBF-4272-B77F-86B401A1CE45}.Debug|x64.ActiveCfg = Debug|x64 + {45966997-BBBF-4272-B77F-86B401A1CE45}.Debug|x64.Build.0 = Debug|x64 + {45966997-BBBF-4272-B77F-86B401A1CE45}.Debug|x86.ActiveCfg = Debug|x64 + {45966997-BBBF-4272-B77F-86B401A1CE45}.Debug|x86.Build.0 = Debug|x64 + {45966997-BBBF-4272-B77F-86B401A1CE45}.Release|Any CPU.ActiveCfg = Release|x64 + {45966997-BBBF-4272-B77F-86B401A1CE45}.Release|Any CPU.Build.0 = Release|x64 + {45966997-BBBF-4272-B77F-86B401A1CE45}.Release|x64.ActiveCfg = Release|x64 + {45966997-BBBF-4272-B77F-86B401A1CE45}.Release|x64.Build.0 = Release|x64 + {45966997-BBBF-4272-B77F-86B401A1CE45}.Release|x86.ActiveCfg = Release|x64 + {45966997-BBBF-4272-B77F-86B401A1CE45}.Release|x86.Build.0 = Release|x64 + {E21DBAA0-8078-43F7-8A49-D9535DFD63D0}.Debug|Any CPU.ActiveCfg = Debug|x64 + {E21DBAA0-8078-43F7-8A49-D9535DFD63D0}.Debug|Any CPU.Build.0 = Debug|x64 + {E21DBAA0-8078-43F7-8A49-D9535DFD63D0}.Debug|x64.ActiveCfg = Debug|x64 + {E21DBAA0-8078-43F7-8A49-D9535DFD63D0}.Debug|x64.Build.0 = Debug|x64 + {E21DBAA0-8078-43F7-8A49-D9535DFD63D0}.Debug|x86.ActiveCfg = Debug|x64 + {E21DBAA0-8078-43F7-8A49-D9535DFD63D0}.Debug|x86.Build.0 = Debug|x64 + {E21DBAA0-8078-43F7-8A49-D9535DFD63D0}.Release|Any CPU.ActiveCfg = Release|x64 + {E21DBAA0-8078-43F7-8A49-D9535DFD63D0}.Release|Any CPU.Build.0 = Release|x64 + {E21DBAA0-8078-43F7-8A49-D9535DFD63D0}.Release|x64.ActiveCfg = Release|x64 + {E21DBAA0-8078-43F7-8A49-D9535DFD63D0}.Release|x64.Build.0 = Release|x64 + {E21DBAA0-8078-43F7-8A49-D9535DFD63D0}.Release|x86.ActiveCfg = Release|x64 + {E21DBAA0-8078-43F7-8A49-D9535DFD63D0}.Release|x86.Build.0 = Release|x64 + {A845555D-DDC0-49C9-8BAD-ADEF4F5E7C6F}.Debug|Any CPU.ActiveCfg = Debug|x64 + {A845555D-DDC0-49C9-8BAD-ADEF4F5E7C6F}.Debug|Any CPU.Build.0 = Debug|x64 + {A845555D-DDC0-49C9-8BAD-ADEF4F5E7C6F}.Debug|x64.ActiveCfg = Debug|x64 + {A845555D-DDC0-49C9-8BAD-ADEF4F5E7C6F}.Debug|x64.Build.0 = Debug|x64 + {A845555D-DDC0-49C9-8BAD-ADEF4F5E7C6F}.Debug|x86.ActiveCfg = Debug|x64 + {A845555D-DDC0-49C9-8BAD-ADEF4F5E7C6F}.Debug|x86.Build.0 = Debug|x64 + {A845555D-DDC0-49C9-8BAD-ADEF4F5E7C6F}.Release|Any CPU.ActiveCfg = Release|x64 + {A845555D-DDC0-49C9-8BAD-ADEF4F5E7C6F}.Release|Any CPU.Build.0 = Release|x64 + {A845555D-DDC0-49C9-8BAD-ADEF4F5E7C6F}.Release|x64.ActiveCfg = Release|x64 + {A845555D-DDC0-49C9-8BAD-ADEF4F5E7C6F}.Release|x64.Build.0 = Release|x64 + {A845555D-DDC0-49C9-8BAD-ADEF4F5E7C6F}.Release|x86.ActiveCfg = Release|x64 + {A845555D-DDC0-49C9-8BAD-ADEF4F5E7C6F}.Release|x86.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -101,6 +148,9 @@ Global {CA21819C-6D5C-4CE8-839A-7291E878FD51} = {4FDEDAD6-FCEC-4426-9A3B-086BF3C99CC0} {47274C36-3147-45CC-9B48-F3C3A5C33C7D} = {4FDEDAD6-FCEC-4426-9A3B-086BF3C99CC0} {CC834A2E-7DE2-A07E-9DE3-BC14FF5B43E8} = {B365D5A7-F4F1-4C45-9565-5F6CFC1134A4} + {45966997-BBBF-4272-B77F-86B401A1CE45} = {0AB3BF05-4346-4AA6-1389-037BE0695223} + {E21DBAA0-8078-43F7-8A49-D9535DFD63D0} = {09EED85C-BE3C-7566-DC0E-2E8E43466740} + {A845555D-DDC0-49C9-8BAD-ADEF4F5E7C6F} = {09EED85C-BE3C-7566-DC0E-2E8E43466740} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {4E0308FF-C8D5-4700-951A-859CB9D4FD09} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/OpenStudioConversionContext.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/OpenStudioConversionContext.cs new file mode 100644 index 0000000..f729c1d --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/OpenStudioConversionContext.cs @@ -0,0 +1,223 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; + +namespace SAM.Analytical.OpenStudio +{ + /// + /// Shared state passed to every SAM → OpenStudio mapper: the source model, the target + /// OpenStudio model, options, caches keyed by SAM Guid (or cache key), and the diagnostics + /// list. A single context instance is used for one conversion; it prevents repeated + /// conversion, duplicate OpenStudio objects, unstable naming and lost warnings. + /// + public sealed class OpenStudioConversionContext + { + /// Source SAM analytical model. May be null only in unit tests of the contracts. + public AnalyticalModel Source { get; } + + /// Target OpenStudio model being populated. Never null. + public global::OpenStudio.Model Target { get; } + + /// Conversion options; never null. + public Core.OpenStudio.OpenStudioConversionOptions Options { get; } + + /// SAM Guid → OpenStudio object name traceability records. + public Core.OpenStudio.OpenStudioObjectMap References { get; } = new Core.OpenStudio.OpenStudioObjectMap(); + + /// SAM Guid → live OpenStudio object created for it. + public IDictionary ModelObjectMap { get; } = new Dictionary(); + + /// SAM Panel Guid → primary (first created) OpenStudio Surface for internal panel pairing. + public IDictionary PrimarySurfaceMap { get; } = new Dictionary(); + + /// Cache key (material Guid or Guid+direction) → OpenStudio material. + public IDictionary MaterialMap { get; } = new Dictionary(); + + /// Cache key (construction Guid + ":Forward"/":Reverse") → OpenStudio construction. + public IDictionary ConstructionMap { get; } = new Dictionary(); + + /// Cache key (profile Guid + ":" + ProfileType) → OpenStudio schedule cache. The same SAM profile reused under a different ProfileType produces a separate schedule with its own type limits and name. + public IDictionary ScheduleMap { get; } = new Dictionary(); + + /// Diagnostics accumulated during the conversion. + public IList Diagnostics { get; } = new List(); + + /// Translation statistics (source/created/skipped/unsupported counts); snapshotted onto the result. + public Core.OpenStudio.OpenStudioConversionStatistics Statistics { get; } = new Core.OpenStudio.OpenStudioConversionStatistics(); + + /// + /// Day-of-week offset of 1 Jan of the run calendar with Monday = 0 … Sunday = 6. + /// Day-composed (weekly) profiles are rotated by this offset so sub-profile 0 (Monday per + /// the SAM_LadybugTools ScheduleRuleset convention) lands on the first real Monday. + /// Default 0 (1 Jan treated as Monday) for weather-free conversions. + /// + public int FirstDayOfWeekOffset { get; set; } + + /// True when design days were imported into the target model (drives sizing-period enablement). + public bool DesignDaysImported { get; set; } + + /// + /// Which source the design days in the target model came from — the outcome of the + /// design-day step, not the intent: a DDY or embedded collection that yielded no usable + /// design day leaves this . + /// Set in lockstep with (last import wins; the route + /// never merges sources) and snapshotted onto the result for provenance reporting. + /// + public Core.OpenStudio.OpenStudioDesignDaySource DesignDaySource { get; set; } = Core.OpenStudio.OpenStudioDesignDaySource.None; + + /// + /// The effective EPW path for the run (OSW weather file), resolved by the weather step: + /// the explicit path when supplied and valid, otherwise the temp EPW exported from the + /// embedded AnalyticalModel WeatherData, otherwise null (no annual weather source). + /// + public string EpwPath { get; set; } + + /// Keys already used through in this conversion. + private readonly HashSet onceKeys = new HashSet(); + + /// Creates a conversion context. + /// Source SAM analytical model (null only in contract tests). + /// Target OpenStudio model; required. + /// Options; a default instance is used when null. + public OpenStudioConversionContext(AnalyticalModel analyticalModel, global::OpenStudio.Model model, Core.OpenStudio.OpenStudioConversionOptions openStudioConversionOptions = null) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + + Source = analyticalModel; + Target = model; + Options = openStudioConversionOptions ?? new Core.OpenStudio.OpenStudioConversionOptions(); + } + + /// True when at least one diagnostic has Error severity. + public bool HasErrors + { + get + { + foreach (Core.OpenStudio.OpenStudioDiagnostic openStudioDiagnostic in Diagnostics) + { + if (openStudioDiagnostic != null && openStudioDiagnostic.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error) + { + return true; + } + } + + return false; + } + } + + /// Adds a diagnostic, deriving SAM Guid and type from the given SAM object. + /// Stable diagnostic code, see . + /// Severity. + /// Human-readable description. + /// Related SAM object, when applicable. + /// Related OpenStudio object name, when applicable. + public void AddDiagnostic(string code, Core.OpenStudio.OpenStudioDiagnosticSeverity severity, string message, Core.SAMObject sAMObject = null, string openStudioObjectName = null) + { + // Lock: RunAsync reports from a worker thread while the caller may read. + lock (Diagnostics) + { + Diagnostics.Add(new Core.OpenStudio.OpenStudioDiagnostic(code, severity, message, sAMObject?.Guid, sAMObject?.GetType().Name, openStudioObjectName)); + + switch (severity) + { + case Core.OpenStudio.OpenStudioDiagnosticSeverity.Information: + Statistics.InformationCount++; + break; + + case Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning: + Statistics.WarningCount++; + break; + + case Core.OpenStudio.OpenStudioDiagnosticSeverity.Error: + Statistics.ErrorCount++; + break; + } + + if (code == Core.OpenStudio.OpenStudioDiagnosticCodes.InternalConditionUnsupportedParameter) + { + Statistics.UnsupportedObjects++; + } + } + } + + /// + /// True the first time the given key is seen in this conversion. Converters use it to + /// emit a per-source-object diagnostic exactly once when the same SAM object flows + /// through several cache paths (forward/reverse directions, per-thickness material + /// variants, opaque/fenestration usages). + /// + /// Stable key, conventionally "code:topic:guid"; null returns false. + public bool RegisterOnce(string key) + { + if (key == null) + { + return false; + } + + lock (onceKeys) + { + return onceKeys.Add(key); + } + } + + /// Records an explicitly skipped source object or load in the statistics. + public void RegisterSkip() + { + Statistics.SkippedObjects++; + } + + /// + /// Registers the OpenStudio object created for a SAM object in both the traceability map + /// and the live-object map. Returns false (and changes nothing) when either argument is + /// null or the SAM Guid is already registered — duplicate conversion is a programming + /// error surfaced by the caller. + /// + /// Source SAM object. + /// OpenStudio object created for it. + public bool RegisterModelObject(Core.SAMObject sAMObject, global::OpenStudio.ModelObject modelObject) + { + if (sAMObject == null || modelObject == null) + { + return false; + } + + bool result = References.TryAdd(new Core.OpenStudio.OpenStudioObjectReference(sAMObject.Guid, sAMObject.GetType().Name, modelObject.nameString())); + if (result) + { + ModelObjectMap[sAMObject.Guid] = modelObject; + Statistics.CreatedObjects++; + + // Round-trip identity: the deterministic object name carries only the first 8 + // hex characters of the Guid, so it cannot be inverted. Stamping the full + // identity into AdditionalProperties is the single point where every registered + // SAM object passes, and it is purely additive — OS:AdditionalProperties is a + // separate object, so no field, name or EnergyPlus input changes. + Core.OpenStudio.Modify.SetSAMIdentity(modelObject, sAMObject); + } + + return result; + } + + /// Gets the live OpenStudio object registered for a SAM Guid, typed. + /// Expected OpenStudio object type. + /// SAM object Guid. + /// The registered object when present and of type T. + public bool TryGetModelObject(Guid samGuid, out T modelObject) where T : global::OpenStudio.ModelObject + { + modelObject = null; + global::OpenStudio.ModelObject value; + if (!ModelObjectMap.TryGetValue(samGuid, out value)) + { + return false; + } + + modelObject = value as T; + return modelObject != null; + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/OpenStudioConversionResult.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/OpenStudioConversionResult.cs new file mode 100644 index 0000000..0def3ac --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/OpenStudioConversionResult.cs @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; + +namespace SAM.Analytical.OpenStudio +{ + /// + /// Immutable snapshot of a completed SAM → OpenStudio conversion: the produced model, file + /// paths, run outcome, diagnostics, translation statistics and the SAM Guid → OpenStudio + /// name map. Snapshotting means later mutation of the conversion context does not affect an + /// already created result. The result OWNS the OpenStudio model: dispose the result when the + /// model is no longer needed (native SWIG resources are released); do not use the model + /// afterwards. + /// + public sealed class OpenStudioConversionResult : IDisposable + { + /// The produced OpenStudio model (null when conversion could not start). Owned by this result — disposed with it. + public global::OpenStudio.Model Model { get; } + + /// Path of the saved OSM file, when saved. + public string OsmPath { get; internal set; } + + /// Path of the generated OSW workflow file, when generated. + public string OswPath { get; internal set; } + + /// Outcome of the simulation run, when one was executed. + public Core.OpenStudio.OpenStudioRunResult RunResult { get; internal set; } + + /// Annual Ideal Loads energy extracted from the run, when available. + public OpenStudioLoadSummary Loads { get; internal set; } + + /// Engine-neutral simulation result set (annual energies, peaks, unmet hours, gains, optional series), when extracted. + public OpenStudioSimulationResultSet Results { get; internal set; } + + /// Diagnostics recorded up to the moment this result was created. + public IReadOnlyList Diagnostics { get; } + + /// Translation statistics snapshot (source/created/skipped/unsupported counts). + public Core.OpenStudio.OpenStudioConversionStatistics Statistics { get; } + + /// SAM Guid → deterministic OpenStudio object name. + public IReadOnlyDictionary ObjectMap { get; } + + /// + /// The design-day basis the conversion actually established (explicit DDY, the design days + /// embedded in the AnalyticalModel, or none). Snapshotted from the context, so provenance + /// reporting records what the route did rather than what was supplied to it. + /// + public Core.OpenStudio.OpenStudioDesignDaySource DesignDaySource { get; } + + /// Creates a result snapshot from a conversion context. + /// Context to snapshot; required. + public OpenStudioConversionResult(OpenStudioConversionContext openStudioConversionContext) + { + if (openStudioConversionContext == null) + { + throw new ArgumentNullException(nameof(openStudioConversionContext)); + } + + Model = openStudioConversionContext.Target; + Diagnostics = new List(openStudioConversionContext.Diagnostics); + Statistics = openStudioConversionContext.Statistics.Snapshot(); + ObjectMap = openStudioConversionContext.References.ToNameDictionary(); + DesignDaySource = openStudioConversionContext.DesignDaySource; + } + + /// Releases the owned OpenStudio model's native resources. Idempotent. + public void Dispose() + { + Model?.Dispose(); + } + + /// + /// True when a model exists and no diagnostic has Error severity. Warnings do not + /// invalidate a result. + /// + public bool IsValid + { + get + { + if (Model == null) + { + return false; + } + + foreach (Core.OpenStudio.OpenStudioDiagnostic openStudioDiagnostic in Diagnostics) + { + if (openStudioDiagnostic != null && openStudioDiagnostic.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error) + { + return false; + } + } + + return true; + } + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/OpenStudioImportContext.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/OpenStudioImportContext.cs new file mode 100644 index 0000000..f2f2899 --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/OpenStudioImportContext.cs @@ -0,0 +1,316 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; + +namespace SAM.Analytical.OpenStudio +{ + /// + /// Shared state passed to every OpenStudio → SAM mapper: the source OpenStudio model, the + /// import options, the caches that keep one SAM object per OpenStudio source object, the + /// identity ledger that guarantees restored SAM Guids stay unique, and the diagnostics list. + /// One instance per import. + /// + /// The mirror image of , and deliberately a separate + /// class: the forward context is keyed by SAM Guid and owns a target OpenStudio model, the + /// reverse one is keyed by OpenStudio object name and owns nothing native. + /// + /// + public sealed class OpenStudioImportContext + { + /// Source OpenStudio model. Never null. NOT owned — the caller disposes it. + public global::OpenStudio.Model Source { get; } + + /// Import options; never null. + public Core.OpenStudio.OpenStudioImportOptions Options { get; } + + /// + /// Directory of the source OSM, when the import came from a path. Used to resolve a + /// weather file recorded relative to the model. Null for an in-memory model, where no + /// source directory exists. + /// + public string SourceDirectory { get; set; } + + /// Diagnostics accumulated during the import. + public IList Diagnostics { get; } = new List(); + + /// Import statistics (source/created/skipped/unsupported counts and severity tallies). + public Core.OpenStudio.OpenStudioConversionStatistics Statistics { get; } = new Core.OpenStudio.OpenStudioConversionStatistics(); + + /// OpenStudio material name → SAM material created for it. + public IDictionary MaterialMap { get; } = new Dictionary(); + + /// OpenStudio construction name → SAM opaque Construction created for it. + public IDictionary ConstructionMap { get; } = new Dictionary(); + + /// OpenStudio construction name → SAM ApertureConstruction created for it. + public IDictionary ApertureConstructionMap { get; } = new Dictionary(); + + /// OpenStudio schedule name → SAM Profile created for it. + public IDictionary ProfileMap { get; } = new Dictionary(); + + /// OpenStudio SpaceType name → SAM InternalCondition created for it. + public IDictionary InternalConditionMap { get; } = new Dictionary(); + + /// OpenStudio Surface name → SAM Panel created for it (both sides of a paired interzone surface map to the same panel). + public IDictionary PanelMap { get; } = new Dictionary(); + + /// OpenStudio Space name → SAM Space created for it. + public IDictionary SpaceMap { get; } = new Dictionary(); + + /// Keys already seen through . + private readonly HashSet onceKeys = new HashSet(); + + /// SAM Guids already issued or restored in this import; guards identity collisions. + private readonly HashSet usedGuids = new HashSet(); + + /// Creates an import context. + /// Source OpenStudio model; required. + /// Options; a default instance is used when null. + public OpenStudioImportContext(global::OpenStudio.Model model, Core.OpenStudio.OpenStudioImportOptions openStudioImportOptions = null) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + + Source = model; + Options = openStudioImportOptions ?? new Core.OpenStudio.OpenStudioImportOptions(); + } + + /// True when at least one diagnostic has Error severity. + public bool HasErrors + { + get + { + foreach (Core.OpenStudio.OpenStudioDiagnostic openStudioDiagnostic in Diagnostics) + { + if (openStudioDiagnostic != null && openStudioDiagnostic.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error) + { + return true; + } + } + + return false; + } + } + + /// + /// Adds a diagnostic naming the OpenStudio source object it refers to. + /// + /// Stable code, see . + /// Severity. + /// Human-readable description. + /// OpenStudio source object, when applicable; its name and handle are recorded. + /// SAM object produced for it, when one already exists. + public void AddDiagnostic(string code, Core.OpenStudio.OpenStudioDiagnosticSeverity severity, string message, global::OpenStudio.ModelObject modelObject = null, Core.SAMObject sAMObject = null) + { + AddDiagnostic(code, severity, message, OpenStudioObjectLabel(modelObject), sAMObject); + } + + /// + /// Adds a diagnostic naming an OpenStudio source object by label (used where no live + /// ModelObject is at hand, for example while parsing an OSW). + /// + /// Stable code, see . + /// Severity. + /// Human-readable description. + /// Source object label, when applicable. + /// SAM object produced for it, when one already exists. + public void AddDiagnostic(string code, Core.OpenStudio.OpenStudioDiagnosticSeverity severity, string message, string openStudioObjectName, Core.SAMObject sAMObject = null) + { + // Lock: an OSW import reports from the worker thread running the CLI while the + // caller may be reading the list. + lock (Diagnostics) + { + Diagnostics.Add(new Core.OpenStudio.OpenStudioDiagnostic(code, severity, message, sAMObject?.Guid, sAMObject?.GetType().Name, openStudioObjectName)); + + switch (severity) + { + case Core.OpenStudio.OpenStudioDiagnosticSeverity.Information: + Statistics.InformationCount++; + break; + + case Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning: + Statistics.WarningCount++; + break; + + case Core.OpenStudio.OpenStudioDiagnosticSeverity.Error: + Statistics.ErrorCount++; + break; + } + + if (IsUnsupportedCode(code)) + { + Statistics.UnsupportedObjects++; + } + } + } + + private static bool IsUnsupportedCode(string code) + { + switch (code) + { + case Core.OpenStudio.OpenStudioImportDiagnosticCodes.BoundaryConditionUnsupported: + case Core.OpenStudio.OpenStudioImportDiagnosticCodes.SubSurfaceUnsupported: + case Core.OpenStudio.OpenStudioImportDiagnosticCodes.MaterialUnsupported: + case Core.OpenStudio.OpenStudioImportDiagnosticCodes.ConstructionUnsupported: + case Core.OpenStudio.OpenStudioImportDiagnosticCodes.ScheduleUnsupported: + case Core.OpenStudio.OpenStudioImportDiagnosticCodes.LoadUnsupported: + case Core.OpenStudio.OpenStudioImportDiagnosticCodes.HvacUnsupported: + case Core.OpenStudio.OpenStudioImportDiagnosticCodes.SimulationSettingUnsupported: + return true; + } + + return false; + } + + /// + /// "<name> [<handle>]" for an OpenStudio object — the pair the audit requires + /// on every geometry diagnostic, because names are not unique across object types while + /// handles are. + /// + public static string OpenStudioObjectLabel(global::OpenStudio.ModelObject modelObject) + { + if (modelObject == null) + { + return null; + } + + string name; + try + { + name = modelObject.nameString(); + } + catch (Exception) + { + name = modelObject.GetType().Name; + } + + string handle; + try + { + // __str__ is the SWIG string conversion; UUID does not override ToString. + handle = modelObject.handle()?.__str__(); + } + catch (Exception) + { + handle = null; + } + + return string.IsNullOrWhiteSpace(handle) ? name : string.Format("{0} [{1}]", name, handle); + } + + /// + /// True the first time the given key is seen in this import. Converters use it to emit a + /// per-source-object diagnostic exactly once when the same OpenStudio object is reached + /// through several paths (both sides of an interzone pair, a construction shared by many + /// surfaces). + /// + /// Stable key, conventionally "code:topic:name"; null returns false. + public bool RegisterOnce(string key) + { + if (key == null) + { + return false; + } + + lock (onceKeys) + { + return onceKeys.Add(key); + } + } + + /// Records an explicitly skipped source object in the statistics. + public void RegisterSkip() + { + Statistics.SkippedObjects++; + } + + /// Records a created SAM object in the statistics. + public void RegisterCreated() + { + Statistics.CreatedObjects++; + } + + /// + /// Resolves the SAM Guid to use for the SAM object being created from + /// . + /// + /// The full Guid stamped in AdditionalProperties is restored when + /// is on, the + /// value parses, and it has not already been claimed by another object in this import. + /// Otherwise a fresh Guid is issued. A stamped-but-unusable Guid — malformed, empty, or a + /// duplicate — raises SAM-OSI-ID-001 rather than silently producing two SAM objects that + /// claim the same identity. A third-party OSM with no metadata takes the fresh-Guid path + /// with no diagnostic, which is the normal case. + /// + /// + /// The 8-character name suffix is never consulted here: it is 32 bits of a 128-bit Guid + /// and is only ever used for matching and diagnostics. + /// + /// + /// OpenStudio source object; null yields a fresh Guid. + /// SAM type name the identity must belong to; ignored when null. + /// The Guid to assign to the SAM object. Never . + public Guid ResolveGuid(global::OpenStudio.ModelObject modelObject, string expectedType = null) + { + if (modelObject == null || !Options.RestoreSAMIdentity) + { + return NewGuid(); + } + + Guid guid; + if (!Core.OpenStudio.Query.TryGetSAMGuid(modelObject, out guid)) + { + // Distinguish "no metadata at all" (normal, silent) from "metadata present but + // unusable" (reported): only the latter had an intent to preserve identity. + string raw; + if (Core.OpenStudio.Query.TryGetSAMFeature(modelObject, Core.OpenStudio.OpenStudioIdentityKeys.Guid, out raw)) + { + AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.IdentityCollision, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("SAM identity metadata '{0}' is not a valid Guid; a new SAM Guid was issued", raw), modelObject); + } + + return NewGuid(); + } + + if (expectedType != null) + { + string type; + if (Core.OpenStudio.Query.TryGetSAMType(modelObject, out type) && !string.Equals(type, expectedType, StringComparison.Ordinal)) + { + AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.IdentityCollision, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("SAM identity metadata declares type '{0}' but a {1} is being imported; a new SAM Guid was issued", type, expectedType), modelObject); + return NewGuid(); + } + } + + lock (usedGuids) + { + if (usedGuids.Add(guid)) + { + return guid; + } + } + + AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.IdentityCollision, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("SAM Guid {0} is claimed by more than one OpenStudio object; a new SAM Guid was issued for this one", guid), modelObject); + return NewGuid(); + } + + /// Issues a fresh SAM Guid and records it in the identity ledger. + private Guid NewGuid() + { + lock (usedGuids) + { + Guid guid; + do + { + guid = Guid.NewGuid(); + } + while (!usedGuids.Add(guid)); + + return guid; + } + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/OpenStudioImportResult.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/OpenStudioImportResult.cs new file mode 100644 index 0000000..738ee79 --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/OpenStudioImportResult.cs @@ -0,0 +1,166 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Collections.Generic; + +namespace SAM.Analytical.OpenStudio +{ + /// + /// Immutable snapshot of a completed OpenStudio → SAM import: the produced + /// , the source and resolved paths, diagnostics and statistics. + /// + /// Unlike , this type owns nothing native and is not + /// disposable: any OpenStudio model loaded from disk is disposed inside the import, before + /// the result is handed back. That is deliberate — a public result holding a live SWIG model + /// would tie the caller's lifetime to native memory for no benefit, and a Grasshopper + /// document would leak one model per solution. + /// + /// + public sealed class OpenStudioImportResult + { + /// The imported SAM analytical model; null when the import could not produce one. + public AnalyticalModel AnalyticalModel { get; } + + /// The path the caller supplied (OSM or OSW); null for an in-memory model. + public string SourcePath { get; } + + /// + /// The OSM actually converted: the input itself for an OSM, the resolved seed for a + /// non-executed OSW, or the final post-model-measure OSM for an executed workflow. + /// + public string ResolvedOsmPath { get; } + + /// OSM version recorded before version translation, when the translator reported it. + public string OpenStudioVersion { get; } + + /// Outcome of the OSW workflow run, when one was executed. + public Core.OpenStudio.OpenStudioRunResult RunResult { get; } + + /// Diagnostics recorded up to the moment this result was created. + public IReadOnlyList Diagnostics { get; } + + /// Import statistics snapshot. + public Core.OpenStudio.OpenStudioConversionStatistics Statistics { get; } + + /// Creates a result snapshot from an import context. + /// Context to snapshot; may be null when the import failed before a model was loaded. + /// The imported SAM model, when one was produced. + /// Caller-supplied path. + /// The OSM actually converted. + /// Pre-translation OSM version, when known. + /// Workflow run outcome, when one was executed. + public OpenStudioImportResult(OpenStudioImportContext openStudioImportContext, AnalyticalModel analyticalModel, string sourcePath = null, string resolvedOsmPath = null, string openStudioVersion = null, Core.OpenStudio.OpenStudioRunResult runResult = null) + { + AnalyticalModel = analyticalModel; + SourcePath = sourcePath; + ResolvedOsmPath = resolvedOsmPath; + OpenStudioVersion = openStudioVersion; + RunResult = runResult; + Diagnostics = openStudioImportContext == null + ? new List() + : new List(openStudioImportContext.Diagnostics); + Statistics = openStudioImportContext == null + ? new Core.OpenStudio.OpenStudioConversionStatistics() + : openStudioImportContext.Statistics.Snapshot(); + } + + /// + /// Creates a failure snapshot carrying diagnostics only — used when the import stops + /// before an OpenStudio model exists (bad path, unsupported extension, OSM load failure, + /// OSW without a seed). + /// + /// Diagnostics collected so far; may be null. + /// Caller-supplied path. + /// The OSM that was attempted, when one was identified. + /// Workflow run outcome, when one was executed. + public OpenStudioImportResult(IEnumerable diagnostics, string sourcePath = null, string resolvedOsmPath = null, Core.OpenStudio.OpenStudioRunResult runResult = null) + : this(diagnostics, null, sourcePath, resolvedOsmPath, null, runResult) + { + } + + /// + /// Creates a snapshot from an explicit diagnostic list rather than a context. Used when + /// an import spans two phases — workflow execution and OSM conversion — and the result + /// must carry the run outcome alongside the converted model. + /// + /// Diagnostics collected across both phases; may be null. + /// The imported SAM model, when one was produced. + /// Caller-supplied path. + /// The OSM actually converted. + /// Pre-translation OSM version, when known. + /// Workflow run outcome, when one was executed. + public OpenStudioImportResult(IEnumerable diagnostics, AnalyticalModel analyticalModel, string sourcePath, string resolvedOsmPath, string openStudioVersion, Core.OpenStudio.OpenStudioRunResult runResult) + { + AnalyticalModel = analyticalModel; + OpenStudioVersion = openStudioVersion; + SourcePath = sourcePath; + ResolvedOsmPath = resolvedOsmPath; + RunResult = runResult; + + List list = new List(); + if (diagnostics != null) + { + list.AddRange(diagnostics); + } + + Diagnostics = list; + + Core.OpenStudio.OpenStudioConversionStatistics statistics = new Core.OpenStudio.OpenStudioConversionStatistics(); + foreach (Core.OpenStudio.OpenStudioDiagnostic openStudioDiagnostic in list) + { + switch (openStudioDiagnostic?.Severity) + { + case Core.OpenStudio.OpenStudioDiagnosticSeverity.Information: + statistics.InformationCount++; + break; + + case Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning: + statistics.WarningCount++; + break; + + case Core.OpenStudio.OpenStudioDiagnosticSeverity.Error: + statistics.ErrorCount++; + break; + } + } + + Statistics = statistics; + } + + /// + /// True when a model was produced and no diagnostic has Error severity. Warnings — an + /// unpaired surface, an approximated material, a workflow that was not executed — do not + /// invalidate a result. + /// + public bool IsValid + { + get + { + if (AnalyticalModel == null) + { + return false; + } + + foreach (Core.OpenStudio.OpenStudioDiagnostic openStudioDiagnostic in Diagnostics) + { + if (openStudioDiagnostic != null && openStudioDiagnostic.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error) + { + return false; + } + } + + return true; + } + } + + /// + /// True when a model was produced at all, regardless of severity. An import that + /// recovered from errors still returns a usable — if incomplete — model, and the caller + /// must be able to tell that apart from having nothing. + /// + public bool Successful + { + get { return AnalyticalModel != null; } + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/OpenStudioLoadSummary.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/OpenStudioLoadSummary.cs new file mode 100644 index 0000000..f0dd945 --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/OpenStudioLoadSummary.cs @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Collections.Generic; + +namespace SAM.Analytical.OpenStudio +{ + /// + /// Annual Ideal Loads results extracted from the EnergyPlus SQLite output, in kWh. + /// Zone keys are the EnergyPlus report keys (the Ideal Loads air system names, uppercased — + /// one system per conditioned zone, so the entry count equals the conditioned-zone count). + /// Immutable. + /// + public sealed class OpenStudioLoadSummary + { + /// Annual total heating energy [kWh] over all conditioned zones. + public double TotalHeating { get; } + + /// Annual total cooling energy [kWh] over all conditioned zones. + public double TotalCooling { get; } + + /// Annual heating energy [kWh] per report key. + public IReadOnlyDictionary ZoneHeating { get; } + + /// Annual cooling energy [kWh] per report key. + public IReadOnlyDictionary ZoneCooling { get; } + + /// Creates an immutable load summary. + /// Annual heating energy [kWh] per report key. + /// Annual cooling energy [kWh] per report key. + public OpenStudioLoadSummary(IDictionary zoneHeating, IDictionary zoneCooling) + { + Dictionary heating = zoneHeating == null ? new Dictionary() : new Dictionary(zoneHeating); + Dictionary cooling = zoneCooling == null ? new Dictionary() : new Dictionary(zoneCooling); + + ZoneHeating = heating; + ZoneCooling = cooling; + + double totalHeating = 0; + foreach (KeyValuePair keyValuePair in heating) + { + totalHeating += keyValuePair.Value; + } + + double totalCooling = 0; + foreach (KeyValuePair keyValuePair in cooling) + { + totalCooling += keyValuePair.Value; + } + + TotalHeating = totalHeating; + TotalCooling = totalCooling; + } + + /// True when both totals are finite, non-negative numbers. + public bool IsFinite + { + get + { + return !double.IsNaN(TotalHeating) && !double.IsInfinity(TotalHeating) && TotalHeating >= 0 + && !double.IsNaN(TotalCooling) && !double.IsInfinity(TotalCooling) && TotalCooling >= 0; + } + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/OpenStudioSimulationResultSet.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/OpenStudioSimulationResultSet.cs new file mode 100644 index 0000000..d548757 --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/OpenStudioSimulationResultSet.cs @@ -0,0 +1,314 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Collections.Generic; + +namespace SAM.Analytical.OpenStudio +{ + /// + /// Engine-neutral simulation result set extracted from one EnergyPlus run (C5). All annual + /// energies are kWh over the weather RunPeriod only (sizing periods excluded), peak loads + /// are kW with their hour-of-year index, unmet hours are hours, gains are annual kWh per + /// category. All per-zone dictionaries share ONE zone identity: the Ideal Loads system + /// report key (zone-level and enclosure variables are remapped onto it by their shared SAM + /// Guid suffix during extraction). The SAM Guid ↔ OpenStudio identity lives on the + /// conversion result's ObjectMap. Zone temperature/operative/humidity series are populated + /// only when requested (OpenStudioRunOptions.ExtractTimeSeries). Immutable. + /// + public sealed class OpenStudioSimulationResultSet + { + /// + /// Zone sizing outcomes read from the SQL ZoneSizes table — one entry per zone and load + /// type, produced by the DESIGN-DAY sizing periods. Empty when the run performed no sizing (or + /// reported none), never null. Keyed by the EnergyPlus ThermalZone name, unlike the annual + /// dictionaries above which key on the Ideal Loads system name: the sizing table is written by + /// the zone sizing calculation, not by a system output variable. Ordered deterministically by + /// . + /// + public IReadOnlyList ZoneSizing { get; } + + /// Annual heating energy per zone key [kWh]. + public IReadOnlyDictionary AnnualHeatingEnergy { get; } + + /// Annual cooling energy per zone key [kWh]. + public IReadOnlyDictionary AnnualCoolingEnergy { get; } + + /// Peak heating load per zone key [kW] (max hour-average power over the weather run). + public IReadOnlyDictionary PeakHeatingLoad { get; } + + /// Peak cooling load per zone key [kW]. + public IReadOnlyDictionary PeakCoolingLoad { get; } + + /// Hour-of-year (0-based) of the heating peak per zone key. + public IReadOnlyDictionary PeakHeatingHour { get; } + + /// Hour-of-year (0-based) of the cooling peak per zone key. + public IReadOnlyDictionary PeakCoolingHour { get; } + + /// Building-level (coincident) peak heating load [kW] and its hour-of-year. + public double PeakHeatingLoadTotal { get; } + + /// Hour-of-year of the building-level heating peak. + public int PeakHeatingHourTotal { get; } + + /// Building-level (coincident) peak cooling load [kW] and its hour-of-year. + public double PeakCoolingLoadTotal { get; } + + /// Hour-of-year of the building-level cooling peak. + public int PeakCoolingHourTotal { get; } + + /// Heating setpoint not-met hours per zone key [h]. + public IReadOnlyDictionary UnmetHeatingHours { get; } + + /// Cooling setpoint not-met hours per zone key [h]. + public IReadOnlyDictionary UnmetCoolingHours { get; } + + /// Annual people gains per zone key [kWh]. + public IReadOnlyDictionary PeopleGains { get; } + + /// Annual lighting gains per zone key [kWh]. + public IReadOnlyDictionary LightingGains { get; } + + /// Annual electric equipment gains per zone key [kWh]. + public IReadOnlyDictionary EquipmentGains { get; } + + /// Annual transmitted window solar gains per zone key [kWh]. + public IReadOnlyDictionary WindowSolarGains { get; } + + /// Annual net infiltration gains (gain − loss) per zone key [kWh]. + public IReadOnlyDictionary InfiltrationGains { get; } + + /// Annual outdoor-air sensible heating energy per zone key [kWh]. + public IReadOnlyDictionary VentilationHeatingEnergy { get; } + + /// Annual outdoor-air sensible cooling energy per zone key [kWh]. + public IReadOnlyDictionary VentilationCoolingEnergy { get; } + + /// Hourly zone mean air temperature series per zone key [°C]; null when series were not requested. + public IReadOnlyDictionary TemperatureSeries { get; } + + /// Hourly zone operative temperature series per zone key [°C]; null when series were not requested. + public IReadOnlyDictionary OperativeTemperatureSeries { get; } + + /// Hourly zone relative humidity series per zone key [%]; null when series were not requested. + public IReadOnlyDictionary RelativeHumiditySeries { get; } + + /// CLI wall-clock runtime [s]. + public double RuntimeSeconds { get; } + + /// EnergyPlus warning count (eplusout.err). + public int WarningCount { get; } + + /// EnergyPlus severe error count. + public int SevereCount { get; } + + /// EnergyPlus fatal error count. + public int FatalCount { get; } + + /// + /// Creates an immutable result set with no zone sizing data. Null dictionaries become empty; null + /// series stay null. + /// + /// + /// This is the ORIGINAL signature, kept exactly as it was and delegating to the overload that + /// takes zone sizing. Adding zone sizing as an optional parameter on the original constructor + /// instead would preserve source compatibility but BREAK BINARY compatibility: the 26-argument + /// constructor would no longer exist in metadata, so a Grasshopper or third-party assembly + /// compiled against it would throw at run time. Two + /// explicit overloads keep both forms callable. + /// + public OpenStudioSimulationResultSet( + IReadOnlyDictionary annualHeatingEnergy, + IReadOnlyDictionary annualCoolingEnergy, + IReadOnlyDictionary peakHeatingLoad, + IReadOnlyDictionary peakCoolingLoad, + IReadOnlyDictionary peakHeatingHour, + IReadOnlyDictionary peakCoolingHour, + double peakHeatingLoadTotal, + int peakHeatingHourTotal, + double peakCoolingLoadTotal, + int peakCoolingHourTotal, + IReadOnlyDictionary unmetHeatingHours, + IReadOnlyDictionary unmetCoolingHours, + IReadOnlyDictionary peopleGains, + IReadOnlyDictionary lightingGains, + IReadOnlyDictionary equipmentGains, + IReadOnlyDictionary windowSolarGains, + IReadOnlyDictionary infiltrationGains, + IReadOnlyDictionary ventilationHeatingEnergy, + IReadOnlyDictionary ventilationCoolingEnergy, + IReadOnlyDictionary temperatureSeries, + IReadOnlyDictionary operativeTemperatureSeries, + IReadOnlyDictionary relativeHumiditySeries, + double runtimeSeconds, + int warningCount, + int severeCount, + int fatalCount) + : this( + annualHeatingEnergy, + annualCoolingEnergy, + peakHeatingLoad, + peakCoolingLoad, + peakHeatingHour, + peakCoolingHour, + peakHeatingLoadTotal, + peakHeatingHourTotal, + peakCoolingLoadTotal, + peakCoolingHourTotal, + unmetHeatingHours, + unmetCoolingHours, + peopleGains, + lightingGains, + equipmentGains, + windowSolarGains, + infiltrationGains, + ventilationHeatingEnergy, + ventilationCoolingEnergy, + temperatureSeries, + operativeTemperatureSeries, + relativeHumiditySeries, + runtimeSeconds, + warningCount, + severeCount, + fatalCount, + null) + { + } + + /// + /// Creates an immutable result set including zone sizing results. Null dictionaries become empty; + /// null series stay null; null zone sizing becomes an empty list. + /// + public OpenStudioSimulationResultSet( + IReadOnlyDictionary annualHeatingEnergy, + IReadOnlyDictionary annualCoolingEnergy, + IReadOnlyDictionary peakHeatingLoad, + IReadOnlyDictionary peakCoolingLoad, + IReadOnlyDictionary peakHeatingHour, + IReadOnlyDictionary peakCoolingHour, + double peakHeatingLoadTotal, + int peakHeatingHourTotal, + double peakCoolingLoadTotal, + int peakCoolingHourTotal, + IReadOnlyDictionary unmetHeatingHours, + IReadOnlyDictionary unmetCoolingHours, + IReadOnlyDictionary peopleGains, + IReadOnlyDictionary lightingGains, + IReadOnlyDictionary equipmentGains, + IReadOnlyDictionary windowSolarGains, + IReadOnlyDictionary infiltrationGains, + IReadOnlyDictionary ventilationHeatingEnergy, + IReadOnlyDictionary ventilationCoolingEnergy, + IReadOnlyDictionary temperatureSeries, + IReadOnlyDictionary operativeTemperatureSeries, + IReadOnlyDictionary relativeHumiditySeries, + double runtimeSeconds, + int warningCount, + int severeCount, + int fatalCount, + IReadOnlyList zoneSizing) + { + ZoneSizing = Copy(zoneSizing); + AnnualHeatingEnergy = Copy(annualHeatingEnergy); + AnnualCoolingEnergy = Copy(annualCoolingEnergy); + PeakHeatingLoad = Copy(peakHeatingLoad); + PeakCoolingLoad = Copy(peakCoolingLoad); + PeakHeatingHour = Copy(peakHeatingHour); + PeakCoolingHour = Copy(peakCoolingHour); + PeakHeatingLoadTotal = peakHeatingLoadTotal; + PeakHeatingHourTotal = peakHeatingHourTotal; + PeakCoolingLoadTotal = peakCoolingLoadTotal; + PeakCoolingHourTotal = peakCoolingHourTotal; + UnmetHeatingHours = Copy(unmetHeatingHours); + UnmetCoolingHours = Copy(unmetCoolingHours); + PeopleGains = Copy(peopleGains); + LightingGains = Copy(lightingGains); + EquipmentGains = Copy(equipmentGains); + WindowSolarGains = Copy(windowSolarGains); + InfiltrationGains = Copy(infiltrationGains); + VentilationHeatingEnergy = Copy(ventilationHeatingEnergy); + VentilationCoolingEnergy = Copy(ventilationCoolingEnergy); + TemperatureSeries = temperatureSeries == null ? null : Copy(temperatureSeries); + OperativeTemperatureSeries = operativeTemperatureSeries == null ? null : Copy(operativeTemperatureSeries); + RelativeHumiditySeries = relativeHumiditySeries == null ? null : Copy(relativeHumiditySeries); + RuntimeSeconds = runtimeSeconds; + WarningCount = warningCount; + SevereCount = severeCount; + FatalCount = fatalCount; + } + + /// Total annual heating energy over all zones [kWh]. + public double TotalAnnualHeating + { + get { return Sum(AnnualHeatingEnergy); } + } + + /// Total annual cooling energy over all zones [kWh]. + public double TotalAnnualCooling + { + get { return Sum(AnnualCoolingEnergy); } + } + + /// + /// Defensive copy in a TOTAL, input-order-independent order, by + /// . Null entries are dropped. + /// + /// + /// The ordering is load-bearing, not decoration. Two rows sharing a zone and load type have the + /// same , and a caller that supplies no source index + /// leaves them sharing that too; any comparison that reported them equal would leave their order + /// to , which is NOT stable, so the row a consumer + /// treats as "first" would flip with the input order. The signature therefore also spans the + /// payload: entries compare equal only when genuinely indistinguishable. + /// + private static List Copy(IReadOnlyList source) + { + List result = new List(); + if (source != null) + { + foreach (OpenStudioZoneSizingResult zoneSizingResult in source) + { + if (zoneSizingResult != null) + { + result.Add(zoneSizingResult); + } + } + } + + result.Sort((left, right) => string.CompareOrdinal(left.SortSignature, right.SortSignature)); + return result; + } + + private static Dictionary Copy(IReadOnlyDictionary source) + { + return source == null ? new Dictionary() : new Dictionary(System.Linq.Enumerable.ToDictionary(source, x => x.Key, x => x.Value)); + } + + private static Dictionary Copy(IReadOnlyDictionary source) + { + return source == null ? new Dictionary() : new Dictionary(System.Linq.Enumerable.ToDictionary(source, x => x.Key, x => x.Value)); + } + + private static Dictionary Copy(IReadOnlyDictionary source) + { + Dictionary result = new Dictionary(); + foreach (KeyValuePair keyValuePair in source) + { + result[keyValuePair.Key] = keyValuePair.Value == null ? null : (double[])keyValuePair.Value.Clone(); + } + + return result; + } + + private static double Sum(IReadOnlyDictionary source) + { + double result = 0; + foreach (KeyValuePair keyValuePair in source) + { + result += keyValuePair.Value; + } + + return result; + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/OpenStudioSimulationRunner.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/OpenStudioSimulationRunner.cs new file mode 100644 index 0000000..bc86829 --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/OpenStudioSimulationRunner.cs @@ -0,0 +1,1499 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace SAM.Analytical.OpenStudio +{ + /// + /// Saves the converted model (OSM), generates a minimal OSW workflow, executes the OpenStudio + /// CLI (discovered per plan §11.2), parses eplusout.err, discovers the SQLite results file and + /// extracts annual Ideal Loads energy through the SQL layer. Requires no Rhino/Grasshopper. + /// C6: cancellation tokens share the timeout's Job-Object tree-kill path, RunAsync executes + /// off the caller thread, runs execute in unique GUID subdirectories by default (an + /// in-progress lock file guards non-unique directories), and progress stages are reported + /// through IProgress. + /// + public static class OpenStudioSimulationRunner + { + /// + /// Asynchronous wrapper over : + /// the full save → OSW → CLI → parse pipeline executes on a worker thread; cancellation + /// terminates the whole CLI/EnergyPlus process tree. + /// + public static Task RunAsync(OpenStudioConversionContext openStudioConversionContext, string epwPath, string outputDirectory, Core.OpenStudio.OpenStudioRunOptions openStudioRunOptions = null, bool execute = true, System.IProgress progress = null, CancellationToken cancellationToken = default(CancellationToken)) + { + return Task.Run(() => Run(openStudioConversionContext, epwPath, outputDirectory, openStudioRunOptions, execute, progress, cancellationToken), cancellationToken); + } + + /// + /// Runs the full save → OSW → CLI → parse pipeline for a converted context and returns + /// the result snapshot including and + /// . All failures are surfaced as SAM-OS-RUN-001 / + /// SAM-OS-EPLUS-001 diagnostics — never silently. + /// + /// Converted context (weather and settings already applied). + /// EPW weather file path (referenced by the OSW). + /// Directory for OSM/OSW and the run folder. + /// Run options; defaults when null. + /// False saves the OSM/OSW without launching the CLI (RunResult stays null). + /// Optional stage progress sink. + /// Cancellation; kills the CLI/EnergyPlus process tree when triggered. + /// Result snapshot with paths, run outcome and loads. + public static OpenStudioConversionResult Run(OpenStudioConversionContext openStudioConversionContext, string epwPath, string outputDirectory, Core.OpenStudio.OpenStudioRunOptions openStudioRunOptions = null, bool execute = true, System.IProgress progress = null, CancellationToken cancellationToken = default(CancellationToken)) + { + if (openStudioConversionContext == null) + { + return null; + } + + Core.OpenStudio.OpenStudioRunOptions runOptions = openStudioRunOptions ?? new Core.OpenStudio.OpenStudioRunOptions(); + string directory = runOptions.RunDirectory ?? outputDirectory; + + if (string.IsNullOrWhiteSpace(directory)) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.RunCliFailed, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "No output directory was provided for the simulation run"); + return new OpenStudioConversionResult(openStudioConversionContext); + } + + if (runOptions.UseUniqueRunDirectory) + { + directory = Path.Combine(directory, "SAM_OpenStudio_" + System.Guid.NewGuid().ToString("N").Substring(0, 8)); + } + + Directory.CreateDirectory(directory); + + // Non-unique directories: in-progress guard (a stale lock from a crashed run is + // honoured — never overwritten) plus deterministic cleanup of the old run folder. + string lockPath = null; + FileStream lockStream = null; + if (!runOptions.UseUniqueRunDirectory) + { + lockPath = Path.Combine(directory, "sam_openstudio_run.lock"); + try + { + lockStream = new FileStream(lockPath, FileMode.CreateNew, FileAccess.Write, FileShare.None); + } + catch (IOException) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.RunCliFailed, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("Another run is in progress in {0} (lock file present); use unique run directories for concurrent runs", directory)); + return new OpenStudioConversionResult(openStudioConversionContext); + } + } + + try + { + return RunInDirectory(openStudioConversionContext, epwPath, directory, runOptions, execute, progress, cancellationToken); + } + finally + { + if (lockStream != null) + { + lockStream.Dispose(); + try + { + File.Delete(lockPath); + } + catch (System.Exception) + { + // lock cleanup is best effort + } + } + } + } + + private static OpenStudioConversionResult RunInDirectory(OpenStudioConversionContext openStudioConversionContext, string epwPath, string directory, Core.OpenStudio.OpenStudioRunOptions runOptions, bool execute, System.IProgress progress, CancellationToken cancellationToken) + { + string oldRunDirectory = Path.Combine(directory, "run"); + if (Directory.Exists(oldRunDirectory)) + { + try + { + Directory.Delete(oldRunDirectory, true); + } + catch (System.Exception) + { + // a leftover run folder must not fail the new run + } + } + + string modelName = Core.OpenStudio.Query.SanitizeName(openStudioConversionContext.Source?.Name); + if (string.IsNullOrWhiteSpace(modelName)) + { + modelName = "SAM_Model"; + } + + string osmPath = Path.Combine(directory, modelName + ".osm"); + string oswPath = Path.Combine(directory, modelName + ".osw"); + + progress?.Report(new Core.OpenStudio.OpenStudioSimulationProgress(Core.OpenStudio.OpenStudioSimulationStage.SavingOsm, osmPath)); + if (!openStudioConversionContext.Target.save(global::OpenStudio.OpenStudioUtilitiesCore.toPath(osmPath), true)) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.RunCliFailed, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("The OSM could not be saved to {0}", osmPath)); + return new OpenStudioConversionResult(openStudioConversionContext); + } + + progress?.Report(new Core.OpenStudio.OpenStudioSimulationProgress(Core.OpenStudio.OpenStudioSimulationStage.WritingOsw, oswPath)); + + // OpenStudio resolves weather_file relative to the OSW, and the OSW lives in the run + // directory — a Guid subdirectory by default — not in the caller's working directory. + // A relative EPW path is therefore made absolute, as the standalone OSW writer does; + // an absent weather source (conversion-only) still writes an empty entry. + string weatherFile = string.IsNullOrWhiteSpace(epwPath) ? string.Empty : Path.GetFullPath(epwPath).Replace('\\', '/'); + WriteWorkflow(openStudioConversionContext, oswPath, Path.GetFileName(osmPath), weatherFile, directory); + + OpenStudioConversionResult result; + + if (!execute) + { + progress?.Report(new Core.OpenStudio.OpenStudioSimulationProgress(Core.OpenStudio.OpenStudioSimulationStage.Complete, "Saved without execution")); + result = new OpenStudioConversionResult(openStudioConversionContext); + result.OsmPath = osmPath; + result.OswPath = oswPath; + return result; + } + + if (openStudioConversionContext.HasErrors) + { + // Never simulate a model whose conversion already failed — the CLI would burn + // minutes on a model known to be invalid (review P3-08). The OSM/OSW stay on + // disk for inspection. + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.RunCliFailed, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "Simulation not executed: the conversion reported errors; the OSM/OSW were saved for inspection"); + result = new OpenStudioConversionResult(openStudioConversionContext); + result.OsmPath = osmPath; + result.OswPath = oswPath; + return result; + } + + if (cancellationToken.IsCancellationRequested) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.RunCliFailed, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "Simulation cancelled before the CLI was started"); + result = new OpenStudioConversionResult(openStudioConversionContext); + result.OsmPath = osmPath; + result.OswPath = oswPath; + return result; + } + + string cliPath = Core.OpenStudio.Query.OpenStudioCliPath(runOptions.CliPath); + if (cliPath == null) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.RunCliFailed, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "openstudio.exe was not found (searched explicit path, PATH, direct installations and the ladybug_tools bundle)"); + result = new OpenStudioConversionResult(openStudioConversionContext); + result.OsmPath = osmPath; + result.OswPath = oswPath; + return result; + } + + progress?.Report(new Core.OpenStudio.OpenStudioSimulationProgress(Core.OpenStudio.OpenStudioSimulationStage.RunningCli, cliPath)); + + int exitCode; + bool cancelled; + Stopwatch stopwatch = Stopwatch.StartNew(); + string output = ExecuteCli(cliPath, oswPath, directory, runOptions.TimeoutSeconds, cancellationToken, out exitCode, out cancelled); + stopwatch.Stop(); + double runtimeSeconds = stopwatch.Elapsed.TotalSeconds; + + if (cancelled) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.RunCliFailed, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "Simulation cancelled; the CLI/EnergyPlus process tree was terminated"); + } + + string runDirectory = Path.Combine(directory, "run"); + string errorFilePath = Path.Combine(runDirectory, "eplusout.err"); + string sqlPath = Path.Combine(runDirectory, "eplusout.sql"); + + List severeErrors = new List(); + List fatalErrors = new List(); + int warningCount = 0; + if (File.Exists(errorFilePath)) + { + string[] errorLines; + try + { + // After a timeout kill the err file can still be locked by the dying + // process or be partially written — parsing is best effort. + errorLines = File.ReadAllLines(errorFilePath); + } + catch (System.Exception) + { + errorLines = null; + } + + if (errorLines != null) + { + foreach (string line in errorLines) + { + if (line.Contains("** Severe")) + { + severeErrors.Add(line.Trim()); + } + else if (line.Contains("** Fatal") || line.Contains("** Fatal")) + { + fatalErrors.Add(line.Trim()); + } + else if (line.Contains("** Warning")) + { + warningCount++; + } + } + } + } + + bool sqlExists = File.Exists(sqlPath); + bool success = !cancelled && exitCode == 0 && fatalErrors.Count == 0 && sqlExists; + + if (!success && !cancelled) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.RunCliFailed, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("OpenStudio CLI run failed (exit code {0}, SQL {1}, {2} fatal error(s)). Output tail: {3}", exitCode, sqlExists ? "present" : "missing", fatalErrors.Count, Tail(output, 500))); + } + + int severeCount = 0; + foreach (string severeError in severeErrors) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.EnergyPlusSevereError, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, severeError); + severeCount++; + if (severeCount >= 10) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.EnergyPlusSevereError, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("... {0} further severe errors omitted", severeErrors.Count - severeCount)); + break; + } + } + + OpenStudioLoadSummary loadSummary = null; + OpenStudioSimulationResultSet resultSet = null; + if (success) + { + progress?.Report(new Core.OpenStudio.OpenStudioSimulationProgress(Core.OpenStudio.OpenStudioSimulationStage.ReadingResults, sqlPath)); + loadSummary = ExtractLoads(sqlPath, out string failureDetail); + if (loadSummary == null) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.RunCliFailed, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("Ideal Loads results could not be extracted from the SQLite output — {0}", failureDetail)); + success = false; + } + else + { + // EnergyPlus ran and the file is readable, but no zone reported Ideal Loads. + // Legitimate for a model with no conditioned zones, so not an error — but it + // must never be silently indistinguishable from a genuine zero-load result. + if (loadSummary.ZoneHeating.Count == 0 && loadSummary.ZoneCooling.Count == 0) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.RunCliFailed, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "The SQLite output was read successfully but contains no Zone Ideal Loads variables for any zone — check that at least one zone is conditioned"); + } + + resultSet = ExtractResultSet(sqlPath, loadSummary, runOptions.ExtractTimeSeries, runtimeSeconds, warningCount, severeErrors.Count, fatalErrors.Count); + if (resultSet == null) + { + // Previously a silent null: the caller saw Results == null with nothing + // said about why. + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.RunCliFailed, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "Annual Ideal Loads were extracted but the detailed result set (peaks, unmet hours, gains) could not be built from the SQLite output"); + } + } + } + + progress?.Report(new Core.OpenStudio.OpenStudioSimulationProgress(Core.OpenStudio.OpenStudioSimulationStage.Complete, cancelled ? "Cancelled" : success ? "Success" : "Failed")); + + result = new OpenStudioConversionResult(openStudioConversionContext); + result.OsmPath = osmPath; + result.OswPath = oswPath; + result.RunResult = new Core.OpenStudio.OpenStudioRunResult(success, exitCode, osmPath, oswPath, sqlExists ? sqlPath : null, File.Exists(errorFilePath) ? errorFilePath : null, severeErrors, fatalErrors); + result.Loads = loadSummary; + result.Results = resultSet; + return result; + } + + /// + /// Writes the OSW workflow. With no caller measures and no additional IDF strings the + /// historical minimal shape is kept — seed, weather, empty steps. Caller measures + /// () become steps + /// in order with their parent directories as the measure paths; additional IDF strings + /// () are + /// injected through a generated EnergyPlus measure appended last, so it never precedes + /// the caller's own measures. Directories that are missing or contain no measure.xml + /// are skipped with a warning — never silently. + /// + private static void WriteWorkflow(OpenStudioConversionContext openStudioConversionContext, string oswPath, string seedFile, string weatherFile, string directory) + { + Core.OpenStudio.OpenStudioConversionOptions options = openStudioConversionContext?.Options; + + List measurePaths = new List(); + List measureStepNames = new List(); + + if (options?.MeasurePaths != null) + { + foreach (string measurePath in options.MeasurePaths) + { + if (string.IsNullOrWhiteSpace(measurePath)) + { + continue; + } + + string fullPath = Path.GetFullPath(measurePath); + if (!Directory.Exists(fullPath) || !File.Exists(Path.Combine(fullPath, "measure.xml"))) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.SimulationSettingsUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Measure directory '{0}' does not exist or contains no measure.xml; the step was skipped", measurePath)); + continue; + } + + string name = Path.GetFileName(fullPath.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)); + if (measureStepNames.Contains(name)) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.SimulationSettingsUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("A measure named '{0}' is already on the workflow; the duplicate step ({1}) was skipped", name, measurePath)); + continue; + } + + string parent = Path.GetDirectoryName(fullPath); + if (!measurePaths.Contains(parent)) + { + measurePaths.Add(parent); + } + + measureStepNames.Add(name); + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.SimulationSettingsUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, string.Format("Measure '{0}' applied as workflow step {1} (arguments at their measure defaults)", name, measureStepNames.Count)); + } + } + + List additionalIdfStrings = new List(); + if (options?.AdditionalIdfStrings != null) + { + foreach (string additionalIdfString in options.AdditionalIdfStrings) + { + if (!string.IsNullOrWhiteSpace(additionalIdfString)) + { + additionalIdfStrings.Add(additionalIdfString); + } + } + } + + if (additionalIdfStrings.Count > 0) + { + const string additionalMeasureName = "sam_additional_idf_objects"; + if (measureStepNames.Contains(additionalMeasureName)) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.SimulationSettingsUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("A caller measure is already named '{0}'; the additional IDF strings were not injected", additionalMeasureName)); + } + else + { + string measuresDirectory = Path.Combine(directory, "measures"); + WriteAdditionalIdfMeasure(Path.Combine(measuresDirectory, additionalMeasureName), additionalIdfStrings); + if (!measurePaths.Contains(measuresDirectory)) + { + measurePaths.Add(measuresDirectory); + } + + measureStepNames.Add(additionalMeasureName); + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.SimulationSettingsUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, string.Format("{0} additional IDF string(s) will be injected through the generated EnergyPlus measure '{1}' (advanced use — objects are written verbatim)", additionalIdfStrings.Count, additionalMeasureName)); + } + } + + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append("{\n \"seed_file\": \"").Append(JsonEscape(seedFile)).Append("\",\n \"weather_file\": \"").Append(JsonEscape(weatherFile)).Append("\""); + if (measurePaths.Count > 0) + { + stringBuilder.Append(",\n \"measure_paths\": ["); + for (int i = 0; i < measurePaths.Count; i++) + { + if (i > 0) + { + stringBuilder.Append(", "); + } + + stringBuilder.Append("\"").Append(JsonEscape(measurePaths[i].Replace('\\', '/'))).Append("\""); + } + + stringBuilder.Append("]"); + } + + stringBuilder.Append(",\n \"steps\": ["); + for (int i = 0; i < measureStepNames.Count; i++) + { + if (i > 0) + { + stringBuilder.Append(","); + } + + stringBuilder.Append("\n {\n \"measure_dir_name\": \"").Append(JsonEscape(measureStepNames[i])).Append("\",\n \"arguments\": {}\n }"); + } + + stringBuilder.Append(measureStepNames.Count == 0 ? "]\n}\n" : "\n ]\n}\n"); + File.WriteAllText(oswPath, stringBuilder.ToString()); + } + + /// + /// Generates the EnergyPlus measure that injects into the + /// workspace verbatim (complete IDF objects, parsed one string at a time). An + /// unparseable string fails the step — and therefore the run — so an invalid object is + /// never silently dropped. The measure.xml checksums are placeholders: the OpenStudio + /// CLI validates structure, not checksums. + /// + private static void WriteAdditionalIdfMeasure(string measureDirectory, List idfStrings) + { + Directory.CreateDirectory(measureDirectory); + + System.Text.StringBuilder ruby = new System.Text.StringBuilder(); + ruby.AppendLine("class SAMAdditionalIdfObjects < OpenStudio::Measure::EnergyPlusMeasure"); + ruby.AppendLine(" def name"); + ruby.AppendLine(" return \"SAM Additional IDF Objects\""); + ruby.AppendLine(" end"); + ruby.AppendLine(""); + ruby.AppendLine(" def description"); + ruby.AppendLine(" return \"Injects caller-supplied EnergyPlus objects (IDF text) into the workspace verbatim. Generated by the SAM Analytical to OpenStudio conversion.\""); + ruby.AppendLine(" end"); + ruby.AppendLine(""); + ruby.AppendLine(" def modeler_description"); + ruby.AppendLine(" return description"); + ruby.AppendLine(" end"); + ruby.AppendLine(""); + ruby.AppendLine(" def arguments(workspace)"); + ruby.AppendLine(" return OpenStudio::Measure::OSArgumentVector.new"); + ruby.AppendLine(" end"); + ruby.AppendLine(""); + ruby.AppendLine(" def run(workspace, runner, user_arguments)"); + ruby.AppendLine(" super(workspace, runner, user_arguments)"); + ruby.AppendLine(""); + ruby.AppendLine(" idf_strings = []"); + foreach (string idfString in idfStrings) + { + ruby.Append(" idf_strings << '").Append(RubyEscape(idfString)).AppendLine("'"); + } + + ruby.AppendLine(""); + ruby.AppendLine(" injected = 0"); + ruby.AppendLine(" idf_strings.each_with_index do |idf_string, index|"); + ruby.AppendLine(" idf_file = OpenStudio::IdfFile.load(idf_string, \"EnergyPlus\".to_IddFileType)"); + ruby.AppendLine(" if idf_file.empty?"); + ruby.AppendLine(" runner.registerError(\"Additional IDF string #{index + 1} could not be parsed as EnergyPlus objects: #{idf_string[0, 120]}\")"); + ruby.AppendLine(" return false"); + ruby.AppendLine(" end"); + ruby.AppendLine(""); + ruby.AppendLine(" objects = idf_file.get.objects"); + ruby.AppendLine(" workspace.addObjects(objects)"); + ruby.AppendLine(" injected += objects.size"); + ruby.AppendLine(" end"); + ruby.AppendLine(""); + ruby.AppendLine(" runner.registerInfo(\"Injected #{injected} EnergyPlus object(s) from #{idf_strings.size} additional string(s)\")"); + ruby.AppendLine(" return true"); + ruby.AppendLine(" end"); + ruby.AppendLine("end"); + ruby.AppendLine(""); + ruby.AppendLine("SAMAdditionalIdfObjects.new.registerWithApplication"); + File.WriteAllText(Path.Combine(measureDirectory, "measure.rb"), ruby.ToString()); + + System.Text.StringBuilder xml = new System.Text.StringBuilder(); + xml.AppendLine(""); + xml.AppendLine(""); + xml.AppendLine(" 3.0"); + xml.AppendLine(" sam_additional_idf_objects"); + xml.Append(" ").Append(System.Guid.NewGuid().ToString()).AppendLine(""); + xml.Append(" ").Append(System.Guid.NewGuid().ToString()).AppendLine(""); + xml.Append(" ").Append(System.DateTime.UtcNow.ToString("yyyyMMddTHHmmssZ", System.Globalization.CultureInfo.InvariantCulture)).AppendLine(""); + xml.AppendLine(" 00000000"); + xml.AppendLine(" SAMAdditionalIdfObjects"); + xml.AppendLine(" SAM Additional IDF Objects"); + xml.AppendLine(" Injects caller-supplied EnergyPlus objects (IDF text) into the workspace verbatim. Generated by the SAM Analytical to OpenStudio conversion."); + xml.AppendLine(" Injects caller-supplied EnergyPlus objects (IDF text) into the workspace verbatim. Generated by the SAM Analytical to OpenStudio conversion."); + xml.AppendLine(" "); + xml.AppendLine(" "); + xml.AppendLine(" "); + xml.AppendLine(" "); + xml.AppendLine(" EnergyPlus.EnergyPlus"); + xml.AppendLine(" "); + xml.AppendLine(" "); + xml.AppendLine(" "); + xml.AppendLine(" Measure Type"); + xml.AppendLine(" EnergyPlusMeasure"); + xml.AppendLine(" string"); + xml.AppendLine(" "); + xml.AppendLine(" "); + xml.AppendLine(" Uses SketchUp API"); + xml.AppendLine(" false"); + xml.AppendLine(" boolean"); + xml.AppendLine(" "); + xml.AppendLine(" "); + xml.AppendLine(" "); + xml.AppendLine(" "); + xml.AppendLine(" measure.rb"); + xml.AppendLine(" rb"); + xml.AppendLine(" script"); + xml.AppendLine(" 00000000"); + xml.AppendLine(" "); + xml.AppendLine(" "); + xml.AppendLine(""); + File.WriteAllText(Path.Combine(measureDirectory, "measure.xml"), xml.ToString()); + } + + /// Escapes a value for a JSON string literal (paths arrive forward-slashed). + private static string JsonEscape(string value) + { + if (string.IsNullOrEmpty(value)) + { + return string.Empty; + } + + return value.Replace("\\", "\\\\").Replace("\"", "\\\""); + } + + /// Escapes text for a Ruby single-quoted string literal: only backslash and the quote itself are special. + private static string RubyEscape(string value) + { + return value.Replace("\\", "\\\\").Replace("'", "\\'"); + } + + /// + /// Runs an existing OSM or OSW file through the OpenStudio CLI without a conversion + /// context — for an OSM an OSW is generated first (EPW required). Failures and + /// EnergyPlus severe errors are appended to when provided. + /// + /// Existing .osm or .osw file. + /// EPW weather file (required for .osm input; ignored for .osw). + /// Directory for the generated OSW and run folder; defaults next to the input. + /// Run options; defaults when null. + /// Annual Ideal Loads extracted on success; null otherwise. + /// Optional diagnostics sink. + /// Cancellation; kills the CLI/EnergyPlus process tree when triggered. + /// The run result (never null). + public static Core.OpenStudio.OpenStudioRunResult Run(string path, string epwPath, string outputDirectory, Core.OpenStudio.OpenStudioRunOptions openStudioRunOptions, out OpenStudioLoadSummary loadSummary, IList diagnostics = null, CancellationToken cancellationToken = default(CancellationToken)) + { + loadSummary = null; + Core.OpenStudio.OpenStudioRunOptions runOptions = openStudioRunOptions ?? new Core.OpenStudio.OpenStudioRunOptions(); + + void AddDiagnostic(string code, Core.OpenStudio.OpenStudioDiagnosticSeverity severity, string message) + { + diagnostics?.Add(new Core.OpenStudio.OpenStudioDiagnostic(code, severity, message)); + } + + if (string.IsNullOrWhiteSpace(path) || !File.Exists(path)) + { + AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.RunCliFailed, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("Input file not found: {0}", path)); + return new Core.OpenStudio.OpenStudioRunResult(false, -1, null, null, null, null, null, null); + } + + string directory = runOptions.RunDirectory ?? outputDirectory ?? Path.GetDirectoryName(path); + if (runOptions.UseUniqueRunDirectory) + { + directory = Path.Combine(directory, "SAM_OpenStudio_" + System.Guid.NewGuid().ToString("N").Substring(0, 8)); + } + + Directory.CreateDirectory(directory); + + string osmPath = null; + string oswPath; + string extension = Path.GetExtension(path); + if (string.Equals(extension, ".osw", System.StringComparison.OrdinalIgnoreCase)) + { + oswPath = path; + } + else + { + osmPath = path; + if (string.IsNullOrWhiteSpace(epwPath) || !File.Exists(epwPath)) + { + AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.RunCliFailed, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("EPW weather file not found: {0}", epwPath)); + return new Core.OpenStudio.OpenStudioRunResult(false, -1, osmPath, null, null, null, null, null); + } + + oswPath = Path.Combine(directory, Path.GetFileNameWithoutExtension(path) + ".osw"); + File.WriteAllText(oswPath, string.Format("{{\n \"seed_file\": \"{0}\",\n \"weather_file\": \"{1}\",\n \"steps\": []\n}}\n", Path.GetFullPath(path).Replace('\\', '/'), Path.GetFullPath(epwPath).Replace('\\', '/'))); + } + + string cliPath = Core.OpenStudio.Query.OpenStudioCliPath(runOptions.CliPath); + if (cliPath == null) + { + AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.RunCliFailed, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "openstudio.exe was not found (searched explicit path, PATH, direct installations and the ladybug_tools bundle)"); + return new Core.OpenStudio.OpenStudioRunResult(false, -1, osmPath, oswPath, null, null, null, null); + } + + string workingDirectory = Path.GetDirectoryName(oswPath); + + string oldRunDirectory = Path.Combine(workingDirectory, "run"); + if (Directory.Exists(oldRunDirectory)) + { + try + { + Directory.Delete(oldRunDirectory, true); + } + catch (System.Exception) + { + // a leftover run folder must not fail the new run + } + } + + if (cancellationToken.IsCancellationRequested) + { + AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.RunCliFailed, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "Simulation cancelled before the CLI was started"); + return new Core.OpenStudio.OpenStudioRunResult(false, -1, osmPath, oswPath, null, null, null, null); + } + + int exitCode; + bool cancelled; + string output = ExecuteCli(cliPath, oswPath, workingDirectory, runOptions.TimeoutSeconds, cancellationToken, out exitCode, out cancelled); + + if (cancelled) + { + AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.RunCliFailed, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "Simulation cancelled; the CLI/EnergyPlus process tree was terminated"); + } + + string runDirectory = Path.Combine(workingDirectory, "run"); + string errorFilePath = Path.Combine(runDirectory, "eplusout.err"); + string sqlPath = Path.Combine(runDirectory, "eplusout.sql"); + + List severeErrors = new List(); + List fatalErrors = new List(); + if (File.Exists(errorFilePath)) + { + string[] errorLines; + try + { + errorLines = File.ReadAllLines(errorFilePath); + } + catch (System.Exception) + { + errorLines = null; + } + + if (errorLines != null) + { + foreach (string line in errorLines) + { + if (line.Contains("** Severe")) + { + severeErrors.Add(line.Trim()); + } + else if (line.Contains("** Fatal") || line.Contains("** Fatal")) + { + fatalErrors.Add(line.Trim()); + } + } + } + } + + bool sqlExists = File.Exists(sqlPath); + bool success = !cancelled && exitCode == 0 && fatalErrors.Count == 0 && sqlExists; + + if (!success && !cancelled) + { + AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.RunCliFailed, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("OpenStudio CLI run failed (exit code {0}, SQL {1}, {2} fatal error(s)). Output tail: {3}", exitCode, sqlExists ? "present" : "missing", fatalErrors.Count, Tail(output, 500))); + } + + foreach (string severeError in severeErrors) + { + AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.EnergyPlusSevereError, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, severeError); + } + + if (success) + { + loadSummary = ExtractLoads(sqlPath, out string failureDetail); + if (loadSummary == null) + { + // Previously this overload dropped the failure entirely — the caller got a + // successful run with a null summary and no explanation. + AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.RunCliFailed, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("Ideal Loads results could not be extracted from the SQLite output — {0}", failureDetail)); + } + } + + return new Core.OpenStudio.OpenStudioRunResult(success, exitCode, osmPath, oswPath, sqlExists ? sqlPath : null, File.Exists(errorFilePath) ? errorFilePath : null, severeErrors, fatalErrors); + } + + private static string ExecuteCli(string cliPath, string oswPath, string workingDirectory, int timeoutSeconds, CancellationToken cancellationToken, out int exitCode, out bool cancelled) + { + cancelled = false; + bool cancellationRequested = false; + + ProcessStartInfo processStartInfo = new ProcessStartInfo + { + FileName = cliPath, + Arguments = string.Format("run -w \"{0}\"", oswPath), + WorkingDirectory = workingDirectory, + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true, + CreateNoWindow = true, + }; + + System.Text.StringBuilder standardOutput = new System.Text.StringBuilder(); + System.Text.StringBuilder standardError = new System.Text.StringBuilder(); + object sync = new object(); + + using (Process process = Process.Start(processStartInfo)) + { + if (process == null) + { + exitCode = -1; + return "The CLI process could not be started"; + } + + // Job object first (best effort): on timeout OR cancellation the whole tree — + // the CLI and any EnergyPlus child it spawned — is terminated when the job + // handle closes. + System.IntPtr jobHandle = ProcessJobObject.CreateKillOnCloseJob(); + ProcessJobObject.TryAssign(jobHandle, process); + + try + { + // Asynchronous reads: synchronous ReadToEnd on both pipes can deadlock + // (child blocks writing to a full stderr pipe while the parent blocks on + // stdout) and blocks the timeout from ever being evaluated. + process.OutputDataReceived += (sender, e) => { if (e.Data != null) { lock (sync) { standardOutput.AppendLine(e.Data); } } }; + process.ErrorDataReceived += (sender, e) => { if (e.Data != null) { lock (sync) { standardError.AppendLine(e.Data); } } }; + process.BeginOutputReadLine(); + process.BeginErrorReadLine(); + + using (cancellationToken.Register(() => + { + cancellationRequested = true; + ProcessJobObject.Terminate(jobHandle); + try + { + process.Kill(); + } + catch (System.Exception) + { + // the process may have exited between cancellation and the kill + } + })) + { + int timeoutMilliseconds = timeoutSeconds <= 0 ? 3600000 : timeoutSeconds * 1000; + if (!process.WaitForExit(timeoutMilliseconds)) + { + // Terminate the tree first (children keep spawning while the root + // dies), then kill the root as the fallback for a failed job + // assignment. + ProcessJobObject.Terminate(jobHandle); + + try + { + process.Kill(); + } + catch (System.Exception) + { + // the process may have exited between the timeout and the kill + } + + try + { + process.WaitForExit(5000); + } + catch (System.Exception) + { + // best effort + } + + exitCode = -1; + cancelled = cancellationRequested; + lock (sync) + { + return cancelled ? "CANCELLED\n" + standardOutput + standardError.ToString() : "TIMEOUT after " + timeoutSeconds + " s\n" + standardOutput + standardError.ToString(); + } + } + + process.WaitForExit(); // let the asynchronous output handlers flush + cancelled = cancellationRequested; + exitCode = cancelled ? -1 : process.ExitCode; + lock (sync) + { + return cancelled ? "CANCELLED\n" + standardOutput + standardError.ToString() : standardOutput.ToString() + standardError; + } + } + } + finally + { + ProcessJobObject.Close(jobHandle); + } + } + } + + /// + /// Extracts the annual Ideal Loads summary. On failure returns null and sets + /// to a single-line description precise enough to tell + /// a missing managed assembly, a missing/mismatched native interop, a bad architecture + /// and a genuine SQL/query failure apart — see . + /// + internal static OpenStudioLoadSummary ExtractLoads(string sqlPath, out string failureDetail) + { + failureDetail = null; + try + { + Dictionary zoneHeating = ReadAnnualEnergy(sqlPath, "Zone Ideal Loads Supply Air Total Heating Energy"); + Dictionary zoneCooling = ReadAnnualEnergy(sqlPath, "Zone Ideal Loads Supply Air Total Cooling Energy"); + if (zoneHeating == null || zoneCooling == null) + { + failureDetail = string.Format("the SQLite results file could not be read (path: {0}, exists: {1})", sqlPath, File.Exists(sqlPath)); + return null; + } + + return new OpenStudioLoadSummary(zoneHeating, zoneCooling); + } + catch (System.Exception exception) + { + failureDetail = DescribeExtractionFailure(exception, sqlPath); + return null; + } + } + + /// + /// Renders an extraction exception as one concise but diagnostic line: the exception + /// type and message plus the whole inner-exception chain, the SQL path, where (or + /// whether) System.Data.SQLite actually loaded from, the plugin and base directories + /// and the process bitness. Deployment faults are by far the most common cause here — + /// a FileNotFoundException naming System.Data.SQLite means the managed assembly was + /// never deployed, a DllNotFoundException naming SQLite.Interop.dll means the native + /// asset (or one of its own dependencies) is missing, and a BadImageFormatException + /// means the deployed interop does not match the process architecture. + /// + internal static string DescribeExtractionFailure(System.Exception exception, string sqlPath) + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + + for (System.Exception current = exception; current != null; current = current.InnerException) + { + if (stringBuilder.Length != 0) + { + stringBuilder.Append(" -> "); + } + + stringBuilder.AppendFormat("{0}: {1}", current.GetType().FullName, current.Message); + } + + string sqliteLocation = "not loaded"; + try + { + foreach (System.Reflection.Assembly assembly in System.AppDomain.CurrentDomain.GetAssemblies()) + { + if (string.Equals(assembly.GetName().Name, "System.Data.SQLite", System.StringComparison.OrdinalIgnoreCase)) + { + sqliteLocation = string.IsNullOrEmpty(assembly.Location) ? "loaded (no location)" : assembly.Location; + break; + } + } + } + catch (System.Exception) + { + sqliteLocation = "unavailable"; + } + + string pluginLocation; + try + { + pluginLocation = typeof(OpenStudioSimulationRunner).Assembly.Location; + } + catch (System.Exception) + { + pluginLocation = "unavailable"; + } + + stringBuilder.AppendFormat( + " [sql: {0}; System.Data.SQLite: {1}; plugin: {2}; base: {3}; process: {4}-bit]", + sqlPath, + sqliteLocation, + pluginLocation, + System.AppContext.BaseDirectory, + System.IntPtr.Size * 8); + + return stringBuilder.ToString(); + } + + /// + /// Builds the engine-neutral result set (C5): per-zone peaks with hour-of-year, + /// building-level coincident peaks, unmet hours, annual gains breakdown and — + /// when requested — the hourly temperature/operative/humidity series. All SQL is + /// parameterised and restricted to the weather-run environment. + /// + internal static OpenStudioSimulationResultSet ExtractResultSet(string sqlPath, OpenStudioLoadSummary loadSummary, bool extractTimeSeries, double runtimeSeconds, int warningCount, int severeCount, int fatalCount) + { + try + { + Dictionary>> heatingSeries = ReadHourlyEnergySeries(sqlPath, "Zone Ideal Loads Supply Air Total Heating Energy"); + Dictionary>> coolingSeries = ReadHourlyEnergySeries(sqlPath, "Zone Ideal Loads Supply Air Total Cooling Energy"); + + Dictionary peakHeatingLoad = new Dictionary(); + Dictionary peakCoolingLoad = new Dictionary(); + Dictionary peakHeatingHour = new Dictionary(); + Dictionary peakCoolingHour = new Dictionary(); + + FillPeaks(heatingSeries, peakHeatingLoad, peakHeatingHour); + FillPeaks(coolingSeries, peakCoolingLoad, peakCoolingHour); + + double peakHeatingLoadTotal; + int peakHeatingHourTotal; + CoincidentPeak(heatingSeries, out peakHeatingLoadTotal, out peakHeatingHourTotal); + + double peakCoolingLoadTotal; + int peakCoolingHourTotal; + CoincidentPeak(coolingSeries, out peakCoolingLoadTotal, out peakCoolingHourTotal); + + Dictionary unmetHeatingHours = ReadAnnualSum(sqlPath, "Zone Heating Setpoint Not Met Time", 1.0); + Dictionary unmetCoolingHours = ReadAnnualSum(sqlPath, "Zone Cooling Setpoint Not Met Time", 1.0); + + Dictionary infiltrationGains = ReadAnnualEnergy(sqlPath, "Zone Infiltration Sensible Heat Gain Energy"); + Dictionary infiltrationLosses = ReadAnnualEnergy(sqlPath, "Zone Infiltration Sensible Heat Loss Energy"); + if (infiltrationGains != null && infiltrationLosses != null) + { + foreach (KeyValuePair keyValuePair in infiltrationLosses) + { + infiltrationGains[keyValuePair.Key] = (infiltrationGains.TryGetValue(keyValuePair.Key, out double gain) ? gain : 0) - keyValuePair.Value; + } + } + + Dictionary temperatureSeries = null; + Dictionary operativeTemperatureSeries = null; + Dictionary relativeHumiditySeries = null; + if (extractTimeSeries) + { + temperatureSeries = ToSeries(ReadHourlyValueSeries(sqlPath, "Zone Mean Air Temperature")); + operativeTemperatureSeries = ToSeries(ReadHourlyValueSeries(sqlPath, "Zone Operative Temperature")); + relativeHumiditySeries = ToSeries(ReadHourlyValueSeries(sqlPath, "Zone Air Relative Humidity")); + } + + // Zone identity normalisation: Ideal Loads variables key on the system name, + // zone-level variables on the ThermalZone name, enclosure variables on the + // Space name — all end with the same deterministic SAM Guid suffix. Every + // per-zone dictionary is remapped onto the energy key so the result set has + // ONE zone identity. + List zoneKeys = new List(loadSummary.ZoneHeating.Keys); + + return new OpenStudioSimulationResultSet( + loadSummary.ZoneHeating, + loadSummary.ZoneCooling, + peakHeatingLoad, + peakCoolingLoad, + peakHeatingHour, + peakCoolingHour, + peakHeatingLoadTotal, + peakHeatingHourTotal, + peakCoolingLoadTotal, + peakCoolingHourTotal, + NormalizeKeys(unmetHeatingHours, zoneKeys), + NormalizeKeys(unmetCoolingHours, zoneKeys), + NormalizeKeys(ReadAnnualEnergy(sqlPath, "Zone People Total Heating Energy"), zoneKeys), + NormalizeKeys(ReadAnnualEnergy(sqlPath, "Zone Lights Total Heating Energy"), zoneKeys), + NormalizeKeys(ReadAnnualEnergy(sqlPath, "Zone Electric Equipment Total Heating Energy"), zoneKeys), + // Zone-window-solar variables are Enclosure-scoped in current EnergyPlus + // ("Zone Windows ..." was renamed). + NormalizeKeys(ReadAnnualEnergy(sqlPath, "Enclosure Windows Total Transmitted Solar Radiation Energy"), zoneKeys), + NormalizeKeys(infiltrationGains, zoneKeys), + ReadAnnualEnergy(sqlPath, "Zone Ideal Loads Outdoor Air Sensible Heating Energy"), + ReadAnnualEnergy(sqlPath, "Zone Ideal Loads Outdoor Air Sensible Cooling Energy"), + NormalizeKeys(temperatureSeries, zoneKeys), + NormalizeKeys(operativeTemperatureSeries, zoneKeys), + NormalizeKeys(relativeHumiditySeries, zoneKeys), + runtimeSeconds, + warningCount, + severeCount, + fatalCount, + ReadZoneSizes(sqlPath)); + } + catch (System.Exception) + { + return null; + } + } + + /// + /// Remaps report keys onto the energy-dictionary zone keys by their shared deterministic + /// SAM Guid suffix (last 8 characters, case-insensitive): Ideal Loads variables key on + /// the system name, zone-level variables on the ThermalZone name, enclosure variables on + /// the Space name — the result set exposes ONE zone identity. Unmatched keys pass + /// through unchanged. + /// + private static Dictionary NormalizeKeys(Dictionary source, List zoneKeys) + { + if (source == null) + { + return null; + } + + Dictionary result = new Dictionary(); + foreach (KeyValuePair keyValuePair in source) + { + result[NormalizeKey(keyValuePair.Key, zoneKeys)] = keyValuePair.Value; + } + + return result; + } + + private static Dictionary NormalizeKeys(Dictionary source, List zoneKeys) + { + if (source == null) + { + return null; + } + + Dictionary result = new Dictionary(); + foreach (KeyValuePair keyValuePair in source) + { + result[NormalizeKey(keyValuePair.Key, zoneKeys)] = keyValuePair.Value; + } + + return result; + } + + private static string NormalizeKey(string key, List zoneKeys) + { + if (key == null || zoneKeys == null || zoneKeys.Count == 0 || key.Length < 8) + { + return key; + } + + string suffix = key.Substring(key.Length - 8); + foreach (string zoneKey in zoneKeys) + { + if (zoneKey != null && zoneKey.Length >= 8 && string.Equals(zoneKey.Substring(zoneKey.Length - 8), suffix, System.StringComparison.OrdinalIgnoreCase)) + { + return zoneKey; + } + } + + return key; + } + + private static void FillPeaks(Dictionary>> series, Dictionary peakLoad, Dictionary peakHour) { + if (series == null) + { + return; + } + + foreach (KeyValuePair>> keyValuePair in series) + { + double peakJoules = double.MinValue; + int peakHourOfYear = -1; + foreach (KeyValuePair point in keyValuePair.Value) + { + if (point.Value > peakJoules) + { + peakJoules = point.Value; + peakHourOfYear = point.Key; + } + } + + if (peakHourOfYear >= 0) + { + peakLoad[keyValuePair.Key] = Core.OpenStudio.Query.JoulesPerIntervalToWatts(peakJoules) / 1000.0; + peakHour[keyValuePair.Key] = peakHourOfYear; + } + } + } + + private static void CoincidentPeak(Dictionary>> series, out double peakLoad, out int peakHour) + { + peakLoad = 0; + peakHour = -1; + if (series == null) + { + return; + } + + SortedDictionary totals = new SortedDictionary(); + foreach (KeyValuePair>> keyValuePair in series) + { + foreach (KeyValuePair point in keyValuePair.Value) + { + totals.TryGetValue(point.Key, out double current); + totals[point.Key] = current + point.Value; + } + } + + double peakJoules = double.MinValue; + foreach (KeyValuePair keyValuePair in totals) + { + if (keyValuePair.Value > peakJoules) + { + peakJoules = keyValuePair.Value; + peakHour = keyValuePair.Key; + } + } + + if (peakHour >= 0) + { + peakLoad = Core.OpenStudio.Query.JoulesPerIntervalToWatts(peakJoules) / 1000.0; + } + } + + private static Dictionary ToSeries(Dictionary>> hourlyValues) + { + if (hourlyValues == null) + { + return null; + } + + Dictionary result = new Dictionary(); + foreach (KeyValuePair>> keyValuePair in hourlyValues) + { + List> points = keyValuePair.Value; + if (points.Count == 0) + { + continue; + } + + double[] values = new double[points.Count]; + for (int i = 0; i < points.Count; i++) + { + values[i] = points[i].Value; + } + + result[keyValuePair.Key] = values; + } + + return result; + } + + /// + /// Reads the SQL ZoneSizes table: the zone sizing outcome per zone and load type from the + /// DESIGN-DAY periods. Returns an empty list when the table is absent (a run with no sizing) so + /// callers never have to distinguish null from "nothing sized"; a missing column or unreadable + /// file also yields empty rather than throwing, matching the other readers here. + /// + /// + /// Both load values are read. UserDesLoad is the load after sizing factors — the value + /// EnergyPlus actually sizes components with, and the one comparable with the TAS route's TBD + /// sizing load — while CalcDesLoad is the unaltered calculation, kept for audit. No value + /// here is ever a substitute for the annual simulated peak. + /// + private static List ReadZoneSizes(string sqlPath) + { + List result = new List(); + if (string.IsNullOrWhiteSpace(sqlPath) || !File.Exists(sqlPath)) + { + return result; + } + + try + { + using (System.Data.SQLite.SQLiteConnection connection = new System.Data.SQLite.SQLiteConnection(new System.Data.SQLite.SQLiteConnectionStringBuilder { DataSource = sqlPath, ReadOnly = true, FailIfMissing = true }.ConnectionString)) + { + connection.Open(); + + using (System.Data.SQLite.SQLiteCommand exists = connection.CreateCommand()) + { + exists.CommandText = "SELECT COUNT(*) FROM sqlite_master WHERE type = 'table' AND name = 'ZoneSizes'"; + if (System.Convert.ToInt32(exists.ExecuteScalar()) == 0) + { + return result; + } + } + + using (System.Data.SQLite.SQLiteCommand command = connection.CreateCommand()) + { + // ZoneSizesIndex (the table's primary key) is selected and ordered on so the read + // order is defined by the database rather than left to query-plan chance, and so a + // duplicate (ZoneName, LoadType) pair has a reproducible "first" row. + command.CommandText = "SELECT ZoneName, LoadType, CalcDesLoad, UserDesLoad, CalcDesFlow, UserDesFlow, DesDayName, PeakHrMin, PeakTemp, PeakHumRat, ZoneSizesIndex FROM ZoneSizes ORDER BY ZoneName, LoadType, ZoneSizesIndex"; + using (System.Data.SQLite.SQLiteDataReader reader = command.ExecuteReader()) + { + while (reader.Read()) + { + result.Add(new OpenStudioZoneSizingResult( + ReadString(reader, 0), + ReadString(reader, 1), + ReadDouble(reader, 2), + ReadDouble(reader, 3), + ReadDouble(reader, 4), + ReadDouble(reader, 5), + ReadString(reader, 6), + ReadString(reader, 7), + ReadDouble(reader, 8), + ReadDouble(reader, 9), + ReadInt64(reader, 10))); + } + } + } + } + } + catch (System.Exception) + { + return result; + } + + return result; + } + + private static string ReadString(System.Data.SQLite.SQLiteDataReader reader, int index) + { + return reader.IsDBNull(index) ? null : reader.GetValue(index)?.ToString(); + } + + private static long ReadInt64(System.Data.SQLite.SQLiteDataReader reader, int index) + { + return reader.IsDBNull(index) ? 0L : System.Convert.ToInt64(reader.GetValue(index), System.Globalization.CultureInfo.InvariantCulture); + } + + private static double? ReadDouble(System.Data.SQLite.SQLiteDataReader reader, int index) + { + if (reader.IsDBNull(index)) + { + return null; + } + + double value = System.Convert.ToDouble(reader.GetValue(index), System.Globalization.CultureInfo.InvariantCulture); + return double.IsNaN(value) || double.IsInfinity(value) ? (double?)null : value; + } + + /// Sums any report variable per key over the weather-run environment with an explicit scale factor (no unit conversion). + private static Dictionary ReadAnnualSum(string sqlPath, string variableName, double factor) + { + if (string.IsNullOrWhiteSpace(sqlPath) || !File.Exists(sqlPath)) + { + return null; + } + + try + { + using (System.Data.SQLite.SQLiteConnection connection = new System.Data.SQLite.SQLiteConnection(new System.Data.SQLite.SQLiteConnectionStringBuilder { DataSource = sqlPath, ReadOnly = true, FailIfMissing = true }.ConnectionString)) + { + connection.Open(); + bool filterEnvironment = HasWeatherRunEnvironment(connection); + + List keys = ReadKeys(connection, variableName); + Dictionary result = new Dictionary(); + foreach (string key in keys) + { + using (System.Data.SQLite.SQLiteCommand command = connection.CreateCommand()) + { + command.CommandText = filterEnvironment + ? "SELECT SUM(rd.Value) FROM ReportData rd JOIN ReportDataDictionary rdd ON rd.ReportDataDictionaryIndex = rdd.ReportDataDictionaryIndex JOIN Time t ON rd.TimeIndex = t.TimeIndex WHERE rdd.Name = @name AND rdd.KeyValue = @key AND t.EnvironmentPeriodIndex IN (SELECT EnvironmentPeriodIndex FROM EnvironmentPeriods WHERE EnvironmentType = 3)" + : "SELECT SUM(rd.Value) FROM ReportData rd JOIN ReportDataDictionary rdd ON rd.ReportDataDictionaryIndex = rdd.ReportDataDictionaryIndex WHERE rdd.Name = @name AND rdd.KeyValue = @key"; + command.Parameters.AddWithValue("@name", variableName); + command.Parameters.AddWithValue("@key", key); + + object value = command.ExecuteScalar(); + if (value != null && value != System.DBNull.Value) + { + result[key] = System.Convert.ToDouble(value, System.Globalization.CultureInfo.InvariantCulture) * factor; + } + } + } + + return result; + } + } + catch (System.Exception) + { + return null; + } + } + + /// Hourly energy [J] series per key over the weather-run environment: zone key → (hour-of-year, value) pairs in time order. + private static Dictionary>> ReadHourlyEnergySeries(string sqlPath, string variableName) + { + return ReadHourlyValueSeries(sqlPath, variableName); + } + + /// Hourly series per key over the weather-run environment (raw values, no conversion): zone key → (hour-of-year, value) pairs in time order. Internal for the leap-year indexing regression tests (review P1-03). + internal static Dictionary>> ReadHourlyValueSeries(string sqlPath, string variableName) + { + if (string.IsNullOrWhiteSpace(sqlPath) || !File.Exists(sqlPath)) + { + return null; + } + + try + { + using (System.Data.SQLite.SQLiteConnection connection = new System.Data.SQLite.SQLiteConnection(new System.Data.SQLite.SQLiteConnectionStringBuilder { DataSource = sqlPath, ReadOnly = true, FailIfMissing = true }.ConnectionString)) + { + connection.Open(); + bool filterEnvironment = HasWeatherRunEnvironment(connection); + + // Review P1-03: hour-of-year must follow the run calendar. With a fixed + // non-leap reference year every Feb 29 row clamps onto Feb 28 (duplicate + // hour keys double-count the coincident peak) and all post-February hours + // land one day early. Feb 29 rows in the read environment select a leap + // reference year; the clamp below stays for genuinely invalid dates. + int referenceYear = HasFebruary29(connection, filterEnvironment) ? 2024 : 2023; + + List keys = ReadKeys(connection, variableName); + Dictionary>> result = new Dictionary>>(); + foreach (string key in keys) + { + List> points = new List>(); + using (System.Data.SQLite.SQLiteCommand command = connection.CreateCommand()) + { + command.CommandText = "SELECT t.Month, t.Day, t.Hour, rd.Value FROM ReportData rd JOIN ReportDataDictionary rdd ON rd.ReportDataDictionaryIndex = rdd.ReportDataDictionaryIndex JOIN Time t ON rd.TimeIndex = t.TimeIndex WHERE rdd.Name = @name AND rdd.KeyValue = @key" + + (filterEnvironment ? " AND t.EnvironmentPeriodIndex IN (SELECT EnvironmentPeriodIndex FROM EnvironmentPeriods WHERE EnvironmentType = 3)" : string.Empty) + + " ORDER BY t.TimeIndex"; + command.Parameters.AddWithValue("@name", variableName); + command.Parameters.AddWithValue("@key", key); + + using (System.Data.SQLite.SQLiteDataReader reader = command.ExecuteReader()) + { + while (reader.Read()) + { + int month = reader.GetInt32(0); + int day = reader.GetInt32(1); + int hour = reader.GetInt32(2); + double value = reader.GetDouble(3); + + int monthClamped = System.Math.Max(1, System.Math.Min(12, month)); + int dayClamped = System.Math.Max(1, System.Math.Min(System.DateTime.DaysInMonth(referenceYear, monthClamped), day)); + int dayOfYear = new System.DateTime(referenceYear, monthClamped, dayClamped).DayOfYear; + points.Add(new KeyValuePair((dayOfYear - 1) * 24 + (hour - 1), value)); + } + } + } + + if (points.Count > 0) + { + result[key] = points; + } + } + + return result; + } + } + catch (System.Exception) + { + return null; + } + } + + private static bool HasWeatherRunEnvironment(System.Data.SQLite.SQLiteConnection connection) + { + using (System.Data.SQLite.SQLiteCommand command = connection.CreateCommand()) + { + command.CommandText = "SELECT COUNT(*) FROM sqlite_master WHERE type = 'table' AND name = 'EnvironmentPeriods'"; + if ((long)command.ExecuteScalar() == 0) + { + return false; + } + + command.CommandText = "SELECT COUNT(*) FROM EnvironmentPeriods WHERE EnvironmentType = 3"; + return (long)command.ExecuteScalar() > 0; + } + } + + /// + /// True when the Time rows this reader consumes (the annual weather environment when + /// one exists, all rows otherwise) contain a Feb 29 — i.e. the run calendar is a leap + /// year and hour-of-year must be computed against a leap reference year (review P1-03). + /// + private static bool HasFebruary29(System.Data.SQLite.SQLiteConnection connection, bool filterEnvironment) + { + using (System.Data.SQLite.SQLiteCommand command = connection.CreateCommand()) + { + command.CommandText = "SELECT COUNT(*) FROM Time t WHERE t.Month = 2 AND t.Day = 29" + + (filterEnvironment ? " AND t.EnvironmentPeriodIndex IN (SELECT EnvironmentPeriodIndex FROM EnvironmentPeriods WHERE EnvironmentType = 3)" : string.Empty); + return (long)command.ExecuteScalar() > 0; + } + } + + private static List ReadKeys(System.Data.SQLite.SQLiteConnection connection, string variableName) + { + List result = new List(); + using (System.Data.SQLite.SQLiteCommand command = connection.CreateCommand()) + { + command.CommandText = "SELECT DISTINCT rdd.KeyValue FROM ReportDataDictionary rdd WHERE rdd.Name = @name"; + command.Parameters.AddWithValue("@name", variableName); + using (System.Data.SQLite.SQLiteDataReader reader = command.ExecuteReader()) + { + while (reader.Read()) + { + if (!reader.IsDBNull(0)) + { + result.Add(reader.GetString(0)); + } + } + } + } + + return result; + } + + /// + /// Reads the annual (summed) energy per key for one report variable from the EnergyPlus + /// SQLite output, converted J → kWh, restricted to the weather-file RunPeriod + /// environment (EnvironmentType 3) so imported design days never double-count into the + /// annual totals. All queries are parameterised (System.Data.SQLite) — zone/key names + /// are never string-concatenated into SQL, so names containing quotes or SQL syntax + /// cannot break or inject a query. + /// + /// Path to eplusout.sql. + /// ReportDataDictionary variable name. + /// KeyValue → annual energy [kWh]; null when the file cannot be read. + internal static Dictionary ReadAnnualEnergy(string sqlPath, string variableName) + { + if (string.IsNullOrWhiteSpace(sqlPath) || !File.Exists(sqlPath) || string.IsNullOrWhiteSpace(variableName)) + { + return null; + } + + System.Data.SQLite.SQLiteConnectionStringBuilder connectionStringBuilder = new System.Data.SQLite.SQLiteConnectionStringBuilder + { + DataSource = sqlPath, + ReadOnly = true, + FailIfMissing = true, + }; + + using (System.Data.SQLite.SQLiteConnection connection = new System.Data.SQLite.SQLiteConnection(connectionStringBuilder.ConnectionString)) + { + connection.Open(); + + // Environment filter: sum weather-run rows only. Falls back to unfiltered when + // no weather-run environment row exists (defensive — E+ always writes one). + bool filterEnvironment = false; + using (System.Data.SQLite.SQLiteCommand command = connection.CreateCommand()) + { + command.CommandText = "SELECT COUNT(*) FROM sqlite_master WHERE type = 'table' AND name = 'EnvironmentPeriods'"; + if ((long)command.ExecuteScalar() > 0) + { + command.CommandText = "SELECT COUNT(*) FROM EnvironmentPeriods WHERE EnvironmentType = 3"; + filterEnvironment = (long)command.ExecuteScalar() > 0; + } + } + + List keys = new List(); + using (System.Data.SQLite.SQLiteCommand command = connection.CreateCommand()) + { + command.CommandText = "SELECT DISTINCT rdd.KeyValue FROM ReportDataDictionary rdd WHERE rdd.Name = @name"; + command.Parameters.AddWithValue("@name", variableName); + using (System.Data.SQLite.SQLiteDataReader reader = command.ExecuteReader()) + { + while (reader.Read()) + { + keys.Add(reader.IsDBNull(0) ? null : reader.GetString(0)); + } + } + } + + Dictionary result = new Dictionary(); + foreach (string key in keys) + { + if (key == null) + { + continue; + } + + using (System.Data.SQLite.SQLiteCommand command = connection.CreateCommand()) + { + command.CommandText = filterEnvironment + ? "SELECT SUM(rd.Value) FROM ReportData rd JOIN ReportDataDictionary rdd ON rd.ReportDataDictionaryIndex = rdd.ReportDataDictionaryIndex JOIN Time t ON rd.TimeIndex = t.TimeIndex WHERE rdd.Name = @name AND rdd.KeyValue = @key AND t.EnvironmentPeriodIndex IN (SELECT EnvironmentPeriodIndex FROM EnvironmentPeriods WHERE EnvironmentType = 3)" + : "SELECT SUM(rd.Value) FROM ReportData rd JOIN ReportDataDictionary rdd ON rd.ReportDataDictionaryIndex = rdd.ReportDataDictionaryIndex WHERE rdd.Name = @name AND rdd.KeyValue = @key"; + command.Parameters.AddWithValue("@name", variableName); + command.Parameters.AddWithValue("@key", key); + + object value = command.ExecuteScalar(); + if (value == null || value == System.DBNull.Value) + { + continue; + } + + result[key] = Core.OpenStudio.Query.JoulesToKilowattHours(System.Convert.ToDouble(value, System.Globalization.CultureInfo.InvariantCulture)); + } + } + + return result; + } + } + + private static string Tail(string value, int length) + { + if (string.IsNullOrEmpty(value)) + { + return string.Empty; + } + + value = value.Replace("\r", string.Empty).Replace('\n', ' '); + return value.Length <= length ? value : value.Substring(value.Length - length); + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/OpenStudioWorkflow.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/OpenStudioWorkflow.cs new file mode 100644 index 0000000..19ac155 --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/OpenStudioWorkflow.cs @@ -0,0 +1,442 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; +using System.IO; +using System.Text.Json; +using System.Text.Json.Nodes; + +namespace SAM.Analytical.OpenStudio +{ + /// + /// Reads an OpenStudio workflow file (OSW) and resolves the model it describes. + /// + /// An OSW is a workflow description, not a building model: it names a seed OSM and a list of + /// measures to apply to it. Parsing the JSON therefore tells you what the workflow *would* + /// produce, never what it *does* produce — only running it does that. This class keeps those + /// two cases explicit rather than letting a parsed OSW masquerade as an imported model. + /// + /// + public sealed class OpenStudioWorkflow + { + /// Absolute path of the OSW file. + public string Path { get; } + + /// + /// Directory paths are resolved against: the OSW's own root field when present, + /// otherwise the directory containing the OSW. + /// + public string Root { get; } + + /// Raw seed_file value, as written in the OSW; null when absent. + public string SeedFile { get; } + + /// Raw weather_file value; null when absent. + public string WeatherFile { get; } + + /// Additional file_paths search directories, resolved to absolute paths. + public IReadOnlyList FilePaths { get; } + + /// Measure directory names of the workflow's steps, in order. + public IReadOnlyList StepMeasureNames { get; } + + /// The parsed OSW document; used to write an isolated copy without losing any field. + internal JsonObject Document { get; } + + private OpenStudioWorkflow(string path, string root, string seedFile, string weatherFile, List filePaths, List stepMeasureNames, JsonObject document) + { + Path = path; + Root = root; + SeedFile = seedFile; + WeatherFile = weatherFile; + FilePaths = filePaths; + StepMeasureNames = stepMeasureNames; + Document = document; + } + + /// + /// Parses an OSW file. Returns null and sets when the + /// file cannot be read or is not a JSON object. + /// + /// OSW file path. + /// Single-line description of the failure; null on success. + /// The parsed workflow, or null. + public static OpenStudioWorkflow Parse(string path, out string failureReason) + { + failureReason = null; + + if (string.IsNullOrWhiteSpace(path) || !File.Exists(path)) + { + failureReason = string.Format("the file does not exist: {0}", path); + return null; + } + + JsonNode jsonNode; + try + { + jsonNode = JsonNode.Parse(File.ReadAllText(path), null, new JsonDocumentOptions { CommentHandling = JsonCommentHandling.Skip, AllowTrailingCommas = true }); + } + catch (Exception exception) + { + failureReason = string.Format("{0}: {1}", exception.GetType().Name, exception.Message); + return null; + } + + JsonObject jsonObject = jsonNode as JsonObject; + if (jsonObject == null) + { + failureReason = "the file does not contain a JSON object"; + return null; + } + + string fullPath = System.IO.Path.GetFullPath(path); + string directory = System.IO.Path.GetDirectoryName(fullPath); + + // "root" is relative to the OSW's own directory when relative — that is what the + // OpenStudio CLI does, and getting it wrong silently breaks every relative seed. + string root = directory; + string rootValue = StringValue(jsonObject, "root"); + if (!string.IsNullOrWhiteSpace(rootValue)) + { + root = System.IO.Path.IsPathRooted(rootValue) ? rootValue : System.IO.Path.GetFullPath(System.IO.Path.Combine(directory, rootValue)); + } + + List filePaths = new List(); + JsonArray filePathsArray = jsonObject["file_paths"] as JsonArray; + if (filePathsArray != null) + { + foreach (JsonNode node in filePathsArray) + { + string value = node?.GetValue(); + if (string.IsNullOrWhiteSpace(value)) + { + continue; + } + + filePaths.Add(System.IO.Path.IsPathRooted(value) ? value : System.IO.Path.GetFullPath(System.IO.Path.Combine(root, value))); + } + } + + List stepMeasureNames = new List(); + JsonArray stepsArray = jsonObject["steps"] as JsonArray; + if (stepsArray != null) + { + foreach (JsonNode node in stepsArray) + { + JsonObject step = node as JsonObject; + string measureDirName = StringValue(step, "measure_dir_name"); + if (!string.IsNullOrWhiteSpace(measureDirName)) + { + stepMeasureNames.Add(measureDirName); + } + } + } + + return new OpenStudioWorkflow(fullPath, root, StringValue(jsonObject, "seed_file"), StringValue(jsonObject, "weather_file"), filePaths, stepMeasureNames, jsonObject); + } + + /// + /// Resolves to an existing OSM on disk. + /// + /// The search follows the OpenStudio CLI's own order: the path as given (absolute or + /// relative to the root), then <root>/files — where the CLI conventionally + /// keeps seed models — then each file_paths entry and its own files + /// subdirectory. + /// + /// + /// Every location tried, for a diagnostic when nothing is found. + /// The resolved OSM path, or null. + public string ResolveSeedPath(out List searchedPaths) + { + searchedPaths = new List(); + + if (string.IsNullOrWhiteSpace(SeedFile)) + { + return null; + } + + if (System.IO.Path.IsPathRooted(SeedFile)) + { + searchedPaths.Add(SeedFile); + return File.Exists(SeedFile) ? SeedFile : null; + } + + List directories = new List { Root, System.IO.Path.Combine(Root, "files") }; + foreach (string filePath in FilePaths) + { + directories.Add(filePath); + directories.Add(System.IO.Path.Combine(filePath, "files")); + } + + foreach (string directory in directories) + { + string candidate; + try + { + candidate = System.IO.Path.GetFullPath(System.IO.Path.Combine(directory, SeedFile)); + } + catch (Exception) + { + continue; + } + + if (searchedPaths.Contains(candidate)) + { + continue; + } + + searchedPaths.Add(candidate); + if (File.Exists(candidate)) + { + return candidate; + } + } + + return null; + } + + /// + /// True when the workflow contains at least one step whose measure directory name marks + /// it as an EnergyPlus measure by convention. Used only to decide whether to warn that + /// such a measure's changes live in the generated IDF and cannot appear in the OSM; a + /// heuristic, because measure type is declared in measure.xml, not in the OSW. + /// + public bool MayContainEnergyPlusMeasures + { + get { return StepMeasureNames.Count > 0; } + } + + /// + /// Writes a copy of this workflow into with every path field + /// made absolute. + /// + /// The copy exists so concurrent imports of the same OSW cannot collide: the CLI writes + /// its run folder next to the workflow file, so running the original in place would give + /// two parallel imports one shared run directory. Staging the copy in a unique + /// directory is what provides that isolation. + /// + /// + /// run_directory is pinned to <directory>/run — see the comment on the + /// assignment. Neither leaving it unset nor pinning the staged directory itself works: + /// the first lets the CLI's output escape to the original workflow's folder, the second + /// writes it to the staged root where does not + /// look, silently losing the results and the EnergyPlus error report. + /// + /// + /// Only path fields are rewritten — steps and their arguments are copied verbatim, + /// so the workflow that executes is the one the caller supplied. + /// + /// + /// Isolated run directory; created when absent. + /// Absolute seed path to write, when one was resolved. + /// Path of the written OSW copy. + public string WriteIsolatedCopy(string directory, string resolvedSeedPath) + { + Directory.CreateDirectory(directory); + + JsonObject copy = Document.DeepClone() as JsonObject; + + copy["root"] = Root.Replace('\\', '/'); + + // run_directory must be pinned to /run — the "run" subdirectory matters. + // + // Neither obvious alternative works. Leaving it unset makes the CLI resolve the run + // folder relative to "root", which points at the ORIGINAL workflow's directory, so the + // output escapes the staged directory entirely and two parallel imports collide again. + // Pinning it to the staged directory itself makes the CLI write eplusout.sql, + // eplusout.err and in.osm into that directory's ROOT, with no run/ subdirectory, while + // OpenStudioSimulationRunner reads them from /run — so the results and, worse, + // the EnergyPlus error report are silently missed. + // + // Pinning /run satisfies both: the output stays inside the staged directory + // (isolation) and lands exactly where the runner looks (diagnostics preserved). + copy["run_directory"] = System.IO.Path.Combine(System.IO.Path.GetFullPath(directory), "run").Replace('\\', '/'); + + if (!string.IsNullOrWhiteSpace(resolvedSeedPath)) + { + copy["seed_file"] = System.IO.Path.GetFullPath(resolvedSeedPath).Replace('\\', '/'); + } + + if (!string.IsNullOrWhiteSpace(WeatherFile) && !System.IO.Path.IsPathRooted(WeatherFile)) + { + string weatherPath = ResolveRelative(WeatherFile); + if (weatherPath != null) + { + copy["weather_file"] = weatherPath.Replace('\\', '/'); + } + } + + // measure_paths and file_paths must survive as absolute paths: the copy no longer + // sits beside the original workflow, so anything relative would resolve elsewhere. + RewritePathArray(copy, "measure_paths"); + RewritePathArray(copy, "file_paths"); + + string result = System.IO.Path.Combine(directory, System.IO.Path.GetFileName(Path)); + File.WriteAllText(result, copy.ToJsonString(new JsonSerializerOptions { WriteIndented = true })); + return result; + } + + private void RewritePathArray(JsonObject jsonObject, string key) + { + JsonArray jsonArray = jsonObject[key] as JsonArray; + if (jsonArray == null) + { + return; + } + + JsonArray replacement = new JsonArray(); + foreach (JsonNode node in jsonArray) + { + string value = node?.GetValue(); + if (string.IsNullOrWhiteSpace(value)) + { + continue; + } + + string resolved = System.IO.Path.IsPathRooted(value) ? System.IO.Path.GetFullPath(value) : ResolveRelative(value); + replacement.Add(JsonValue.Create((resolved ?? value).Replace('\\', '/'))); + } + + jsonObject[key] = replacement; + } + + private string ResolveRelative(string value) + { + try + { + return System.IO.Path.GetFullPath(System.IO.Path.Combine(Root, value)); + } + catch (Exception) + { + return null; + } + } + + private static string StringValue(JsonObject jsonObject, string key) + { + if (jsonObject == null) + { + return null; + } + + JsonNode jsonNode; + if (!jsonObject.TryGetPropertyValue(key, out jsonNode) || jsonNode == null) + { + return null; + } + + try + { + return jsonNode.GetValue(); + } + catch (Exception) + { + return null; + } + } + + /// + /// Locates the OSM a completed workflow produced — the model after all model measures + /// have run, which is what an import must convert. + /// + /// The order is deterministic and never trusts a single unverified filename: the + /// osm_path recorded in the run's out.osw, then the CLI's conventional + /// run/in.osm, then the newest OSM written under the run directory after the run + /// started. The timestamp bound matters — a stale OSM left by an earlier run must not be + /// mistaken for this run's output. + /// + /// + /// Directory the workflow ran in. + /// When the run started; older files are ignored. + /// How the OSM was located, for the diagnostic record. + /// The final OSM path, or null. + public static string FindFinalOsm(string runDirectory, DateTime runStartedUtc, out string how) + { + how = null; + + if (string.IsNullOrWhiteSpace(runDirectory) || !Directory.Exists(runDirectory)) + { + return null; + } + + foreach (string outOswPath in new[] { System.IO.Path.Combine(runDirectory, "out.osw"), System.IO.Path.Combine(runDirectory, "run", "out.osw") }) + { + string recorded = OsmPathFromOutOsw(outOswPath); + if (recorded != null && File.Exists(recorded)) + { + how = string.Format("recorded as osm_path in {0}", outOswPath); + return recorded; + } + } + + string inOsm = System.IO.Path.Combine(runDirectory, "run", "in.osm"); + if (File.Exists(inOsm)) + { + how = "the CLI's run/in.osm"; + return inOsm; + } + + string newest = null; + DateTime newestWriteUtc = DateTime.MinValue; + try + { + foreach (string candidate in Directory.GetFiles(runDirectory, "*.osm", SearchOption.AllDirectories)) + { + DateTime writeUtc = File.GetLastWriteTimeUtc(candidate); + + // One second of slack: file timestamps and the process clock are not the same + // clock, and a model written in the run's first moments is still this run's. + if (writeUtc.AddSeconds(1) < runStartedUtc || writeUtc <= newestWriteUtc) + { + continue; + } + + newest = candidate; + newestWriteUtc = writeUtc; + } + } + catch (Exception) + { + return null; + } + + if (newest != null) + { + how = string.Format("the newest OSM written under the run directory after the run started ({0})", newest); + } + + return newest; + } + + /// Reads the osm_path the CLI recorded in an out.osw, or null. + private static string OsmPathFromOutOsw(string outOswPath) + { + if (!File.Exists(outOswPath)) + { + return null; + } + + try + { + JsonObject jsonObject = JsonNode.Parse(File.ReadAllText(outOswPath)) as JsonObject; + string value = StringValue(jsonObject, "osm_path"); + if (string.IsNullOrWhiteSpace(value)) + { + return null; + } + + // Always normalised: the CLI writes forward-slashed paths even on Windows, and a + // caller comparing the returned path against its own would otherwise fail on + // separators alone. + return System.IO.Path.GetFullPath(System.IO.Path.IsPathRooted(value) + ? value + : System.IO.Path.Combine(System.IO.Path.GetDirectoryName(outOswPath), value)); + } + catch (Exception) + { + return null; + } + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/OpenStudioZoneSizingResult.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/OpenStudioZoneSizingResult.cs new file mode 100644 index 0000000..a8c8d7c --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/OpenStudioZoneSizingResult.cs @@ -0,0 +1,179 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +namespace SAM.Analytical.OpenStudio +{ + /// + /// One row of the EnergyPlus SQL ZoneSizes table: the zone sizing outcome for a single + /// zone and load type, produced by the design-day sizing periods (NOT by the annual weather run). + /// Immutable. + /// + /// + /// + /// This is the route's genuinely sizing-derived load, which is what METRICS.md defines a design + /// load to be — distinct from the annual simulated peak (Load/LoadIndex), which comes + /// from the weather RunPeriod and must never be relabelled as a design load. + /// + /// + /// Every column is preserved for auditability, but only populates + /// the v1 benchmark designLoad metric — the unaltered thermal load calculated from the + /// design-day weather and schedules. is the capacity AFTER sizing factors + /// and other user adjustments; folding it into a cross-engine comparison would mix a user-configured + /// margin into an engine-physics question (a 1.25 heating factor put every UserDesLoad exactly 25% + /// above the calculated load on the HungaryHouse run), so it is kept for the sizing-capacity audit and + /// may later be exposed as its own metric. + /// + /// + public sealed class OpenStudioZoneSizingResult + { + /// Creates an immutable zone-sizing result. + /// EnergyPlus zone name (SQL ZoneSizes.ZoneName). + /// Sizing load type as reported by EnergyPlus (Heating/Cooling). + /// Unaltered calculated zone design load [W]. + /// Design load after sizing factors/user adjustments [W]. + /// Unaltered calculated design air flow rate [m3/s]. + /// Design air flow rate after sizing factors/user adjustments [m3/s]. + /// Name of the design day that produced the peak. + /// EnergyPlus peak time stamp as reported (M/D HH:MM:SS). + /// SQL ZoneSizes.PeakTemp verbatim [C]; see the property for its unsettled scope. + /// Humidity ratio at the peak [kgWater/kgDryAir]. + /// + /// SQL ZoneSizes.ZoneSizesIndex (the table's primary key), or any caller-assigned read + /// order. It exists solely to make ordering TOTAL: alone cannot separate two + /// rows that share a zone and load type, so without this the surviving row of a duplicate pair + /// would depend on the order the database happened to return. + /// + public OpenStudioZoneSizingResult( + string zoneName, + string loadType, + double? calculatedDesignLoad, + double? userDesignLoad, + double? calculatedDesignFlow, + double? userDesignFlow, + string designDayName, + string peakTime, + double? peakTemperature, + double? peakHumidityRatio, + long sourceIndex = 0) + { + SourceIndex = sourceIndex; + ZoneName = zoneName; + LoadType = loadType; + CalculatedDesignLoad = calculatedDesignLoad; + UserDesignLoad = userDesignLoad; + CalculatedDesignFlow = calculatedDesignFlow; + UserDesignFlow = userDesignFlow; + DesignDayName = designDayName; + PeakTime = peakTime; + PeakTemperature = peakTemperature; + PeakHumidityRatio = peakHumidityRatio; + } + + /// EnergyPlus zone name the row was reported for. + public string ZoneName { get; } + + /// Sizing load type as EnergyPlus reported it (Heating or Cooling). + public string LoadType { get; } + + /// + /// Unaltered calculated zone design load [W] (SQL CalcDesLoad): the thermal load from the + /// design-day weather and schedules, before any sizing factor. This is the v1 benchmark + /// designLoad. + /// + public double? CalculatedDesignLoad { get; } + + /// + /// Capacity after sizing factors and user adjustments [W] (SQL UserDesLoad): what components + /// are sized with. Audit-only — deliberately not the benchmark metric, so a configured sizing margin + /// cannot enter a cross-engine comparison. + /// + public double? UserDesignLoad { get; } + + /// Unaltered calculated design air flow rate [m3/s]. + public double? CalculatedDesignFlow { get; } + + /// Design air flow rate after sizing factors/user adjustments [m3/s]. + public double? UserDesignFlow { get; } + + /// Name of the design day that produced this peak. + public string DesignDayName { get; } + + /// EnergyPlus peak time stamp exactly as reported (M/D HH:MM:SS). + public string PeakTime { get; } + + /// + /// SQL ZoneSizes.PeakTemp [C], carried verbatim and deliberately NOT interpreted. + /// + /// + /// Its scope is unsettled and must not be asserted by this type. The EnergyPlus engineering + /// reference describes the zone sizing peak temperature as a ZONE value + /// (ZoneTempAtHeatPeak/ZoneTempAtCoolPeak); however, on the HungaryHouse benchmark + /// run every row carried -3.20000004768372, bit-identical to the design day's OUTDOOR + /// maximum dry bulb, where a heated zone would have sat at its setpoint instead. Until the + /// design-day audit settles which it is, no consumer should map this onto an outdoor or a zone + /// temperature parameter — which is why Convert.ToSAM_SpaceDesignLoadResults does not. + /// + public double? PeakTemperature { get; } + + /// SQL ZoneSizes.PeakHumRat [kgWater/kgDryAir], carried verbatim; same scope caveat as . + public double? PeakHumidityRatio { get; } + + /// The SAM this row's text maps to. + public LoadType SamLoadType + { + get + { + if (string.Equals(LoadType, "Heating", System.StringComparison.OrdinalIgnoreCase)) + { + return Analytical.LoadType.Heating; + } + + return string.Equals(LoadType, "Cooling", System.StringComparison.OrdinalIgnoreCase) + ? Analytical.LoadType.Cooling + : Analytical.LoadType.Undefined; + } + } + + /// + /// The row's source order (SQL ZoneSizesIndex where available). Used only as the ordering + /// tie-breaker for rows sharing a ; it is not part of the result's identity. + /// + public long SourceIndex { get; } + + /// + /// The ordinal grouping key ZoneName|LoadType. NOT unique on its own: EnergyPlus writes one + /// row per zone and load type, but a duplicate pair is possible, which is why ordering uses + /// and duplicates are reported rather than silently resolved. + /// + public string Key => (ZoneName ?? string.Empty) + "|" + (LoadType ?? string.Empty); + + /// + /// A TOTAL ordinal ordering key: , then , then every + /// payload field. Ordering on the key and index alone is not enough — a caller that does not + /// supply a source index leaves duplicates sharing the default, the comparison then reports + /// equality, and because is unstable the row a + /// consumer treats as "first" would flip with the input order. Including the payload means two + /// entries can only compare equal when they are genuinely indistinguishable, so which one is + /// chosen cannot matter. + /// + public string SortSignature => string.Join("|", new string[] + { + Key, + SourceIndex.ToString("D19", System.Globalization.CultureInfo.InvariantCulture), + Number(UserDesignLoad), + Number(CalculatedDesignLoad), + Number(UserDesignFlow), + Number(CalculatedDesignFlow), + DesignDayName ?? string.Empty, + PeakTime ?? string.Empty, + Number(PeakTemperature), + Number(PeakHumidityRatio) + }); + + /// Invariant, round-trippable text for a nullable number; empty for null. + private static string Number(double? value) + { + return value.HasValue ? value.Value.ToString("R", System.Globalization.CultureInfo.InvariantCulture) : string.Empty; + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/ProcessJobObject.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/ProcessJobObject.cs new file mode 100644 index 0000000..8e4fd4b --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/ProcessJobObject.cs @@ -0,0 +1,176 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Diagnostics; +using System.Runtime.InteropServices; + +namespace SAM.Analytical.OpenStudio +{ + /// + /// Best-effort Windows Job Object wrapper used to terminate a process tree on timeout: + /// every child the CLI spawns (EnergyPlus) belongs to the job and is closed with it + /// (JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE). All operations degrade silently — when job + /// creation or assignment fails the caller falls back to killing the root process only. + /// + internal static class ProcessJobObject + { + private const int JobObjectExtendedLimitInformation = 9; + private const uint JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE = 0x2000; + + [StructLayout(LayoutKind.Sequential)] + private struct IO_COUNTERS + { + public ulong ReadOperationCount; + public ulong WriteOperationCount; + public ulong OtherOperationCount; + public ulong ReadTransferCount; + public ulong WriteTransferCount; + public ulong OtherTransferCount; + } + + [StructLayout(LayoutKind.Sequential)] + private struct JOBOBJECT_BASIC_LIMIT_INFORMATION + { + public long PerProcessUserTimeLimit; + public long PerJobUserTimeLimit; + public uint LimitFlags; + public UIntPtr MinimumWorkingSetSize; + public UIntPtr MaximumWorkingSetSize; + public uint ActiveProcessLimit; + public IntPtr Affinity; + public uint PriorityClass; + public uint SchedulingClass; + } + + [StructLayout(LayoutKind.Sequential)] + private struct JOBOBJECT_EXTENDED_LIMIT_INFORMATION + { + public JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation; + public IO_COUNTERS IoInfo; + public UIntPtr ProcessMemoryLimit; + public UIntPtr JobMemoryLimit; + public UIntPtr PeakProcessMemoryUsed; + public UIntPtr PeakJobMemoryUsed; + } + + [DllImport("kernel32.dll", SetLastError = true)] + private static extern IntPtr CreateJobObject(IntPtr lpJobAttributes, string lpName); + + [DllImport("kernel32.dll", SetLastError = true)] + private static extern bool SetInformationJobObject(IntPtr hJob, int jobObjectInformationClass, IntPtr lpJobObjectInformation, uint cbJobObjectInformationLength); + + [DllImport("kernel32.dll", SetLastError = true)] + private static extern bool AssignProcessToJobObject(IntPtr hJob, IntPtr hProcess); + + [DllImport("kernel32.dll", SetLastError = true)] + private static extern bool TerminateJobObject(IntPtr hJob, uint uExitCode); + + [DllImport("kernel32.dll", SetLastError = true)] + private static extern bool CloseHandle(IntPtr hObject); + + /// Creates a kill-on-close job object, or on failure. + public static IntPtr CreateKillOnCloseJob() + { + try + { + IntPtr jobHandle = CreateJobObject(IntPtr.Zero, null); + if (jobHandle == IntPtr.Zero) + { + return IntPtr.Zero; + } + + JOBOBJECT_EXTENDED_LIMIT_INFORMATION information = new JOBOBJECT_EXTENDED_LIMIT_INFORMATION + { + BasicLimitInformation = new JOBOBJECT_BASIC_LIMIT_INFORMATION + { + LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE, + }, + }; + + int length = Marshal.SizeOf(typeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION)); + IntPtr pointer = Marshal.AllocHGlobal(length); + try + { + Marshal.StructureToPtr(information, pointer, false); + if (!SetInformationJobObject(jobHandle, JobObjectExtendedLimitInformation, pointer, (uint)length)) + { + CloseHandle(jobHandle); + return IntPtr.Zero; + } + } + finally + { + Marshal.FreeHGlobal(pointer); + } + + return jobHandle; + } + catch (Exception) + { + return IntPtr.Zero; + } + } + + /// Assigns a process to the job (best effort; returns false on failure). + public static bool TryAssign(IntPtr jobHandle, Process process) + { + if (jobHandle == IntPtr.Zero || process == null) + { + return false; + } + + try + { + bool result = AssignProcessToJobObject(jobHandle, process.Handle); + if (!result) + { + System.Diagnostics.Debug.WriteLine("ProcessJobObject: AssignProcessToJobObject failed, error " + Marshal.GetLastWin32Error()); + } + + return result; + } + catch (Exception exception) + { + System.Diagnostics.Debug.WriteLine("ProcessJobObject: assignment threw " + exception.GetType().Name); + return false; + } + } + + /// Terminates every process currently assigned to the job (best effort). + public static void Terminate(IntPtr jobHandle) + { + if (jobHandle == IntPtr.Zero) + { + return; + } + + try + { + TerminateJobObject(jobHandle, 1); + } + catch (Exception) + { + // best effort only + } + } + + /// Closes the job handle, terminating any processes still assigned to it. + public static void Close(IntPtr jobHandle) + { + if (jobHandle == IntPtr.Zero) + { + return; + } + + try + { + CloseHandle(jobHandle); + } + catch (Exception) + { + // best effort only + } + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/AnalyticalModel.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/AnalyticalModel.cs new file mode 100644 index 0000000..a79d7f2 --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/AnalyticalModel.cs @@ -0,0 +1,716 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Convert + { + /// + /// Converts a SAM AnalyticalModel to an OpenStudio model (geometry scope: stories, spaces, + /// thermal zones, surfaces, subsurfaces, shading; constructions/loads/HVAC follow in later + /// milestones). The source model is never mutated: a copy receives the established SAM + /// preprocessing (OffsetAperturesOnEdge, ReplaceTransparentPanels — as SAM_LadybugTools). + /// Conversion runs in passes: A) stories/spaces/zones; B) space-facing panels from + /// AdjacencyCluster.UpdateNormals → surfaces and subsurfaces; C) boundary conditions and + /// explicit adjacency pairing from SAM topology (never geometric matching). All + /// deviations are reported through diagnostics on the returned result. + /// + /// Source SAM analytical model. + /// Options; defaults are used when null. + /// Conversion result with model, diagnostics and object map; null when input is null. + public static OpenStudioConversionResult ToOpenStudio(this AnalyticalModel analyticalModel, Core.OpenStudio.OpenStudioConversionOptions openStudioConversionOptions = null) + { + OpenStudioConversionContext context = ToOpenStudio_Context(analyticalModel, openStudioConversionOptions); + return context == null ? null : new OpenStudioConversionResult(context); + } + + /// + /// Full MVP pipeline (plan §3): converts the model, assigns the EPW weather and MVP + /// simulation settings, saves the OSM, generates the OSW, runs the OpenStudio CLI and + /// extracts annual Ideal Loads energy. The returned result carries paths, run outcome, + /// loads and every diagnostic raised along the way. + /// + /// Source SAM analytical model. + /// EPW weather file (explicit input; SAM weather is not consulted). + /// Directory for the OSM/OSW and the isolated run folder. + /// Conversion options; defaults when null. + /// Run options (CLI path, timeout); defaults when null. + /// False converts and saves OSM/OSW without executing the CLI. + /// Optional stage progress sink. + /// Cancellation; kills the CLI/EnergyPlus process tree when triggered. + /// Conversion result including RunResult and Loads; null when input is null. + public static OpenStudioConversionResult ToOpenStudio(this AnalyticalModel analyticalModel, string epwPath, string outputDirectory, Core.OpenStudio.OpenStudioConversionOptions openStudioConversionOptions = null, Core.OpenStudio.OpenStudioRunOptions openStudioRunOptions = null, bool run = true, System.IProgress progress = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + OpenStudioConversionContext context = ToOpenStudio_ContextWithSite(analyticalModel, epwPath, openStudioConversionOptions, openStudioRunOptions, run); + if (context == null) + { + return null; + } + + return OpenStudioSimulationRunner.Run(context, context.EpwPath ?? epwPath, outputDirectory, openStudioRunOptions, run, progress, cancellationToken); + } + + /// + /// Asynchronous full pipeline (C6): conversion executes inline (fast CPU work), the + /// save → OSW → CLI → parse pipeline on a worker thread; cancellation terminates the + /// CLI/EnergyPlus process tree. Progress stages are reported through + /// . + /// + public static System.Threading.Tasks.Task ToOpenStudioAsync(this AnalyticalModel analyticalModel, string epwPath, string outputDirectory, Core.OpenStudio.OpenStudioConversionOptions openStudioConversionOptions = null, Core.OpenStudio.OpenStudioRunOptions openStudioRunOptions = null, bool run = true, System.IProgress progress = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + OpenStudioConversionContext context = ToOpenStudio_ContextWithSite(analyticalModel, epwPath, openStudioConversionOptions, openStudioRunOptions, run); + if (context == null) + { + return System.Threading.Tasks.Task.FromResult(null); + } + + return OpenStudioSimulationRunner.RunAsync(context, context.EpwPath ?? epwPath, outputDirectory, openStudioRunOptions, run, progress, cancellationToken); + } + + private static OpenStudioConversionContext ToOpenStudio_ContextWithSite(AnalyticalModel analyticalModel, string epwPath, Core.OpenStudio.OpenStudioConversionOptions openStudioConversionOptions, Core.OpenStudio.OpenStudioRunOptions openStudioRunOptions, bool run) + { + // Annual weather source precedence (documented contract): + // 1. the explicit EPW path, when supplied and valid; + // 2. WeatherData embedded in the AnalyticalModel, exported through the existing + // SAM.Weather ToEPW API when it carries hourly weather years; + // 3. otherwise a blocking diagnostic when an annual run was requested (a + // conversion-only run stays valid with a warning). + // The source is resolved before the context is built: the run-calendar offset must + // be known before any profile is converted. + string epwPath_Effective = !string.IsNullOrWhiteSpace(epwPath) && System.IO.File.Exists(epwPath) ? epwPath : null; + bool embeddedWeatherSource = false; + bool invalidExplicitEpwPath = false; + if (epwPath_Effective == null) + { + invalidExplicitEpwPath = !string.IsNullOrWhiteSpace(epwPath); + epwPath_Effective = analyticalModel.EmbeddedAnnualWeatherPath(); + embeddedWeatherSource = epwPath_Effective != null; + } + + OpenStudioConversionContext context = ToOpenStudio_Context(analyticalModel, openStudioConversionOptions, FirstDayOfWeekOffset(epwPath_Effective, openStudioConversionOptions)); + if (context == null) + { + return null; + } + + if (invalidExplicitEpwPath) + { + context.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.WeatherDataIssue, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("The explicit EPW path is not usable: {0}; falling back to the AnalyticalModel WeatherData", epwPath)); + } + + context.EpwPath = epwPath_Effective; + + context.ToOpenStudio_Weather(epwPath_Effective, run, embeddedWeatherSource); + + // Design-day source precedence (documented contract): + // 1. an explicit DDY path (run option takes precedence over the conversion option); + // 2. HeatingDesignDays/CoolingDesignDays embedded in the AnalyticalModel; + // 3. no design days. Explicit DDY and embedded design days are never merged. + string ddyPath = !string.IsNullOrWhiteSpace(openStudioRunOptions?.DdyPath) ? openStudioRunOptions.DdyPath : openStudioConversionOptions?.DdyPath; + if (!string.IsNullOrWhiteSpace(ddyPath) && System.IO.File.Exists(ddyPath)) + { + context.ToOpenStudio_DesignDays(ddyPath); + context.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.WeatherDataIssue, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, string.Format("Design-day source: explicit DDY ({0}); embedded AnalyticalModel design days are not merged", System.IO.Path.GetFileName(ddyPath))); + } + else + { + if (!string.IsNullOrWhiteSpace(ddyPath)) + { + context.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.WeatherDataIssue, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("The explicit DDY path is not usable: {0}; falling back to the AnalyticalModel design days", ddyPath)); + } + + Core.SAMCollection heatingDesignDays = null; + context.Source?.TryGetValue(AnalyticalModelParameter.HeatingDesignDays, out heatingDesignDays); + + Core.SAMCollection coolingDesignDays = null; + context.Source?.TryGetValue(AnalyticalModelParameter.CoolingDesignDays, out coolingDesignDays); + + int embeddedCount = context.ToOpenStudio_DesignDays(heatingDesignDays, coolingDesignDays); + if (embeddedCount > 0) + { + context.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.WeatherDataIssue, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, string.Format("Design-day source: AnalyticalModel heating/cooling design days ({0} imported)", embeddedCount)); + } + else + { + context.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.WeatherDataIssue, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, "No design-day source supplied; sizing-period runs stay disabled unless OpenStudioConversionOptions.RunSizingPeriods overrides"); + } + } + + context.ToOpenStudio_SimulationSettings(); + return context; + } + + /// + /// Resolves the 1-Jan day-of-week offset (Monday = 0 … Sunday = 6) used to align weekly + /// profiles: the explicit + /// when set, otherwise the EPW weather file's declared start day of week; 0 (Monday) when + /// neither is available. + /// + private static int FirstDayOfWeekOffset(string epwPath, Core.OpenStudio.OpenStudioConversionOptions openStudioConversionOptions) + { + if (openStudioConversionOptions?.FirstDayOfWeek != null) + { + return ((int)openStudioConversionOptions.FirstDayOfWeek.Value + 6) % 7; + } + + if (!string.IsNullOrWhiteSpace(epwPath) && System.IO.File.Exists(epwPath)) + { + global::OpenStudio.OptionalEpwFile optionalEpwFile = global::OpenStudio.EpwFile.load(global::OpenStudio.OpenStudioUtilitiesCore.toPath(epwPath)); + if (optionalEpwFile != null && !optionalEpwFile.isNull()) + { + return (optionalEpwFile.get().startDayOfWeek().value() + 6) % 7; + } + } + + return 0; + } + + private static OpenStudioConversionContext ToOpenStudio_Context(AnalyticalModel analyticalModel, Core.OpenStudio.OpenStudioConversionOptions openStudioConversionOptions, int? firstDayOfWeekOffset = null) + { + if (analyticalModel == null) + { + return null; + } + + Core.OpenStudio.OpenStudioConversionOptions options = openStudioConversionOptions ?? new Core.OpenStudio.OpenStudioConversionOptions(); + + AnalyticalModel analyticalModel_Temp = new AnalyticalModel(analyticalModel); + analyticalModel_Temp.OffsetAperturesOnEdge(0.1, options.DistanceTolerance); + analyticalModel_Temp.ReplaceTransparentPanels(0.1); + + OpenStudioConversionContext context = new OpenStudioConversionContext(analyticalModel_Temp, new global::OpenStudio.Model(), options); + if (firstDayOfWeekOffset.HasValue) + { + context.FirstDayOfWeekOffset = firstDayOfWeekOffset.Value; + } + else if (options.FirstDayOfWeek != null) + { + context.FirstDayOfWeekOffset = ((int)options.FirstDayOfWeek.Value + 6) % 7; + } + + // Model-level round-trip identity on the Building (the OSM has no model-level object + // to hang it on). Additive metadata only: the Building name, north axis and every + // other field are left exactly as they were. + Core.OpenStudio.Modify.SetSAMIdentity(context.Target.getBuilding(), analyticalModel.Guid, analyticalModel.GetType().Name, analyticalModel.Name); + + AdjacencyCluster adjacencyCluster = analyticalModel_Temp.AdjacencyCluster; + if (adjacencyCluster == null) + { + context.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.AdjacencyMissingSurface, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "AnalyticalModel has no AdjacencyCluster; nothing to convert", analyticalModel); + return context; + } + + SortedList buildingStories = context.ToOpenStudio_BuildingStories(); + + List sourcePanels = adjacencyCluster.GetPanels(); + int sourceApertureCount = 0; + if (sourcePanels != null) + { + foreach (Panel sourcePanel in sourcePanels) + { + List sourceApertures = sourcePanel?.Apertures; + if (sourceApertures != null) + { + sourceApertureCount += sourceApertures.Count; + } + } + } + + Dictionary> surfacesByPanel = new Dictionary>(); + Dictionary panelByGuid = new Dictionary(); + Dictionary> subSurfacesByAperture = new Dictionary>(); + HashSet spacesWithSurfaces = new HashSet(); + + List spaces = adjacencyCluster.GetSpaces(); + context.Statistics.SourceObjects = (spaces?.Count ?? 0) + (sourcePanels?.Count ?? 0) + sourceApertureCount; + if (spaces == null || spaces.Count == 0) + { + context.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.AdjacencyMissingSurface, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "AnalyticalModel contains no spaces", analyticalModel); + } + else + { + foreach (Space space in spaces) + { + if (space == null) + { + continue; + } + + global::OpenStudio.Space openStudioSpace = space.ToOpenStudio(context); + if (openStudioSpace == null) + { + continue; + } + + if (buildingStories.Count > 0) + { + double elevation; + try + { + elevation = space.MinElevation(adjacencyCluster); + } + catch (System.Exception) + { + elevation = double.NaN; + } + + if (!double.IsNaN(elevation)) + { + double difference_Min = double.MaxValue; + global::OpenStudio.BuildingStory buildingStory_Min = null; + foreach (KeyValuePair keyValuePair in buildingStories) + { + double difference = Math.Abs(keyValuePair.Key - elevation); + if (difference < difference_Min) + { + difference_Min = difference; + buildingStory_Min = keyValuePair.Value; + } + } + + if (buildingStory_Min != null) + { + openStudioSpace.setBuildingStory(buildingStory_Min); + } + } + } + + InternalCondition internalCondition = space.InternalCondition; + if (internalCondition != null) + { + global::OpenStudio.SpaceType spaceType = internalCondition.ToOpenStudio(space, context); + if (spaceType != null) + { + openStudioSpace.setSpaceType(spaceType); + } + } + + if (space.TryGetValue(SpaceParameter.OutsideSupplyAirFlow, out double outsideSupplyAirFlow) && !double.IsNaN(outsideSupplyAirFlow) && outsideSupplyAirFlow > 0) + { + global::OpenStudio.DesignSpecificationOutdoorAir designSpecificationOutdoorAir = new global::OpenStudio.DesignSpecificationOutdoorAir(context.Target); + designSpecificationOutdoorAir.setName(Core.OpenStudio.Query.OpenStudioName("DesignSpecificationOutdoorAir", space.Name, space.Guid)); + designSpecificationOutdoorAir.setOutdoorAirFlowRate(outsideSupplyAirFlow); + openStudioSpace.setDesignSpecificationOutdoorAir(designSpecificationOutdoorAir); + } + + int index = adjacencyCluster.GetIndex(space); + List panels; + try + { + panels = adjacencyCluster.UpdateNormals(space, false, true, false, Core.Tolerance.MacroDistance, options.DistanceTolerance); + } + catch (System.Exception exception) + { + context.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.GeometryInvalidBoundary, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("The space shell could not be computed ({0}); no surfaces were created for the space", exception.GetType().Name), space); + context.RegisterSkip(); + continue; + } + + if (panels == null || panels.Count == 0) + { + context.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.AdjacencyMissingSurface, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "Space has no related panels; no surfaces were created", space); + context.RegisterSkip(); + continue; + } + + foreach (IPanel iPanel in panels) + { + Panel panel = iPanel as Panel; + if (panel == null) + { + context.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.GeometryInvalidBoundary, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Unsupported panel kind {0}; skipped", iPanel?.GetType()?.Name), space); + context.RegisterSkip(); + continue; + } + + if (panel.PanelType == PanelType.Shade) + { + continue; + } + + global::OpenStudio.Surface surface; + try + { + surface = panel.ToOpenStudio(openStudioSpace, index, context, subSurfacesByAperture); + } + catch (System.Exception exception) + { + context.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.GeometryInvalidBoundary, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("Panel geometry could not be converted ({0}); the panel was skipped, never repaired", exception.GetType().Name), panel); + context.RegisterSkip(); + continue; + } + + if (surface == null) + { + continue; + } + + List surfaces; + if (!surfacesByPanel.TryGetValue(panel.Guid, out surfaces)) + { + surfaces = new List(); + surfacesByPanel[panel.Guid] = surfaces; + } + + surfaces.Add(surface); + panelByGuid[panel.Guid] = panel; + spacesWithSurfaces.Add(space.Guid); + } + } + } + + // No silent drops: any panel related to a space that never became a surface + // (excluded from the computed space shell — degenerate or disconnected geometry, + // or rejected by validation) is reported explicitly. + if (spaces != null) + { + HashSet reportedPanels = new HashSet(); + foreach (Space space in spaces) + { + if (space == null) + { + continue; + } + + List relatedPanels = adjacencyCluster.GetPanels(space); + if (relatedPanels == null) + { + continue; + } + + foreach (Panel relatedPanel in relatedPanels) + { + if (relatedPanel == null || relatedPanel.PanelType == PanelType.Shade) + { + continue; + } + + if (!surfacesByPanel.ContainsKey(relatedPanel.Guid) && reportedPanels.Add(relatedPanel.Guid)) + { + context.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.GeometryInvalidBoundary, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "Panel related to a space produced no surface (excluded from the space shell — degenerate or disconnected geometry); it was skipped, never repaired", relatedPanel); + context.RegisterSkip(); + } + } + } + } + + foreach (KeyValuePair> keyValuePair in surfacesByPanel) + { + Panel panel = panelByGuid[keyValuePair.Key]; + List surfaces = keyValuePair.Value; + string boundaryCondition = panel.OutsideBoundaryCondition(); + + if (boundaryCondition == "Surface") + { + if (surfaces.Count >= 2) + { + if (surfaces.Count > 2) + { + context.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.AdjacencyMissingSurface, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Internal panel produced {0} surfaces; only the first two were paired", surfaces.Count), panel); + } + + if (!surfaces[0].setAdjacentSurface(surfaces[1])) + { + context.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.AdjacencyMissingSurface, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "OpenStudio rejected the adjacent-surface pairing; Adiabatic applied to both sides", panel); + foreach (global::OpenStudio.Surface surface in surfaces) + { + surface.setOutsideBoundaryCondition("Adiabatic"); + } + } + } + else + { + context.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.AdjacencyMissingSurface, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "Internal panel bounds a single space; Adiabatic applied", panel); + surfaces[0].setOutsideBoundaryCondition("Adiabatic"); + } + } + else if (boundaryCondition != null) + { + foreach (global::OpenStudio.Surface surface in surfaces) + { + surface.setOutsideBoundaryCondition(boundaryCondition); + } + + if (boundaryCondition == "Outdoors") + { + EmitNonConvexCastingDiagnostic(panel, surfaces[0].nameString(), context); + } + } + else + { + context.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.AdjacencyMissingSurface, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("PanelType {0} has no boundary-condition mapping; Adiabatic applied", panel.PanelType), panel); + foreach (global::OpenStudio.Surface surface in surfaces) + { + surface.setOutsideBoundaryCondition("Adiabatic"); + } + } + } + + foreach (KeyValuePair> keyValuePair in subSurfacesByAperture) + { + List subSurfaces = keyValuePair.Value; + if (subSurfaces.Count >= 2) + { + if (!subSurfaces[0].setAdjacentSubSurface(subSurfaces[1])) + { + context.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.AdjacencyMissingSurface, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "OpenStudio rejected the adjacent-subsurface pairing for an internal aperture", null, subSurfaces[0].nameString()); + } + } + } + + // Pass D: constructions — forward (outside-first, EnergyPlus order) for every + // single-sided surface and the primary side of internal pairs; reverse for the + // paired secondary side; a shared air-boundary construction for Air panels. + global::OpenStudio.ConstructionAirBoundary constructionAirBoundary = null; + foreach (KeyValuePair> keyValuePair in surfacesByPanel) + { + Panel panel = panelByGuid[keyValuePair.Key]; + List surfaces = keyValuePair.Value; + + if (panel.PanelType == PanelType.Air) + { + if (constructionAirBoundary == null) + { + constructionAirBoundary = new global::OpenStudio.ConstructionAirBoundary(context.Target); + constructionAirBoundary.setName("SAM_Construction_AirBoundary"); + ApplyAirBoundaryAirExchange(constructionAirBoundary, context); + } + + foreach (global::OpenStudio.Surface surface in surfaces) + { + surface.setConstruction(constructionAirBoundary); + } + + continue; + } + + Construction construction = panel.Construction; + if (construction == null) + { + context.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ConstructionMissingLayer, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "Panel has no construction", panel); + continue; + } + + global::OpenStudio.Construction forwardConstruction = construction.ToOpenStudio(true, context); + if (forwardConstruction == null) + { + continue; + } + + surfaces[0].setConstruction(forwardConstruction); + + if (surfaces.Count >= 2) + { + global::OpenStudio.Construction reverseConstruction = construction.ToOpenStudio(false, context); + if (reverseConstruction != null) + { + surfaces[1].setConstruction(reverseConstruction); + } + } + } + + Dictionary apertureByGuid = new Dictionary(); + foreach (Panel panel in panelByGuid.Values) + { + List apertures = panel.Apertures; + if (apertures == null) + { + continue; + } + + foreach (Aperture aperture in apertures) + { + if (aperture != null && !apertureByGuid.ContainsKey(aperture.Guid)) + { + apertureByGuid[aperture.Guid] = aperture; + } + } + } + + foreach (KeyValuePair> keyValuePair in subSurfacesByAperture) + { + Aperture aperture; + if (!apertureByGuid.TryGetValue(keyValuePair.Key, out aperture)) + { + continue; + } + + ApertureConstruction apertureConstruction = aperture.ApertureConstruction; + if (apertureConstruction == null) + { + continue; + } + + List subSurfaces = keyValuePair.Value; + global::OpenStudio.Construction forwardConstruction = apertureConstruction.ToOpenStudio(true, context, aperture); + if (forwardConstruction == null) + { + continue; + } + + subSurfaces[0].setConstruction(forwardConstruction); + + if (subSurfaces.Count >= 2) + { + global::OpenStudio.Construction reverseConstruction = apertureConstruction.ToOpenStudio(false, context, aperture); + if (reverseConstruction != null) + { + subSurfaces[1].setConstruction(reverseConstruction); + } + } + } + + if (options.IncludeShading) + { + context.ToOpenStudio_ShadingSurfaces(); + } + + // Pass E: thermostats and Ideal Loads for conditioned zones only (central + // Query.IsConditioned decision). Unconditioned/external spaces keep geometry + // and internal gains but receive no thermostat and no Ideal Loads system. + if (spaces != null) + { + foreach (Space space in spaces) + { + if (space == null || !space.IsConditioned()) + { + continue; + } + + if (!spacesWithSurfaces.Contains(space.Guid)) + { + // A conditioned zone without surfaces cannot be simulated (EnergyPlus + // fatals on a conditioned zone with no envelope) — reject it explicitly + // instead of attaching a thermostat and Ideal Loads to an empty zone. + context.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.HvacMissingSetpoints, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "Conditioned space has no valid surfaces; thermostat and Ideal Loads were not assigned", space); + context.RegisterSkip(); + continue; + } + + if (!context.TryGetModelObject(space.Guid, out global::OpenStudio.Space openStudioSpace)) + { + continue; + } + + global::OpenStudio.OptionalThermalZone optionalThermalZone = openStudioSpace.thermalZone(); + if (optionalThermalZone == null || optionalThermalZone.isNull()) + { + context.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.HvacMissingSetpoints, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "Conditioned space has no thermal zone", space); + continue; + } + + global::OpenStudio.ThermalZone thermalZone = optionalThermalZone.get(); + + global::OpenStudio.ThermostatSetpointDualSetpoint thermostat = space.ToOpenStudio_Thermostat(thermalZone, context); + space.ToOpenStudio_Humidistat(thermalZone, context); + if (thermostat != null && options.AssignIdealLoads) + { + thermalZone.ToOpenStudio_IdealLoads(space, context); + } + } + } + + return context; + } + + /// + /// Advisory diagnostic for a non-convex shadow-casting surface. With PolygonClipping + /// resolved it is a Warning: EnergyPlus raises a severe DetermineShadowingCombinations + /// error and shadowing may be inaccurate. With PixelCounting resolved it is an + /// Information: the method itself has no concavity limitation, so wherever + /// PixelCounting actually runs the surface is fine — the advisory is a precaution, + /// not GPU detection (the converter never queries for a GPU). Only on a machine + /// without a GPU (or GPU emulation) does EnergyPlus warn in eplusout.err, revert to + /// PolygonClipping, and flag the surface anyway. Best-effort: a geometry-kernel + /// failure skips the advisory, never the surface. + /// + private static void EmitNonConvexCastingDiagnostic(Panel panel, string openStudioObjectName, OpenStudioConversionContext openStudioConversionContext) + { + Geometry.Spatial.Face3D face3D = panel?.GetFace3D(); + Geometry.Spatial.ISegmentable3D segmentable3D = face3D?.GetExternalEdge3D() as Geometry.Spatial.ISegmentable3D; + List point3Ds = segmentable3D?.GetPoints(); + if (point3Ds == null) + { + return; + } + + // Check the polygon EnergyPlus actually sees: the converter's cleaned boundary, + // with near-collinear vertices ignored by the convexity test — a raw CAD shell + // vertex stream would false-positive on every collinear mid-edge point. + point3Ds = Geometry.OpenStudio.Query.CleanVertices(point3Ds, openStudioConversionContext.Options.DistanceTolerance, openStudioConversionContext.Options.AngleTolerance); + if (point3Ds == null || point3Ds.Count < 3) + { + return; + } + + bool convex; + try + { + convex = Geometry.OpenStudio.Query.IsConvex(point3Ds, openStudioConversionContext.Options.AngleTolerance); + } + catch (System.Exception) + { + return; + } + + if (convex) + { + return; + } + + string method = openStudioConversionContext.Options?.ShadingCalculationMethod; + if (string.Equals(method, "PixelCounting", System.StringComparison.OrdinalIgnoreCase)) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.GeometryNonConvexCasting, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, "Non-convex surface casts shadows: PixelCounting (the resolved shading calculation method) has no concavity limitation, so wherever it runs this surface is fine — this advisory is a precaution, not a report that a GPU is missing (the converter does not detect GPUs). The caveat applies only on a machine with no GPU (or GPU emulation): there EnergyPlus warns in eplusout.err, reverts to PolygonClipping, and then reports this surface as a severe DetermineShadowingCombinations error. To be safe on such machines, split the panel into convex parts (e.g. an L-shape into rectangles)", panel, openStudioObjectName); + } + else + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.GeometryNonConvexCasting, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "Non-convex surface casts shadows: with Shading Calculation Method 'PolygonClipping' EnergyPlus reports a severe DetermineShadowingCombinations error and shadowing may be inaccurate — split the panel into convex parts (e.g. an L-shape into rectangles) or use PixelCounting (needs a GPU or GPU emulation; without one EnergyPlus warns and reverts to PolygonClipping)", panel, openStudioObjectName); + } + } + + /// + /// Applies the opt-in inter-zone air exchange to the shared air-boundary construction + /// (coverage manifest: PanelType.Air — Approximated when enabled). + /// + /// An air boundary always groups its two zones for solar, daylighting and radiant + /// exchange; what the EnergyPlus Air Exchange Method field controls is whether AIR + /// moves between them. The default None leaves the zones convectively uncoupled, + /// which under-models a real opening — but SAM carries no per-panel airflow data, so a + /// rate can only come from the caller + /// () + /// and is never inferred. Whichever branch applies is named in a diagnostic: an assumed + /// mixing rate and a deliberately uncoupled boundary are both modelling decisions the + /// reader must see. + /// + /// + private static void ApplyAirBoundaryAirExchange(global::OpenStudio.ConstructionAirBoundary constructionAirBoundary, OpenStudioConversionContext openStudioConversionContext) + { + double airChangesPerHour = openStudioConversionContext.Options.AirBoundaryAirChangesPerHour; + + if (double.IsNaN(airChangesPerHour)) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.InternalConditionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, "Air panel converted with Air Exchange Method 'None': the zones share one radiant/solar enclosure but exchange no air. SAM carries no airflow data for the opening — set OpenStudioConversionOptions.AirBoundaryAirChangesPerHour to model mixing"); + return; + } + + if (double.IsInfinity(airChangesPerHour) || airChangesPerHour < 0) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.InternalConditionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format(System.Globalization.CultureInfo.InvariantCulture, "AirBoundaryAirChangesPerHour {0} is not a valid rate (finite, ≥ 0); Air Exchange Method 'None' kept", airChangesPerHour)); + return; + } + + if (!constructionAirBoundary.setAirExchangeMethod("SimpleMixing")) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.InternalConditionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "OpenStudio rejected the SimpleMixing air exchange method; Air Exchange Method 'None' kept"); + return; + } + + constructionAirBoundary.setSimpleMixingAirChangesPerHour(airChangesPerHour); + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.InternalConditionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, string.Format(System.Globalization.CultureInfo.InvariantCulture, "Air panel converted with Air Exchange Method 'SimpleMixing' at {0} ACH (caller-supplied assumption — SAM carries no airflow data for the opening; EnergyPlus applies the rate to the smaller zone's volume, on an always-on schedule)", airChangesPerHour)); + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Aperture.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Aperture.cs new file mode 100644 index 0000000..4be52a1 --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Aperture.cs @@ -0,0 +1,326 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Collections.Generic; +using SAM.Geometry.OpenStudio; +using SAM.Geometry.Spatial; + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Convert + { + /// + /// Converts a SAM Aperture to an OpenStudio SubSurface hosted by the given surface. + /// The aperture polygon is cleaned and validated, its winding is aligned with the host + /// panel's space-oriented outward normal, and its planarity against the host plane is + /// verified (coplanarity within the elevation tolerance) — an aperture failing validation + /// is skipped with an error diagnostic, never silently repaired. An aperture without an + /// ApertureConstruction is skipped with a warning (mirrors SAM_LadybugTools). + /// + /// SAM aperture. + /// Host OpenStudio surface (already created for the panel side). + /// Space-oriented host panel (normal points out of the space). + /// AdjacencyCluster index of the owning space (name disambiguation). + /// Conversion context. + /// The created SubSurface, or null when skipped. + public static global::OpenStudio.SubSurface ToOpenStudio(this Aperture aperture, global::OpenStudio.Surface surface, Panel panel, int spaceIndex, OpenStudioConversionContext openStudioConversionContext) + { + if (aperture == null || surface == null || panel == null || openStudioConversionContext == null) + { + return null; + } + + string name = Core.OpenStudio.Query.OpenStudioName("SubSurface", string.Format("{0}_{1}", aperture.Name, spaceIndex), aperture.Guid); + + if (aperture.ApertureConstruction == null) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ConstructionMissingLayer, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "Aperture has no ApertureConstruction and was skipped", aperture, name); + return null; + } + + Face3D face3D = aperture.Face3D; + if (face3D == null) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.GeometryInvalidBoundary, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "Aperture has no geometry", aperture, name); + return null; + } + + ISegmentable3D segmentable3D = face3D.GetExternalEdge3D() as ISegmentable3D; + List point3Ds = segmentable3D?.GetPoints(); + + List diagnostics = Geometry.OpenStudio.Query.ValidatePolygon(point3Ds, openStudioConversionContext.Options.DistanceTolerance, openStudioConversionContext.Options.AngleTolerance, openStudioConversionContext.Options.MinimumArea); + bool valid = true; + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in diagnostics) + { + openStudioConversionContext.AddDiagnostic(diagnostic.Code, diagnostic.Severity, diagnostic.Message, aperture, name); + if (diagnostic.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error) + { + valid = false; + } + } + + if (!valid) + { + return null; + } + + point3Ds = Geometry.OpenStudio.Query.CleanVertices(point3Ds, openStudioConversionContext.Options.DistanceTolerance, openStudioConversionContext.Options.AngleTolerance); + + // EnergyPlus applies its own 0.01 m vertex-proximity rule on top of our cleaning: + // a sliver aperture (e.g. a residual millimetre-wide door) collapses below three + // sides and is reported as a severe "degenerate surface". Reject it here instead — + // EnergyPlus never sees it. + int energyPlusSides = Geometry.OpenStudio.Query.EnergyPlusSideCount(point3Ds); + if (energyPlusSides < 3) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.GeometryInvalidBoundary, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Aperture would be degenerate in EnergyPlus: its vertices collapse to {0} side(s) under the 0.01 m proximity rule (sliver geometry); skipped — repair the source aperture", energyPlusSides), aperture, name); + openStudioConversionContext.RegisterSkip(); + return null; + } + + Plane plane = panel.GetFace3D()?.GetPlane(); + if (plane != null) + { + foreach (Point3D point3D in point3Ds) + { + double distance = plane.Distance(point3D); + if (double.IsNaN(distance) || distance > openStudioConversionContext.Options.ElevationTolerance) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.GeometryInvalidBoundary, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("Aperture vertex lies {0:G4} m off the host panel plane", distance), aperture, name); + return null; + } + } + } + + ApertureConstruction apertureConstruction = aperture.ApertureConstruction; + EmitUnsupportedDiagnostics(aperture, apertureConstruction, name, openStudioConversionContext); + + string subSurfaceType = Query.SubSurfaceType(aperture, openStudioConversionContext.Source?.MaterialLibrary); + + // Frame (C3): when the aperture construction carries frame data, the SubSurface + // polygon becomes the PANE polygon (EnergyPlus grows the frame outward from the + // glass — coverage manifest: Aperture.PaneFrameGeometry) and a + // WindowPropertyFrameAndDivider carries width/conductance/absorptances. Any invalid + // or incomplete frame data falls back to the full-polygon frameless conversion with + // a structured warning — never wrong geometry. + List subSurfacePoint3Ds = point3Ds; + global::OpenStudio.WindowPropertyFrameAndDivider frameAndDivider = TryCreateFrameAndDivider(aperture, apertureConstruction, subSurfaceType, face3D, point3Ds, name, openStudioConversionContext, out List panePoint3Ds); + if (frameAndDivider != null && panePoint3Ds != null) + { + subSurfacePoint3Ds = panePoint3Ds; + } + + if (Geometry.OpenStudio.Query.IsClockwise(subSurfacePoint3Ds, panel.Normal)) + { + subSurfacePoint3Ds.Reverse(); + } + + global::OpenStudio.SubSurface result = new global::OpenStudio.SubSurface(subSurfacePoint3Ds.ToOpenStudio(), openStudioConversionContext.Target); + result.setName(name); + result.setSurface(surface); + + if (!string.IsNullOrWhiteSpace(subSurfaceType)) + { + result.setSubSurfaceType(subSurfaceType); + } + + if (frameAndDivider != null) + { + result.setWindowPropertyFrameAndDivider(frameAndDivider); + } + + // Identity on every side: an aperture in an internal panel becomes two subsurfaces, + // and the reverse import must restore the same SAM Guid whichever it meets first. + Core.OpenStudio.Modify.SetSAMIdentity(result, aperture); + + if (!openStudioConversionContext.References.Contains(aperture.Guid)) + { + openStudioConversionContext.RegisterModelObject(aperture, result); + } + + return result; + } + + /// + /// Builds a WindowPropertyFrameAndDivider from SAM frame data (coverage manifest: + /// ApertureConstruction.FrameConstructionLayers — Approximated): width from + /// DefaultFrameWidth else the frame thickness; conductance U = 1/Σ(thickness/conductivity) + /// over the frame layers (no film coefficients, documented approximation); solar/visible + /// absorptance = 1 − External*Reflectance of the outermost frame layer. Returns null + /// (frameless fallback) when there is no frame data, the aperture is an opaque door, or + /// any derivation is invalid — a diagnostic explains every non-silent case. + /// + private static global::OpenStudio.WindowPropertyFrameAndDivider TryCreateFrameAndDivider(Aperture aperture, ApertureConstruction apertureConstruction, string subSurfaceType, Face3D apertureFace3D, List aperturePoint3Ds, string openStudioObjectName, OpenStudioConversionContext openStudioConversionContext, out List panePoint3Ds) + { + panePoint3Ds = null; + + double frameWidth = double.NaN; + if (!apertureConstruction.TryGetValue(ApertureConstructionParameter.DefaultFrameWidth, out frameWidth) || double.IsNaN(frameWidth) || frameWidth <= 0) + { + frameWidth = apertureConstruction.GetFrameThickness(); + } + + List frameLayers = apertureConstruction.FrameConstructionLayers; + bool hasFrameData = (!double.IsNaN(frameWidth) && frameWidth > 0) || (frameLayers != null && frameLayers.Count > 0); + if (!hasFrameData) + { + return null; + } + + if (subSurfaceType == "Door") + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ConstructionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, "Frame data on an opaque door is not converted (frames apply to glazed subsurfaces); frameless conversion", aperture, openStudioObjectName); + return null; + } + + if (double.IsNaN(frameWidth) || frameWidth <= 0 || frameLayers == null || frameLayers.Count == 0) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ConstructionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "Incomplete frame data (width or frame layers missing); frameless conversion", aperture, openStudioObjectName); + return null; + } + + Core.MaterialLibrary materialLibrary = openStudioConversionContext.Source?.MaterialLibrary; + if (materialLibrary == null) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ConstructionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "No MaterialLibrary; frame conductance cannot be derived — frameless conversion", aperture, openStudioObjectName); + return null; + } + + double resistance = 0; + foreach (ConstructionLayer frameLayer in frameLayers) + { + if (frameLayer == null) + { + continue; + } + + Core.IMaterial material = materialLibrary.GetMaterial(frameLayer.Name); + Core.OpaqueMaterial opaqueMaterial = material as Core.OpaqueMaterial; + if (opaqueMaterial == null) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ConstructionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Frame layer material '{0}' is missing or not opaque; frame conductance cannot be derived — frameless conversion", frameLayer.Name), aperture, openStudioObjectName); + return null; + } + + double layerThickness = frameLayer.Thickness; + if (double.IsNaN(layerThickness) || layerThickness <= 0) + { + if (!opaqueMaterial.TryGetValue(Core.MaterialParameter.DefaultThickness, out layerThickness) || double.IsNaN(layerThickness) || layerThickness <= 0) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ConstructionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Frame layer '{0}' has no usable thickness; frameless conversion", frameLayer.Name), aperture, openStudioObjectName); + return null; + } + } + + if (double.IsNaN(opaqueMaterial.ThermalConductivity) || opaqueMaterial.ThermalConductivity <= 0) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ConstructionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Frame material '{0}' has an invalid conductivity; frameless conversion", frameLayer.Name), aperture, openStudioObjectName); + return null; + } + + resistance += layerThickness / opaqueMaterial.ThermalConductivity; + } + + if (resistance <= 0) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ConstructionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "Frame layers give zero resistance; frameless conversion", aperture, openStudioObjectName); + return null; + } + + // Pane geometry from SAM itself (Aperture.GetFace3Ds(AperturePart.Pane) insets by the + // frame width), validated against the full aperture polygon. + List paneFace3Ds; + try + { + paneFace3Ds = aperture.GetPaneFace3Ds(); + } + catch (System.Exception exception) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ConstructionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Pane geometry could not be computed ({0}); frameless conversion", exception.GetType().Name), aperture, openStudioObjectName); + return null; + } + + Face3D paneFace3D = paneFace3Ds?.Find(x => x != null); + ISegmentable3D paneSegmentable3D = paneFace3D?.GetExternalEdge3D() as ISegmentable3D; + List candidatePoint3Ds = paneSegmentable3D?.GetPoints(); + if (candidatePoint3Ds == null || candidatePoint3Ds.Count < 3) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ConstructionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "Pane geometry is degenerate; frameless conversion", aperture, openStudioObjectName); + return null; + } + + double apertureArea = apertureFace3D.GetArea(); + double paneArea = paneFace3D.GetArea(); + if (double.IsNaN(apertureArea) || double.IsNaN(paneArea) || paneArea < openStudioConversionContext.Options.MinimumArea || paneArea >= apertureArea) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ConstructionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Area conservation failed (aperture {0:G4} m², pane {1:G4} m² — the pane must be strictly smaller); frameless conversion", apertureArea, paneArea), aperture, openStudioObjectName); + return null; + } + + global::OpenStudio.WindowPropertyFrameAndDivider result = new global::OpenStudio.WindowPropertyFrameAndDivider(openStudioConversionContext.Target); + result.setName(openStudioObjectName + "_FrameAndDivider"); + result.setFrameWidth(frameWidth); + result.setFrameConductance(1.0 / resistance); + + ConstructionLayer outermostLayer = frameLayers[frameLayers.Count - 1]; + Core.IMaterial outermostMaterial = outermostLayer == null ? null : materialLibrary.GetMaterial(outermostLayer.Name); + Core.SAMObject outermostSAMObject = outermostMaterial as Core.SAMObject; + if (outermostSAMObject != null) + { + if (outermostSAMObject.TryGetValue(OpaqueMaterialParameter.ExternalSolarReflectance, out double externalSolarReflectance) && !double.IsNaN(externalSolarReflectance) && externalSolarReflectance >= 0 && externalSolarReflectance <= 1) + { + result.setFrameSolarAbsorptance(1 - externalSolarReflectance); + } + + if (outermostSAMObject.TryGetValue(OpaqueMaterialParameter.ExternalLightReflectance, out double externalLightReflectance) && !double.IsNaN(externalLightReflectance) && externalLightReflectance >= 0 && externalLightReflectance <= 1) + { + result.setFrameVisibleAbsorptance(1 - externalLightReflectance); + } + } + + panePoint3Ds = candidatePoint3Ds; + return result; + } + + /// + /// Structured diagnostics for aperture data with no safe Ideal-Loads representation + /// (coverage manifest): opening properties (AirflowNetwork territory), feature shades, + /// blind flags and TAS additional-heat-transfer percentages. Never silently dropped. + /// + private static void EmitUnsupportedDiagnostics(Aperture aperture, ApertureConstruction apertureConstruction, string openStudioObjectName, OpenStudioConversionContext openStudioConversionContext) + { + if (aperture.GetValue(ApertureParameter.OpeningProperties) != null) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ConstructionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, "Opening properties (openable fraction, discharge coefficient) are not converted — natural ventilation needs AirflowNetwork/ZoneVentilation (deferred to the HVAC programme)", aperture, openStudioObjectName); + openStudioConversionContext.RegisterSkip(); + } + + if (aperture.GetValue(ApertureParameter.FeatureShade) != null) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ConstructionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, "Aperture feature shade is not converted — SAM carries no shade/slat geometry to build WindowShadingControl", aperture, openStudioObjectName); + openStudioConversionContext.RegisterSkip(); + } + + if (apertureConstruction != null) + { + if (apertureConstruction.TryGetValue(ApertureConstructionParameter.PaneAdditionalHeatTransfer, out double paneAdditionalHeatTransfer) && !double.IsNaN(paneAdditionalHeatTransfer) && paneAdditionalHeatTransfer != 0) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ConstructionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, "Pane additional heat transfer (TAS % U-adjustment) is not converted", aperture, openStudioObjectName); + openStudioConversionContext.RegisterSkip(); + } + + if (apertureConstruction.TryGetValue(ApertureConstructionParameter.FrameAdditionalHeatTransfer, out double frameAdditionalHeatTransfer) && !double.IsNaN(frameAdditionalHeatTransfer) && frameAdditionalHeatTransfer != 0) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ConstructionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, "Frame additional heat transfer (TAS % U-adjustment) is not converted", aperture, openStudioObjectName); + openStudioConversionContext.RegisterSkip(); + } + + if (apertureConstruction.TryGetValue(ApertureConstructionParameter.IsInternalShadow, out bool isInternalShadow) && isInternalShadow) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ConstructionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, "Internal-shadow flag (TAS) on the aperture construction is not converted — no deterministic EnergyPlus mapping", aperture, openStudioObjectName); + openStudioConversionContext.RegisterSkip(); + } + } + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/BuildingStory.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/BuildingStory.cs new file mode 100644 index 0000000..fa16b11 --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/BuildingStory.cs @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Collections.Generic; +using System.Globalization; + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Convert + { + /// + /// Creates OpenStudio BuildingStories from the SAM panel minimum-elevation dictionary + /// (the same level source SAM_LadybugTools uses). Stories are keyed and named by + /// elevation, ordered ascending, with deterministic names. Spaces are assigned to the + /// nearest story elevation by the caller. + /// + /// Conversion context with a non-null source model. + /// Elevation → BuildingStory, sorted ascending; empty when no panels exist. + public static SortedList ToOpenStudio_BuildingStories(this OpenStudioConversionContext openStudioConversionContext) + { + SortedList result = new SortedList(); + + AdjacencyCluster adjacencyCluster = openStudioConversionContext?.Source?.AdjacencyCluster; + if (adjacencyCluster == null) + { + return result; + } + + List panels = adjacencyCluster.GetPanels(); + if (panels == null || panels.Count == 0) + { + return result; + } + + // Per-panel elevation with exception isolation: SAM's geometry kernel can throw on + // pathological panels (e.g. degenerate slivers) — such panels are skipped here and + // surfaced later by the no-silent-drop check, never allowed to crash the conversion. + List rawElevations = new List(); + foreach (Panel panel in panels) + { + // Stories derive from floor-group panels only (matching SAM's + // MinElevationDictionary filtering) — walls and roofs do not define levels. + if (panel == null || panel.PanelType.PanelGroup() != PanelGroup.Floor) + { + continue; + } + + try + { + double panelElevation = Analytical.Query.MinElevation(panel); + if (!double.IsNaN(panelElevation)) + { + rawElevations.Add(panelElevation); + } + } + catch (System.Exception exception) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.GeometryInvalidBoundary, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Panel elevation could not be computed ({0}); panel ignored for story grouping", exception.GetType().Name), panel); + } + } + + if (rawElevations.Count == 0) + { + // Fallback: no floor-group panels exist (e.g. models without explicit slab + // panels) — derive levels from the space minimum elevations instead of leaving + // every space storyless. + List spaces = adjacencyCluster.GetSpaces(); + if (spaces != null) + { + foreach (Space space in spaces) + { + if (space == null) + { + continue; + } + + try + { + double spaceElevation = space.MinElevation(adjacencyCluster); + if (!double.IsNaN(spaceElevation)) + { + rawElevations.Add(spaceElevation); + } + } + catch (System.Exception exception) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.GeometryInvalidBoundary, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Space elevation could not be computed ({0}); space ignored for story grouping", exception.GetType().Name), space); + } + } + } + + if (rawElevations.Count > 0) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.AdjacencyMissingSurface, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, "No floor-group panels found; building stories were derived from space minimum elevations"); + } + } + + if (rawElevations.Count == 0) + { + return result; + } + + rawElevations.Sort(); + + double elevationTolerance = openStudioConversionContext.Options.ElevationTolerance; + List elevations = new List(); + foreach (double rawElevation in rawElevations) + { + if (elevations.Count == 0 || rawElevation - elevations[elevations.Count - 1] > elevationTolerance) + { + elevations.Add(rawElevation); + } + } + + for (int i = 0; i < elevations.Count; i++) + { + global::OpenStudio.BuildingStory buildingStory = new global::OpenStudio.BuildingStory(openStudioConversionContext.Target); + buildingStory.setName(string.Format(CultureInfo.InvariantCulture, "SAM_BuildingStory_{0:00}_{1:0.###}m", i, elevations[i])); + buildingStory.setNominalZCoordinate(elevations[i]); + result.Add(elevations[i], buildingStory); + } + + return result; + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Construction.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Construction.cs new file mode 100644 index 0000000..4088eb4 --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Construction.cs @@ -0,0 +1,296 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; +using SAM.Core; + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Convert + { + /// + /// Converts a SAM Construction to an OpenStudio Construction in the requested direction. + /// SAM stores layers inside → outside (verified, see docs/SAM_OPENSTUDIO_MATERIAL_MAPPING.md); + /// forward = reversed SAM order (EnergyPlus "outside first"), used for all external + /// surfaces and the primary side of internal pairs; reverse = SAM order as stored, used + /// for the secondary side. Results are cached per (Guid, direction). Missing layers or + /// unresolvable materials raise SAM-OS-CON-001 errors and return null. + /// + /// SAM construction. + /// True for the outside-first (EnergyPlus order) variant. + /// Conversion context. + /// OpenStudio construction, or null (diagnostic raised). + public static global::OpenStudio.Construction ToOpenStudio(this Construction construction, bool forward, OpenStudioConversionContext openStudioConversionContext) + { + if (construction == null || openStudioConversionContext == null) + { + return null; + } + + // TAS internal-shadow flag (coverage manifest ConstructionParameter.IsInternalShadow, + // Unsupported SAM-OS-CON-002 info; review P1-01): no deterministic EnergyPlus + // mapping. Reported once per construction, however many panels or directions use it. + if (construction.TryGetValue(ConstructionParameter.IsInternalShadow, out bool isInternalShadow) && isInternalShadow + && openStudioConversionContext.RegisterOnce("SAM-OS-CON-002:IsInternalShadow:" + construction.Guid.ToString("N"))) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ConstructionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, "Internal-shadow flag (TAS) on the construction is not converted — no deterministic EnergyPlus mapping", construction); + openStudioConversionContext.RegisterSkip(); + } + + return ToOpenStudio_Construction(construction, construction.ConstructionLayers, forward, null, OpenStudioMaterialUsage.OpaqueConstruction, openStudioConversionContext); + } + + /// + /// Converts a SAM ApertureConstruction to an OpenStudio Construction in the requested + /// direction. Pane layers produce a layered construction (same ordering and caching + /// rules as opaque constructions, cache keys suffixed ":Pane"). When the construction + /// has NO pane layers but carries optical/thermal performance parameters + /// (ThermalTransmittance / TotalSolarEnergyTransmittance / LightTransmittance — + /// aperture-level values taking precedence), a documented SimpleGlazingSystem fallback + /// is built instead (coverage manifest, Approximated); with neither layers nor complete + /// performance parameters the construction fails with SAM-OS-CON-001. + /// + /// SAM aperture construction. + /// True for the outside-first (EnergyPlus order) variant. + /// Conversion context. + /// The aperture being converted (aperture-level performance parameters take precedence); may be null. + /// OpenStudio construction, or null (diagnostic raised). + public static global::OpenStudio.Construction ToOpenStudio(this ApertureConstruction apertureConstruction, bool forward, OpenStudioConversionContext openStudioConversionContext, Aperture aperture = null) + { + if (apertureConstruction == null || openStudioConversionContext == null) + { + return null; + } + + List paneLayers = apertureConstruction.PaneConstructionLayers; + if (paneLayers == null || paneLayers.Count == 0) + { + return ToOpenStudio_SimpleGlazingFallback(apertureConstruction, aperture, forward, openStudioConversionContext); + } + + return ToOpenStudio_Construction(apertureConstruction, paneLayers, forward, "Pane", OpenStudioMaterialUsage.FenestrationConstruction, openStudioConversionContext); + } + + /// + /// Documented SimpleGlazingSystem fallback (coverage manifest, Approximated): an + /// aperture construction without pane layers but with U / SHGC / visible transmittance + /// becomes a WindowMaterial:SimpleGlazingSystem. Aperture-level parameters take + /// precedence over construction-level ones, so the RESOLVED performance — not the + /// construction Guid alone — is the identity of the glazing: two apertures sharing one + /// construction but overriding it differently each get their own SimpleGlazing and their + /// own deterministic name, while two carrying identical values still share one. + /// Incomplete parameters are an explicit error — no hidden defaults. + /// + private static global::OpenStudio.Construction ToOpenStudio_SimpleGlazingFallback(ApertureConstruction apertureConstruction, Aperture aperture, bool forward, OpenStudioConversionContext openStudioConversionContext) + { + string direction = forward ? "Forward" : "Reverse"; + + double uFactor = PerformanceParameter(aperture, apertureConstruction, ApertureParameter.ThermalTransmittance, ApertureConstructionParameter.ThermalTransmittance); + double solarHeatGainCoefficient = PerformanceParameter(aperture, apertureConstruction, ApertureParameter.TotalSolarEnergyTransmittance, ApertureConstructionParameter.TotalSolarEnergyTransmittance); + double visibleTransmittance = PerformanceParameter(aperture, apertureConstruction, ApertureParameter.LightTransmittance, ApertureConstructionParameter.LightTransmittance); + + string cacheKey = string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0:N}:SimpleGlazing:{1}:{2:R}:{3:R}:{4:R}", apertureConstruction.Guid, direction, uFactor, solarHeatGainCoefficient, visibleTransmittance); + + global::OpenStudio.Construction cached; + if (openStudioConversionContext.ConstructionMap.TryGetValue(cacheKey, out cached)) + { + return cached; + } + + // Aperture-level overrides carry the performance into the name too, so the extra + // constructions stay distinguishable in the OSM instead of being auto-renamed by + // OpenStudio (which would break the trailing-Guid resolution convention). + string variant = IsApertureSpecificPerformance(apertureConstruction, uFactor, solarHeatGainCoefficient, visibleTransmittance) + ? string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}_SimpleGlazing_U{1:R}_G{2:R}_T{3:R}_{4}", apertureConstruction.Name, uFactor, solarHeatGainCoefficient, visibleTransmittance, direction) + : string.Format("{0}_SimpleGlazing_{1}", apertureConstruction.Name, direction); + + string name = Core.OpenStudio.Query.OpenStudioName("Construction", variant, apertureConstruction.Guid); + + if (double.IsNaN(uFactor) || uFactor <= 0 || double.IsNaN(solarHeatGainCoefficient) || solarHeatGainCoefficient < 0 || solarHeatGainCoefficient > 1 || double.IsNaN(visibleTransmittance) || visibleTransmittance < 0 || visibleTransmittance > 1) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ConstructionMissingLayer, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "Aperture construction has no pane layers and no complete performance parameters (U, SHGC, visible transmittance) for the SimpleGlazingSystem fallback", apertureConstruction, name); + return null; + } + + global::OpenStudio.SimpleGlazing simpleGlazingSystem = new global::OpenStudio.SimpleGlazing(openStudioConversionContext.Target); + simpleGlazingSystem.setName(name + "_SimpleGlazing"); + simpleGlazingSystem.setUFactor(uFactor); + simpleGlazingSystem.setSolarHeatGainCoefficient(solarHeatGainCoefficient); + simpleGlazingSystem.setVisibleTransmittance(visibleTransmittance); + + global::OpenStudio.MaterialVector materialVector = new global::OpenStudio.MaterialVector(); + materialVector.Add(simpleGlazingSystem); + + global::OpenStudio.Construction result = new global::OpenStudio.Construction(openStudioConversionContext.Target); + result.setName(name); + if (!result.setLayers(materialVector)) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ConstructionMissingLayer, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "OpenStudio rejected the SimpleGlazingSystem layer set", apertureConstruction, name); + result.remove(); + return null; + } + + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ConstructionMissingLayer, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, "Aperture construction has no pane layers; SimpleGlazingSystem fallback built from the performance parameters (approximation)", apertureConstruction, name); + + openStudioConversionContext.ConstructionMap[cacheKey] = result; + if (forward && !openStudioConversionContext.References.Contains(apertureConstruction.Guid)) + { + openStudioConversionContext.RegisterModelObject(apertureConstruction, result); + } + + return result; + } + + /// + /// True when the resolved performance differs from what the shared ApertureConstruction + /// alone would give — that is, when an aperture-level override actually changed a value. + /// Compared with Equals so that NaN (an incomplete set, reported as an error further + /// down) does not read as a difference. + /// + private static bool IsApertureSpecificPerformance(ApertureConstruction apertureConstruction, double uFactor, double solarHeatGainCoefficient, double visibleTransmittance) + { + return !uFactor.Equals(PerformanceParameter(null, apertureConstruction, ApertureParameter.ThermalTransmittance, ApertureConstructionParameter.ThermalTransmittance)) + || !solarHeatGainCoefficient.Equals(PerformanceParameter(null, apertureConstruction, ApertureParameter.TotalSolarEnergyTransmittance, ApertureConstructionParameter.TotalSolarEnergyTransmittance)) + || !visibleTransmittance.Equals(PerformanceParameter(null, apertureConstruction, ApertureParameter.LightTransmittance, ApertureConstructionParameter.LightTransmittance)); + } + + private static double PerformanceParameter(Aperture aperture, ApertureConstruction apertureConstruction, ApertureParameter apertureParameter, ApertureConstructionParameter apertureConstructionParameter) + { + double value; + if (aperture != null && aperture.TryGetValue(apertureParameter, out value) && !double.IsNaN(value)) + { + return value; + } + + if (apertureConstruction.TryGetValue(apertureConstructionParameter, out value) && !double.IsNaN(value)) + { + return value; + } + + return double.NaN; + } + + private static global::OpenStudio.Construction ToOpenStudio_Construction(SAMObject sAMObject, List constructionLayers, bool forward, string variant, OpenStudioMaterialUsage openStudioMaterialUsage, OpenStudioConversionContext openStudioConversionContext) + { + string direction = forward ? "Forward" : "Reverse"; + string cacheKey = string.Format("{0:N}:{1}{2}", sAMObject.Guid, variant == null ? string.Empty : variant + ":", direction); + + global::OpenStudio.Construction cached; + if (openStudioConversionContext.ConstructionMap.TryGetValue(cacheKey, out cached)) + { + return cached; + } + + string name = Core.OpenStudio.Query.OpenStudioName("Construction", string.Format("{0}{1}_{2}", sAMObject.Name, variant == null ? string.Empty : "_" + variant, direction), sAMObject.Guid); + + if (constructionLayers == null || constructionLayers.Count == 0) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ConstructionMissingLayer, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "Construction has no layers", sAMObject, name); + return null; + } + + MaterialLibrary materialLibrary = openStudioConversionContext.Source?.MaterialLibrary; + if (materialLibrary == null) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ConstructionMissingLayer, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "AnalyticalModel has no MaterialLibrary; construction layers cannot be resolved", sAMObject, name); + return null; + } + + List orderedLayers = new List(constructionLayers); + if (forward) + { + orderedLayers.Reverse(); + } + + global::OpenStudio.MaterialVector materialVector = new global::OpenStudio.MaterialVector(); + foreach (ConstructionLayer constructionLayer in orderedLayers) + { + if (constructionLayer == null) + { + continue; + } + + IMaterial material = materialLibrary.GetMaterial(constructionLayer.Name); + if (material == null) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ConstructionMissingLayer, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("Layer material '{0}' was not found in the MaterialLibrary", constructionLayer.Name), sAMObject, name); + return null; + } + + double thickness = constructionLayer.Thickness; + if (double.IsNaN(thickness) || thickness <= 0) + { + SAMObject materialSAMObject = material as SAMObject; + double defaultThickness = double.NaN; + if (materialSAMObject != null && materialSAMObject.TryGetValue(Core.MaterialParameter.DefaultThickness, out defaultThickness) && !double.IsNaN(defaultThickness) && defaultThickness > 0) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ConstructionMissingLayer, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Layer '{0}' has no thickness; material DefaultThickness {1} m used", constructionLayer.Name, defaultThickness), sAMObject, name); + thickness = defaultThickness; + } + else + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ConstructionMissingLayer, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("Layer '{0}' has no usable thickness", constructionLayer.Name), sAMObject, name); + return null; + } + } + + global::OpenStudio.Material openStudioMaterial = material.ToOpenStudio(thickness, openStudioConversionContext, openStudioMaterialUsage); + if (openStudioMaterial == null) + { + return null; + } + + if (!IsValidMaterialFamily(openStudioMaterial, openStudioMaterialUsage)) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ConstructionMissingLayer, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("Material '{0}' ({1}) is not valid in a {2} layer set — mixed opaque/fenestration material families are rejected", constructionLayer.Name, openStudioMaterial.iddObjectType().valueName(), openStudioMaterialUsage), sAMObject, name); + return null; + } + + materialVector.Add(openStudioMaterial); + } + + global::OpenStudio.Construction result = new global::OpenStudio.Construction(openStudioConversionContext.Target); + result.setName(name); + if (!result.setLayers(materialVector)) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ConstructionMissingLayer, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "OpenStudio rejected the layer set (incompatible material kinds in one construction)", sAMObject, name); + result.remove(); + return null; + } + + openStudioConversionContext.ConstructionMap[cacheKey] = result; + if (forward && !openStudioConversionContext.References.Contains(sAMObject.Guid)) + { + openStudioConversionContext.RegisterModelObject(sAMObject, result); + } + + return result; + } + + /// + /// Material-family guard (review P1-06): opaque constructions accept only mass-full or + /// massless opaque materials and air cavities (AirGap); fenestration pane constructions + /// accept glazing, window gas and opaque (door) materials. An OpenStudio Gas is never + /// valid in an opaque layer set, and an OpenStudio AirGap is never valid in a pane set. + /// + private static bool IsValidMaterialFamily(global::OpenStudio.Material material, OpenStudioMaterialUsage openStudioMaterialUsage) + { + if (material == null) + { + return false; + } + + if (openStudioMaterialUsage == OpenStudioMaterialUsage.FenestrationConstruction) + { + return !material.to_StandardGlazing().isNull() + || !material.to_Gas().isNull() + || !material.to_StandardOpaqueMaterial().isNull(); + } + + return !material.to_StandardOpaqueMaterial().isNull() + || !material.to_AirGap().isNull() + || !material.to_MasslessOpaqueMaterial().isNull(); + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/DesignDays.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/DesignDays.cs new file mode 100644 index 0000000..473340a --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/DesignDays.cs @@ -0,0 +1,360 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Collections.Generic; +using System.IO; +using System.Text.RegularExpressions; + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Convert + { + /// + /// The ASHRAE annual heating design-day name: "… Ann Htg 99.6% Condns DB". Requiring + /// "Htg" directly before "99.6%" excludes the wind ("Ann Htg Wind 99.6% Condns + /// WS=>MCDB") and humidification ("Ann Hum_n 99.6% Condns DP=>MCDB") days that share + /// the 99.6% figure (review P1-02). + /// + private static readonly Regex HeatingDesignDayName = new Regex(@"Ann\s+Htg\s+99\.6\s*%\s+Condns\s+DB", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant); + + /// + /// The ASHRAE annual cooling design-day name: "… Ann Clg .4% Condns DB=>MWB" — written + /// WITHOUT a leading zero in ASHRAE/climate.onebuilding DDY files (accepted with one + /// too), MWB/MCWB variants both accepted. Restricting to the DB=>M(C)WB condition keeps + /// the WB=>MDB / DP=>MDB / Enth=>MDB variants and the monthly ".4%" days out. + /// + private static readonly Regex CoolingDesignDayName = new Regex(@"Ann\s+Clg\s+0?\.4\s*%\s+Condns\s+DB\s*=>\s*M(C)?WB", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant); + + /// + /// Imports design days from a DDY file into the target model (C4). By default exactly + /// the ASHRAE annual pair is kept: the heating 99.6% dry-bulb day and the cooling .4% + /// DB=>MWB day (review P1-02 — the humidification and wind 99.6% days never match). + /// A missing side raises a warning; when neither side matches, the import falls back to + /// all days with a warning. OpenStudioConversionOptions.ImportAllDesignDays imports + /// every design day. Sets OpenStudioConversionContext.DesignDaysImported (drives + /// sizing-period enablement) and DesignDaySource (Ddy when at least one day was + /// imported, otherwise None — provenance records the outcome, not the intent). + /// + /// Conversion context. + /// DDY file path; null/empty or unreadable → no import (warning when a path was given). + /// Number of imported design days. + public static int ToOpenStudio_DesignDays(this OpenStudioConversionContext openStudioConversionContext, string ddyPath) + { + if (openStudioConversionContext == null) + { + return 0; + } + + if (string.IsNullOrWhiteSpace(ddyPath)) + { + return 0; + } + + List designDays = Query.DesignDays(ddyPath); + if (designDays == null || designDays.Count == 0) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.WeatherDataIssue, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("DDY file contains no importable design days: {0}", ddyPath)); + return 0; + } + + List selected = designDays; + if (!openStudioConversionContext.Options.ImportAllDesignDays) + { + List heatingDays = designDays.FindAll(x => HeatingDesignDayName.IsMatch(x.nameString())); + List coolingDays = designDays.FindAll(x => CoolingDesignDayName.IsMatch(x.nameString())); + + if (heatingDays.Count == 0 && coolingDays.Count == 0) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.WeatherDataIssue, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "No annual heating 99.6% / cooling .4% design days found by name convention; all DDY design days were imported"); + } + else + { + if (heatingDays.Count == 0) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.WeatherDataIssue, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "No annual heating 99.6% dry-bulb design day found by name convention — heating sizing has no design day"); + } + + if (coolingDays.Count == 0) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.WeatherDataIssue, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "No annual cooling .4% DB=>MWB design day found by name convention — cooling sizing has no design day"); + } + + selected = new List(); + selected.AddRange(heatingDays); + selected.AddRange(coolingDays); + } + } + + foreach (global::OpenStudio.DesignDay designDay in selected) + { + designDay.clone(openStudioConversionContext.Target); + } + + openStudioConversionContext.DesignDaysImported = selected.Count > 0; + openStudioConversionContext.DesignDaySource = selected.Count > 0 ? Core.OpenStudio.OpenStudioDesignDaySource.Ddy : Core.OpenStudio.OpenStudioDesignDaySource.None; + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.WeatherDataIssue, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, string.Format("Imported {0} design day(s) from {1}", selected.Count, Path.GetFileName(ddyPath))); + return selected.Count; + } + + /// + /// Translates the design days embedded in the AnalyticalModel + /// (AnalyticalModelParameter.HeatingDesignDays / CoolingDesignDays) into OpenStudio + /// SizingPeriod:DesignDay objects. This is the fallback design-day source when no + /// explicit DDY path is supplied — never combined with a DDY import in the same model. + /// SAM design days are hourly WeatherDay profiles (dry bulb, relative humidity, wind, + /// pressure, solar) with a calendar date; the translation to the EnergyPlus + /// steady-state design-day object approximates (each approximation is named in a + /// warning, nothing is silently downgraded): the daily range is the 24 h max-min + /// spread, humidity becomes a constant dew point at the maximum-dry-bulb hour + /// (Magnus formula), wind becomes the mean speed and circular-mean direction, + /// pressure becomes the daily mean, and the solar model is ASHRAEClearSky with + /// clearness 0.0 for heating days / 1.0 for cooling days (the hourly SAM radiation + /// profile is not fitted). Heating days become WinterDesignDay, cooling days + /// SummerDesignDay day types. Sets OpenStudioConversionContext.DesignDaysImported and + /// DesignDaySource (EmbeddedModel when at least one day was translated, otherwise None — + /// every day skipped as invalid leaves the model without an embedded basis). + /// + /// Conversion context. + /// Embedded SAM heating design days. + /// Embedded SAM cooling design days. + /// Number of imported design days. + public static int ToOpenStudio_DesignDays(this OpenStudioConversionContext openStudioConversionContext, IEnumerable heatingDesignDays, IEnumerable coolingDesignDays) + { + if (openStudioConversionContext == null) + { + return 0; + } + + int heatingCount = 0; + if (heatingDesignDays != null) + { + foreach (DesignDay designDay in heatingDesignDays) + { + if (ToOpenStudio_DesignDay(designDay, "WinterDesignDay", 0.0, openStudioConversionContext) != null) + { + heatingCount++; + } + } + } + + int coolingCount = 0; + if (coolingDesignDays != null) + { + foreach (DesignDay designDay in coolingDesignDays) + { + if (ToOpenStudio_DesignDay(designDay, "SummerDesignDay", 1.0, openStudioConversionContext) != null) + { + coolingCount++; + } + } + } + + int result = heatingCount + coolingCount; + openStudioConversionContext.DesignDaysImported = result > 0; + openStudioConversionContext.DesignDaySource = result > 0 ? Core.OpenStudio.OpenStudioDesignDaySource.EmbeddedModel : Core.OpenStudio.OpenStudioDesignDaySource.None; + return result; + } + + private static global::OpenStudio.DesignDay ToOpenStudio_DesignDay(DesignDay designDay, string dayType, double skyClearness, OpenStudioConversionContext openStudioConversionContext) + { + if (designDay == null) + { + return null; + } + + string name = string.IsNullOrWhiteSpace(designDay.Name) ? "SAM Design Day" : designDay.Name; + + if (designDay.Month < 1 || designDay.Month > 12 || designDay.Day < 1 || designDay.Day > 31) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.WeatherDataIssue, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Embedded design day '{0}' has an invalid month/day ({1}/{2}); skipped", name, designDay.Month, designDay.Day)); + return null; + } + + double[] dryBulbTemperatures = designDay[Weather.WeatherDataType.DryBulbTemperature]; + if (dryBulbTemperatures == null || dryBulbTemperatures.Length != 24 || System.Array.TrueForAll(dryBulbTemperatures, double.IsNaN)) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.WeatherDataIssue, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Embedded design day '{0}' has no hourly dry-bulb temperature profile; skipped — a design day is never silently downgraded", name)); + return null; + } + + int hourMax = -1; + double maxDryBulb = double.MinValue; + double minDryBulb = double.MaxValue; + for (int i = 0; i < 24; i++) + { + double value = dryBulbTemperatures[i]; + if (double.IsNaN(value)) + { + continue; + } + + if (value > maxDryBulb) + { + maxDryBulb = value; + hourMax = i; + } + + if (value < minDryBulb) + { + minDryBulb = value; + } + } + + global::OpenStudio.DesignDay result = new global::OpenStudio.DesignDay(openStudioConversionContext.Target); + result.setName(Core.OpenStudio.Query.SanitizeName(name)); + result.setMonth(designDay.Month); + result.setDayOfMonth(designDay.Day); + result.setDayType(dayType); + result.setMaximumDryBulbTemperature(maxDryBulb); + result.setDailyDryBulbTemperatureRange(maxDryBulb - minDryBulb); + + double[] relativeHumidities = designDay[Weather.WeatherDataType.RelativeHumidity]; + double relativeHumidity = relativeHumidities != null && hourMax != -1 && relativeHumidities.Length == 24 ? relativeHumidities[hourMax] : double.NaN; + if (!double.IsNaN(relativeHumidity) && relativeHumidity > 0 && relativeHumidity <= 100) + { + result.setHumidityIndicatingType("DewPoint"); + result.setHumidityIndicatingConditionsAtMaximumDryBulb(DewPoint(maxDryBulb, relativeHumidity)); + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.WeatherDataIssue, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Embedded design day '{0}': the hourly humidity profile was approximated as a constant dew point ({1:0.0} °C) from {2:0}% RH at the maximum-dry-bulb hour", name, DewPoint(maxDryBulb, relativeHumidity), relativeHumidity)); + } + else + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.WeatherDataIssue, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Embedded design day '{0}' has no usable relative-humidity profile; the EnergyPlus default humidity condition applies", name)); + } + + // EnergyPlus rejects a design-day barometric pressure that differs by more than + // 10% from the elevation-based standard and silently substitutes the standard + // (SizingPeriod:DesignDay Barometric Pressure). Some SAM embedded design days + // carry an implausible pressure (a TRY-derived London day here reported ~31000 Pa + // at a 25 m site), and many carry NO pressure profile at all. Mirror the + // EnergyPlus rule: keep a plausible value, otherwise write the elevation-based + // standard EnergyPlus would use. + // + // The field MUST be written in every branch. An unset OpenStudio design-day + // pressure is the 31000 Pa IDD floor, so leaving it emits a physically absurd + // 31000 Pa into the IDF; EnergyPlus then substitutes the standard itself and logs + // "Entered DesignDay Barometric Pressure=31000 differs by more than 10% from + // Standard Barometric Pressure", which is exactly the confusing warning this + // conversion exists to avoid. + double standardPressure = StandardBarometricPressure(openStudioConversionContext.Target.getSite().elevation()); + double[] pressures = designDay[Weather.WeatherDataType.AtmosphericPressure]; + double pressure = Mean(pressures); + if (!double.IsNaN(pressure) && pressure > 0) + { + if (System.Math.Abs(pressure - standardPressure) <= 0.10 * standardPressure) + { + result.setBarometricPressure(pressure); + } + else + { + result.setBarometricPressure(standardPressure); + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.WeatherDataIssue, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format(System.Globalization.CultureInfo.InvariantCulture, "Embedded design day '{0}': the SAM barometric pressure ({1:0} Pa) differs by more than 10% from the elevation-based standard ({2:0} Pa) and is not converted — it is replaced with the elevation-based standard that EnergyPlus would otherwise substitute", name, pressure, standardPressure)); + } + } + else + { + // No usable SAM pressure profile: write the elevation-based standard rather + // than leaving the field on its 31000 Pa IDD floor. + result.setBarometricPressure(standardPressure); + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.WeatherDataIssue, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format(System.Globalization.CultureInfo.InvariantCulture, "Embedded design day '{0}' carries no usable barometric-pressure profile; the elevation-based standard ({1:0} Pa) is written instead of leaving the EnergyPlus 31000 Pa default", name, standardPressure)); + } + + double[] windSpeeds = designDay[Weather.WeatherDataType.WindSpeed]; + double windSpeed = Mean(windSpeeds); + if (!double.IsNaN(windSpeed) && windSpeed >= 0) + { + result.setWindSpeed(windSpeed); + } + + double[] windDirections = designDay[Weather.WeatherDataType.WindDirection]; + double windDirection = CircularMean(windDirections); + if (!double.IsNaN(windDirection)) + { + result.setWindDirection(windDirection); + } + + result.setSolarModelIndicator("ASHRAEClearSky"); + result.setSkyClearness(skyClearness); + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.WeatherDataIssue, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Embedded design day '{0}': the hourly solar profile was approximated by the ASHRAEClearSky model with clearness {1:0.0}; daily dry-bulb range, mean wind/pressure and the {2} day type are derived from the SAM hourly profile", name, skyClearness, dayType)); + + return result; + } + + /// Magnus (Alduchov–Eskridge) dew point [°C] from dry bulb [°C] and RH [%]. + private static double DewPoint(double dryBulbTemperature, double relativeHumidity) + { + const double a = 17.625; + const double b = 243.04; + + double gamma = (a * dryBulbTemperature / (b + dryBulbTemperature)) + System.Math.Log(relativeHumidity / 100.0); + return (b * gamma) / (a - gamma); + } + + // ASHRAE / EnergyPlus standard barometric pressure from site elevation (m): + // p = 101325 * (1 - 2.25577e-5 * z) ^ 5.2559. A non-finite elevation is treated as + // sea level (the same fallback EnergyPlus uses when no elevation is available). + private static double StandardBarometricPressure(double elevation) + { + if (double.IsNaN(elevation) || double.IsInfinity(elevation)) + { + elevation = 0.0; + } + + return 101325.0 * System.Math.Pow(1.0 - 2.25577e-5 * elevation, 5.2559); + } + + private static double Mean(double[] values) + { + if (values == null || values.Length == 0) + { + return double.NaN; + } + + double sum = 0; + int count = 0; + foreach (double value in values) + { + if (double.IsNaN(value)) + { + continue; + } + + sum += value; + count++; + } + + return count == 0 ? double.NaN : sum / count; + } + + private static double CircularMean(double[] directions) + { + if (directions == null || directions.Length == 0) + { + return double.NaN; + } + + double x = 0; + double y = 0; + int count = 0; + foreach (double direction in directions) + { + if (double.IsNaN(direction)) + { + continue; + } + + double radians = direction * System.Math.PI / 180.0; + x += System.Math.Cos(radians); + y += System.Math.Sin(radians); + count++; + } + + if (count == 0 || (System.Math.Abs(x) < 1e-12 && System.Math.Abs(y) < 1e-12)) + { + return double.NaN; + } + + double result = System.Math.Atan2(y, x) * 180.0 / System.Math.PI; + return result < 0 ? result + 360.0 : result; + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Humidistat.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Humidistat.cs new file mode 100644 index 0000000..6e330d2 --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Humidistat.cs @@ -0,0 +1,84 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Convert + { + /// + /// Creates a ZoneControlHumidistat for a space's thermal zone from the InternalCondition's + /// Humidification and/or Dehumidification profiles (SAM carries setpoint PROFILES, not + /// numeric setpoints — coverage manifest: InternalConditionParameter.Humidification/ + /// DehumidificationProfileName). Profiles convert with Percent type limits (0–100 %RH). + /// A named-but-unresolved profile raises SAM-OS-SCH-001 (error). Returns null when + /// neither profile is present — the zone then keeps no humidity control. + /// + /// SAM space. + /// The zone created for the space. + /// Conversion context. + /// The humidistat, or null when no humidity profiles exist (or a diagnostic was raised). + public static global::OpenStudio.ZoneControlHumidistat ToOpenStudio_Humidistat(this Space space, global::OpenStudio.ThermalZone thermalZone, OpenStudioConversionContext openStudioConversionContext) + { + if (space == null || thermalZone == null || openStudioConversionContext == null) + { + return null; + } + + string name = Core.OpenStudio.Query.OpenStudioName("Humidistat", space.Name, space.Guid); + + InternalCondition internalCondition = space.InternalCondition; + if (internalCondition == null) + { + return null; + } + + ProfileLibrary profileLibrary = openStudioConversionContext.Source?.ProfileLibrary; + + Profile humidificationProfile = ResolveHumidityProfile(internalCondition, profileLibrary, ProfileType.Humidification, space, name, openStudioConversionContext); + Profile dehumidificationProfile = ResolveHumidityProfile(internalCondition, profileLibrary, ProfileType.Dehumidification, space, name, openStudioConversionContext); + if (humidificationProfile == null && dehumidificationProfile == null) + { + return null; + } + + global::OpenStudio.Schedule humidificationSchedule = humidificationProfile?.ToOpenStudio(ProfileType.Humidification, openStudioConversionContext); + global::OpenStudio.Schedule dehumidificationSchedule = dehumidificationProfile?.ToOpenStudio(ProfileType.Dehumidification, openStudioConversionContext); + if ((humidificationProfile != null && humidificationSchedule == null) || (dehumidificationProfile != null && dehumidificationSchedule == null)) + { + return null; + } + + global::OpenStudio.ZoneControlHumidistat result = new global::OpenStudio.ZoneControlHumidistat(openStudioConversionContext.Target); + result.setName(name); + if (humidificationSchedule != null) + { + result.setHumidifyingRelativeHumiditySetpointSchedule(humidificationSchedule); + } + + if (dehumidificationSchedule != null) + { + result.setDehumidifyingRelativeHumiditySetpointSchedule(dehumidificationSchedule); + } + + thermalZone.setZoneControlHumidistat(result); + return result; + } + + private static Profile ResolveHumidityProfile(InternalCondition internalCondition, ProfileLibrary profileLibrary, ProfileType profileType, Space space, string openStudioObjectName, OpenStudioConversionContext openStudioConversionContext) + { + string profileName = internalCondition.GetProfileName(profileType); + if (profileName == null) + { + return null; + } + + Profile profile = profileLibrary == null ? null : internalCondition.GetProfile(profileType, profileLibrary); + if (profile == null) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ScheduleMissingProfile, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("The {0} profile '{1}' was named but not found; the humidity control is incomplete", profileType, profileName), space, openStudioObjectName); + } + + return profile; + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/IdealLoads.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/IdealLoads.cs new file mode 100644 index 0000000..b13265c --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/IdealLoads.cs @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Convert + { + /// + /// Attaches a ZoneHVACIdealLoadsAirSystem to a conditioned thermal zone (one system per + /// zone). Settings are the EnergyPlus object defaults (no capacity or air-flow limits, + /// no outdoor-air economizer, no heat recovery) except humidity control: when the zone + /// carries a ZoneControlHumidistat with a humidifying and/or dehumidifying schedule, the + /// matching control type is set to Humidistat (coverage manifest: + /// InternalConditionParameter.Humidification/DehumidificationProfileName). + /// + /// Conditioned thermal zone. + /// Source SAM space (naming and diagnostics). + /// Conversion context. + /// The attached system, or null (diagnostic raised). + public static global::OpenStudio.ZoneHVACIdealLoadsAirSystem ToOpenStudio_IdealLoads(this global::OpenStudio.ThermalZone thermalZone, Space space, OpenStudioConversionContext openStudioConversionContext) + { + if (thermalZone == null || space == null || openStudioConversionContext == null) + { + return null; + } + + global::OpenStudio.ZoneHVACIdealLoadsAirSystem result = new global::OpenStudio.ZoneHVACIdealLoadsAirSystem(openStudioConversionContext.Target); + result.setName(Core.OpenStudio.Query.OpenStudioName("IdealLoads", space.Name, space.Guid)); + + global::OpenStudio.OptionalZoneControlHumidistat optionalHumidistat = thermalZone.zoneControlHumidistat(); + if (optionalHumidistat != null && !optionalHumidistat.isNull()) + { + global::OpenStudio.ZoneControlHumidistat humidistat = optionalHumidistat.get(); + if (!humidistat.humidifyingRelativeHumiditySetpointSchedule().isNull()) + { + result.setHumidificationControlType("Humidistat"); + } + + if (!humidistat.dehumidifyingRelativeHumiditySetpointSchedule().isNull()) + { + result.setDehumidificationControlType("Humidistat"); + } + } + + if (!result.addToThermalZone(thermalZone)) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.HvacMissingSetpoints, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "Ideal Loads air system could not be attached to the thermal zone", space, thermalZone.nameString()); + result.remove(); + return null; + } + + return result; + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/InternalCondition.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/InternalCondition.cs new file mode 100644 index 0000000..93c4e88 --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/InternalCondition.cs @@ -0,0 +1,466 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Collections.Generic; +using System.Security.Cryptography; +using System.Text; +using System.Text.Json.Nodes; + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Convert + { + /// + /// Converts a SAM InternalCondition to an OpenStudio SpaceType with People, Lights, + /// ElectricEquipment, SpaceInfiltrationDesignFlowRate and DesignSpecificationOutdoorAir, + /// following docs/SAM_OPENSTUDIO_INTERNAL_CONDITION_MAPPING.md. One SpaceType is created + /// per unique condition identity — sanitized name plus a deterministic content hash over + /// the condition's parameters and profile references (cached); load densities come from + /// the established SAM queries evaluated for the given space. A load whose gains exist + /// but whose profile is missing raises SAM-OS-SCH-001 and the load is skipped — never + /// silently AlwaysOn. Heating/cooling setpoint profiles are not part of the SpaceType + /// (thermostats, M6). + /// + /// SAM internal condition. + /// Space used to evaluate SAM's calculated load densities. + /// Conversion context. + /// The SpaceType, or null when inputs are null. + public static global::OpenStudio.SpaceType ToOpenStudio(this InternalCondition internalCondition, Space space, OpenStudioConversionContext openStudioConversionContext) + { + if (internalCondition == null || space == null || openStudioConversionContext == null) + { + return null; + } + + // SAM's Space.InternalCondition setter clones the condition with a NEW Guid + // (SAM.Analytical\Classes\Space.cs), so per-space Guids differ by design and cannot + // identify shared conditions. Deduplication is by sanitized name PLUS a deterministic + // content hash (parameters and profile-name references, Guids excluded) PLUS the + // per-space computed load densities: identical clones evaluated for equivalent spaces + // share one SpaceType, while same-named conditions with different content — or a + // shared condition evaluated for spaces with different densities — never merge + // silently (the first space's values are never imposed on another space). + AdjacencyCluster adjacencyCluster = openStudioConversionContext.Source?.AdjacencyCluster; + + double area = double.NaN; + space.TryGetValue(SpaceParameter.Area, out area); + + double peoplePerArea = Analytical.Query.CalculatedPeoplePerArea(space); + double occupancyGain = Analytical.Query.OccupancyGain(space); + double occupancy = Analytical.Query.CalculatedOccupancy(space); + double lightingGain = Analytical.Query.CalculatedLightingGain(space); + double equipmentGain = Analytical.Query.CalculatedEquipmentSensibleGain(space); + double infiltrationAirFlow = Analytical.Query.CalculatedInfiltrationAirFlow(space); + + string name = "SAM_InternalCondition_" + Core.OpenStudio.Query.SanitizeName(internalCondition.Name) + "_" + ContentHash(internalCondition, peoplePerArea, occupancyGain, occupancy, lightingGain, equipmentGain, infiltrationAirFlow, area); + + global::OpenStudio.OptionalSpaceType existing = openStudioConversionContext.Target.getSpaceTypeByName(name); + if (existing != null && !existing.isNull()) + { + openStudioConversionContext.RegisterModelObject(internalCondition, existing.get()); + return existing.get(); + } + + global::OpenStudio.SpaceType result = new global::OpenStudio.SpaceType(openStudioConversionContext.Target); + result.setName(name); + openStudioConversionContext.RegisterModelObject(internalCondition, result); + + ProfileLibrary profileLibrary = openStudioConversionContext.Source?.ProfileLibrary; + Dictionary profileDictionary = profileLibrary == null ? new Dictionary() : internalCondition.GetProfileDictionary(profileLibrary); + + // People + if (!double.IsNaN(peoplePerArea) && peoplePerArea > 0) + { + global::OpenStudio.Schedule occupancySchedule = RequiredSchedule(internalCondition, profileDictionary, ProfileType.Occupancy, name, openStudioConversionContext); + if (occupancySchedule != null) + { + global::OpenStudio.PeopleDefinition peopleDefinition = new global::OpenStudio.PeopleDefinition(openStudioConversionContext.Target); + peopleDefinition.setName(name + "_PeopleDefinition"); + peopleDefinition.setPeopleperSpaceFloorArea(peoplePerArea); + + if (!internalCondition.TryGetValue(InternalConditionParameter.OccupancyRadiantProportion, out double occupancyRadiantProportion) || double.IsNaN(occupancyRadiantProportion)) + { + occupancyRadiantProportion = 0.3; + } + + peopleDefinition.setFractionRadiant(occupancyRadiantProportion); + + double sensibleGain = Analytical.Query.OccupancySensibleGain(space); + double latentGain = Analytical.Query.OccupancyLatentGain(space); + if (!double.IsNaN(sensibleGain) && !double.IsNaN(latentGain) && sensibleGain + latentGain > 0) + { + peopleDefinition.setSensibleHeatFraction(sensibleGain / (sensibleGain + latentGain)); + } + + double activityLevel = 0; + if (!double.IsNaN(occupancyGain) && !double.IsNaN(occupancy) && occupancy > 0) + { + activityLevel = occupancyGain / occupancy; + } + else + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.InternalConditionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "Occupancy activity level could not be derived; 0 W/person used", internalCondition, name); + } + + global::OpenStudio.Schedule activitySchedule = openStudioConversionContext.ToOpenStudio_ConstantSchedule(name + "_ActivityLevel", activityLevel, "ActivityLevel"); + + global::OpenStudio.People people = new global::OpenStudio.People(peopleDefinition); + people.setName(name + "_People"); + people.setNumberofPeopleSchedule(occupancySchedule); + people.setActivityLevelSchedule(activitySchedule); + people.setSpaceType(result); + } + } + + // Lights + if (!double.IsNaN(lightingGain) && lightingGain > 0 && !double.IsNaN(area) && area > 0) + { + global::OpenStudio.Schedule lightingSchedule = RequiredSchedule(internalCondition, profileDictionary, ProfileType.Lighting, name, openStudioConversionContext); + if (lightingSchedule != null) + { + global::OpenStudio.LightsDefinition lightsDefinition = new global::OpenStudio.LightsDefinition(openStudioConversionContext.Target); + lightsDefinition.setName(name + "_LightsDefinition"); + lightsDefinition.setWattsperSpaceFloorArea(lightingGain / area); + + if (!internalCondition.TryGetValue(InternalConditionParameter.LightingRadiantProportion, out double lightingRadiantProportion) || double.IsNaN(lightingRadiantProportion)) + { + lightingRadiantProportion = 0.32; + } + + if (!internalCondition.TryGetValue(InternalConditionParameter.LightingViewCoefficient, out double lightingViewCoefficient) || double.IsNaN(lightingViewCoefficient)) + { + lightingViewCoefficient = 0.25; + } + + lightsDefinition.setFractionRadiant(lightingRadiantProportion); + lightsDefinition.setFractionVisible(lightingViewCoefficient); + + global::OpenStudio.Lights lights = new global::OpenStudio.Lights(lightsDefinition); + lights.setName(name + "_Lights"); + lights.setSchedule(lightingSchedule); + lights.setSpaceType(result); + } + } + + // Electric equipment (sensible) + if (!double.IsNaN(equipmentGain) && equipmentGain > 0 && !double.IsNaN(area) && area > 0) + { + global::OpenStudio.Schedule equipmentSchedule = RequiredSchedule(internalCondition, profileDictionary, ProfileType.EquipmentSensible, name, openStudioConversionContext); + if (equipmentSchedule != null) + { + global::OpenStudio.ElectricEquipmentDefinition electricEquipmentDefinition = new global::OpenStudio.ElectricEquipmentDefinition(openStudioConversionContext.Target); + electricEquipmentDefinition.setName(name + "_ElectricEquipmentDefinition"); + electricEquipmentDefinition.setWattsperSpaceFloorArea(equipmentGain / area); + + if (!internalCondition.TryGetValue(InternalConditionParameter.EquipmentRadiantProportion, out double equipmentRadiantProportion) || double.IsNaN(equipmentRadiantProportion)) + { + equipmentRadiantProportion = 0; + } + + electricEquipmentDefinition.setFractionRadiant(equipmentRadiantProportion); + + global::OpenStudio.ElectricEquipment electricEquipment = new global::OpenStudio.ElectricEquipment(electricEquipmentDefinition); + electricEquipment.setName(name + "_ElectricEquipment"); + electricEquipment.setSchedule(equipmentSchedule); + electricEquipment.setSpaceType(result); + } + } + + // Electric equipment (latent): a dedicated instance with Fraction Latent = 1 so the + // sensible and latent gains keep independent profiles (coverage manifest: + // InternalConditionParameter.EquipmentLatentGain*). Radiant fraction stays 0 — + // fractions must sum to 1. + double equipmentLatentGain = Analytical.Query.CalculatedEquipmentLatentGain(space); + if (!double.IsNaN(equipmentLatentGain) && equipmentLatentGain > 0 && !double.IsNaN(area) && area > 0) + { + global::OpenStudio.Schedule equipmentLatentSchedule = RequiredSchedule(internalCondition, profileDictionary, ProfileType.EquipmentLatent, name, openStudioConversionContext); + if (equipmentLatentSchedule != null) + { + global::OpenStudio.ElectricEquipmentDefinition electricEquipmentLatentDefinition = new global::OpenStudio.ElectricEquipmentDefinition(openStudioConversionContext.Target); + electricEquipmentLatentDefinition.setName(name + "_ElectricEquipmentLatentDefinition"); + electricEquipmentLatentDefinition.setWattsperSpaceFloorArea(equipmentLatentGain / area); + electricEquipmentLatentDefinition.setFractionLatent(1.0); + electricEquipmentLatentDefinition.setFractionRadiant(0.0); + + global::OpenStudio.ElectricEquipment electricEquipmentLatent = new global::OpenStudio.ElectricEquipment(electricEquipmentLatentDefinition); + electricEquipmentLatent.setName(name + "_ElectricEquipmentLatent"); + electricEquipmentLatent.setSchedule(equipmentLatentSchedule); + electricEquipmentLatent.setSpaceType(result); + } + } + + // Infiltration: the native Air Changes per Hour field when the condition carries + // ACH (coverage manifest: InternalConditionParameter.InfiltrationAirChangesPerHour); + // the flow-per-exterior-area derivation remains the fallback for other + // parameterisations. + double infiltrationAirChangesPerHour = double.NaN; + internalCondition.TryGetValue(InternalConditionParameter.InfiltrationAirChangesPerHour, out infiltrationAirChangesPerHour); + + if (!double.IsNaN(infiltrationAirChangesPerHour) && infiltrationAirChangesPerHour > 0) + { + global::OpenStudio.Schedule infiltrationSchedule = RequiredSchedule(internalCondition, profileDictionary, ProfileType.Infiltration, name, openStudioConversionContext); + if (infiltrationSchedule != null) + { + global::OpenStudio.SpaceInfiltrationDesignFlowRate spaceInfiltrationDesignFlowRate = new global::OpenStudio.SpaceInfiltrationDesignFlowRate(openStudioConversionContext.Target); + spaceInfiltrationDesignFlowRate.setName(name + "_Infiltration"); + spaceInfiltrationDesignFlowRate.setAirChangesperHour(infiltrationAirChangesPerHour); + spaceInfiltrationDesignFlowRate.setSchedule(infiltrationSchedule); + spaceInfiltrationDesignFlowRate.setSpaceType(result); + } + } + else if (!double.IsNaN(infiltrationAirFlow) && infiltrationAirFlow > 0 && adjacencyCluster != null) + { + global::OpenStudio.Schedule infiltrationSchedule = RequiredSchedule(internalCondition, profileDictionary, ProfileType.Infiltration, name, openStudioConversionContext); + if (infiltrationSchedule != null) + { + double exteriorArea = 0; + List panels = adjacencyCluster.GetPanels(space); + if (panels != null) + { + foreach (Panel panel in panels) + { + // Exception isolation: SAM's geometry kernel can throw on + // pathological panels — skip them (they are diagnosed by the + // no-silent-drop check) instead of crashing the conversion. + try + { + if (panel == null || !adjacencyCluster.ExposedToSun(panel)) + { + continue; + } + + double panelArea = panel.GetArea(); + if (!double.IsNaN(panelArea)) + { + exteriorArea += panelArea; + } + } + catch (System.Exception) + { + continue; + } + } + } + + if (exteriorArea > 0) + { + global::OpenStudio.SpaceInfiltrationDesignFlowRate spaceInfiltrationDesignFlowRate = new global::OpenStudio.SpaceInfiltrationDesignFlowRate(openStudioConversionContext.Target); + spaceInfiltrationDesignFlowRate.setName(name + "_Infiltration"); + spaceInfiltrationDesignFlowRate.setFlowperExteriorSurfaceArea(infiltrationAirFlow / exteriorArea); + spaceInfiltrationDesignFlowRate.setSchedule(infiltrationSchedule); + spaceInfiltrationDesignFlowRate.setSpaceType(result); + } + else + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.InternalConditionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "Space has no sun-exposed panels; infiltration skipped", internalCondition, name); + openStudioConversionContext.RegisterSkip(); + } + } + } + + // Outdoor air (ventilation): SpaceType-level DesignSpecificationOutdoorAir, method + // Sum, from the condition's supply parameters (per person / per area / ACH / + // absolute). SpaceParameter.OutsideSupplyAirFlow still takes precedence — the + // orchestrator assigns a per-space DSOA which overrides the SpaceType one in + // EnergyPlus. A named-but-unresolved ventilation profile is an error; without a + // named profile the rates are unscheduled (fraction 1). + double supplyAirFlowPerPerson = ParameterValue(internalCondition, InternalConditionParameter.SupplyAirFlowPerPerson); + double supplyAirFlowPerArea = ParameterValue(internalCondition, InternalConditionParameter.SupplyAirFlowPerArea); + double supplyAirChangesPerHour = ParameterValue(internalCondition, InternalConditionParameter.SupplyAirChangesPerHour); + double supplyAirFlow = ParameterValue(internalCondition, InternalConditionParameter.SupplyAirFlow); + + if (supplyAirFlowPerPerson > 0 || supplyAirFlowPerArea > 0 || supplyAirChangesPerHour > 0 || supplyAirFlow > 0) + { + global::OpenStudio.DesignSpecificationOutdoorAir designSpecificationOutdoorAir = new global::OpenStudio.DesignSpecificationOutdoorAir(openStudioConversionContext.Target); + designSpecificationOutdoorAir.setName(name + "_DesignSpecificationOutdoorAir"); + designSpecificationOutdoorAir.setOutdoorAirMethod("Sum"); + designSpecificationOutdoorAir.setOutdoorAirFlowperPerson(supplyAirFlowPerPerson > 0 ? supplyAirFlowPerPerson : 0); + designSpecificationOutdoorAir.setOutdoorAirFlowperFloorArea(supplyAirFlowPerArea > 0 ? supplyAirFlowPerArea : 0); + designSpecificationOutdoorAir.setOutdoorAirFlowAirChangesperHour(supplyAirChangesPerHour > 0 ? supplyAirChangesPerHour : 0); + designSpecificationOutdoorAir.setOutdoorAirFlowRate(supplyAirFlow > 0 ? supplyAirFlow : 0); + + string ventilationProfileName = internalCondition.GetProfileName(ProfileType.Ventilation); + if (ventilationProfileName != null) + { + global::OpenStudio.Schedule ventilationSchedule = RequiredSchedule(internalCondition, profileDictionary, ProfileType.Ventilation, name, openStudioConversionContext); + if (ventilationSchedule != null) + { + designSpecificationOutdoorAir.setOutdoorAirFlowRateFractionSchedule(ventilationSchedule); + } + } + + result.setDesignSpecificationOutdoorAir(designSpecificationOutdoorAir); + } + + // Pollutant modelling (generation rates / profile) has no safe EnergyPlus + // equivalent in scope — reported, never silently dropped. + double pollutantPerPerson = ParameterValue(internalCondition, InternalConditionParameter.PollutantGenerationPerPerson); + double pollutantPerArea = ParameterValue(internalCondition, InternalConditionParameter.PollutantGenerationPerArea); + if (pollutantPerPerson > 0 || pollutantPerArea > 0 || internalCondition.GetProfileName(ProfileType.Pollutant) != null) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.InternalConditionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "Pollutant generation is not converted (EnergyPlus generic contaminant modelling is out of scope)", internalCondition, name); + openStudioConversionContext.RegisterSkip(); + } + + // TAS ventilation function expressions have no deterministic mapping. + if (!string.IsNullOrWhiteSpace(internalCondition.GetValue(InternalConditionParameter.VentilationFunction)) + || !double.IsNaN(ParameterValue(internalCondition, InternalConditionParameter.VentilationFunctionFactor)) + || !double.IsNaN(ParameterValue(internalCondition, InternalConditionParameter.VentilationFunctionSetback))) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.InternalConditionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, "Ventilation function (TAS expression/factor/setback) is not converted", internalCondition, name); + openStudioConversionContext.RegisterSkip(); + } + + // TAS view coefficients and the lighting control function (coverage manifest, + // Unsupported SAM-OS-IC-001 info; review P1-01): OS:People and OS:ElectricEquipment + // have no visible-fraction field, and the TAS control expression has no + // deterministic daylighting-control mapping. Reported per SpaceType. + if (!double.IsNaN(ParameterValue(internalCondition, InternalConditionParameter.OccupancyViewCoefficient))) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.InternalConditionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, "Occupancy view coefficient is not converted — OS:People has no visible-fraction field", internalCondition, name); + openStudioConversionContext.RegisterSkip(); + } + + if (!double.IsNaN(ParameterValue(internalCondition, InternalConditionParameter.EquipmentViewCoefficient))) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.InternalConditionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, "Equipment view coefficient is not converted — OS:ElectricEquipment has no visible-fraction field", internalCondition, name); + openStudioConversionContext.RegisterSkip(); + } + + if (!string.IsNullOrWhiteSpace(internalCondition.GetValue(InternalConditionParameter.LightingControlFunction))) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.InternalConditionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, "Lighting control function (TAS control expression) is not converted — no deterministic daylighting-control mapping", internalCondition, name); + openStudioConversionContext.RegisterSkip(); + } + + // Deferred detailed-HVAC data (coverage manifest, Deferred SAM-OS-HVAC-001 info; + // review P1-01): Ideal Loads is a purely convective air system without fan/air-loop + // equipment, so emitter characteristics and exhaust flows wait for the HVAC + // programme. One diagnostic per group, naming every present parameter. + List emitterParameterNames = PresentParameterNames(internalCondition, + InternalConditionParameter.HeatingEmitterRadiantProportion, + InternalConditionParameter.HeatingEmitterCoefficient, + InternalConditionParameter.CoolingEmitterRadiantProportion, + InternalConditionParameter.CoolingEmitterCoefficient); + if (emitterParameterNames.Count > 0) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.HvacMissingSetpoints, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, string.Format("Emitter characteristics ({0}) are not converted — Ideal Loads is a purely convective air system; emitters are deferred to the detailed-HVAC programme", string.Join(", ", emitterParameterNames)), internalCondition, name); + openStudioConversionContext.RegisterSkip(); + } + + List exhaustParameterNames = PresentParameterNames(internalCondition, + InternalConditionParameter.ExhaustAirFlowPerPerson, + InternalConditionParameter.ExhaustAirChangesPerHour, + InternalConditionParameter.ExhaustAirFlowPerArea, + InternalConditionParameter.ExhaustAirFlow); + if (exhaustParameterNames.Count > 0) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.HvacMissingSetpoints, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, string.Format("Exhaust air flows ({0}) are not converted — exhaust needs fan/air-loop equipment, deferred to the detailed-HVAC programme", string.Join(", ", exhaustParameterNames)), internalCondition, name); + openStudioConversionContext.RegisterSkip(); + } + + return result; + } + + private static List PresentParameterNames(InternalCondition internalCondition, params InternalConditionParameter[] internalConditionParameters) + { + List result = new List(); + foreach (InternalConditionParameter internalConditionParameter in internalConditionParameters) + { + if (!double.IsNaN(ParameterValue(internalCondition, internalConditionParameter))) + { + result.Add(internalConditionParameter.ToString()); + } + } + + return result; + } + + private static double ParameterValue(InternalCondition internalCondition, InternalConditionParameter internalConditionParameter) + { + double value; + return internalCondition.TryGetValue(internalConditionParameter, out value) ? value : double.NaN; + } + + private static global::OpenStudio.Schedule RequiredSchedule(InternalCondition internalCondition, Dictionary profileDictionary, ProfileType profileType, string openStudioObjectName, OpenStudioConversionContext openStudioConversionContext) + { + Profile profile; + if (!profileDictionary.TryGetValue(profileType, out profile) || profile == null) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ScheduleMissingProfile, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("{0} gains are defined but the {0} profile '{1}' was not found; the load is skipped (never AlwaysOn)", profileType, internalCondition.GetProfileName(profileType)), internalCondition, openStudioObjectName); + openStudioConversionContext.RegisterSkip(); + return null; + } + + return profile.ToOpenStudio(profileType, openStudioConversionContext); + } + + /// + /// Deterministic content hash (8 hex chars) of an internal condition's full parameter + /// content — parameters, profile-name references and nested parameter sets — with every + /// Guid excluded so clones hash identically regardless of their SAM Guids, extended with + /// the per-space computed load densities so spaces with different evaluated densities + /// never share one SpaceType. Two conditions with equal names, equal content and equal + /// evaluated densities share a hash; any difference changes it. + /// + private static string ContentHash(InternalCondition internalCondition, params double[] spaceDensities) + { + JsonObject jsonObject = internalCondition.ToJsonObject(); + StringBuilder stringBuilder = new StringBuilder(); + AppendContent(jsonObject, stringBuilder); + + if (spaceDensities != null) + { + foreach (double density in spaceDensities) + { + stringBuilder.Append("density=").Append(density.ToString("R", System.Globalization.CultureInfo.InvariantCulture)).Append(';'); + } + } + + using (MD5 mD5 = MD5.Create()) + { + byte[] hash = mD5.ComputeHash(Encoding.UTF8.GetBytes(stringBuilder.ToString())); + StringBuilder result = new StringBuilder(8); + for (int i = 0; i < 4; i++) + { + result.Append(hash[i].ToString("x2")); + } + + return result.ToString(); + } + } + + private static void AppendContent(JsonNode jsonNode, StringBuilder stringBuilder) + { + if (jsonNode is JsonObject jsonObject) + { + foreach (KeyValuePair keyValuePair in jsonObject) + { + if (keyValuePair.Key == "Guid") + { + continue; + } + + stringBuilder.Append(keyValuePair.Key).Append('='); + AppendContent(keyValuePair.Value, stringBuilder); + stringBuilder.Append(';'); + } + + return; + } + + if (jsonNode is JsonArray jsonArray) + { + foreach (JsonNode item in jsonArray) + { + AppendContent(item, stringBuilder); + stringBuilder.Append(';'); + } + + return; + } + + stringBuilder.Append(jsonNode?.ToJsonString()); + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Material.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Material.cs new file mode 100644 index 0000000..9b2cbb9 --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Material.cs @@ -0,0 +1,353 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; +using System.Globalization; +using SAM.Core; + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Convert + { + /// + /// Converts a SAM material to an OpenStudio material in the given construction-usage + /// context, following docs/SAM_OPENSTUDIO_MATERIAL_MAPPING.md. Opaque and transparent + /// materials produce the same object in both contexts; a SAM GasMaterial becomes an + /// OpenStudio AirGap (OS:Material:AirGap, R = 1/h from its Heat Transfer Coefficient + /// [W/m²K]) in an opaque construction and an OpenStudio Gas (OS:WindowMaterial:Gas) in a + /// fenestration pane construction — the cache key includes the usage, so the two objects + /// are never shared. Invalid physical values raise SAM-OS-MAT-001 errors (no hidden + /// defaults), missing optical values raise warnings and keep the documented OpenStudio + /// defaults. + /// + /// SAM material (OpaqueMaterial, TransparentMaterial or GasMaterial). + /// Layer thickness [m] from the construction layer. + /// Conversion context. + /// Construction-usage context (opaque or fenestration). + /// OpenStudio material, or null when unsupported/invalid (diagnostic raised). + public static global::OpenStudio.Material ToOpenStudio(this IMaterial material, double thickness, OpenStudioConversionContext openStudioConversionContext, OpenStudioMaterialUsage openStudioMaterialUsage = OpenStudioMaterialUsage.OpaqueConstruction) + { + if (material == null || openStudioConversionContext == null) + { + return null; + } + + SAMObject sAMObject = material as SAMObject; + if (sAMObject == null) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.MaterialUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("Unsupported material kind {0}", material.GetType().Name)); + return null; + } + + // Vapour diffusion factor (coverage manifest AnalyticalMaterialParameter + // .VapourDiffusionFactor, Unsupported SAM-OS-MAT-002 info; review P1-01): the + // EnergyPlus CTF heat balance carries no moisture transport, and HAMT/EMPD need + // data SAM does not hold. Reported once per material, any kind, thickness or usage. + if (sAMObject.TryGetValue(MaterialParameter.VapourDiffusionFactor, out double vapourDiffusionFactor) && !double.IsNaN(vapourDiffusionFactor) && vapourDiffusionFactor > 0 + && openStudioConversionContext.RegisterOnce("SAM-OS-MAT-002:VapourDiffusionFactor:" + sAMObject.Guid.ToString("N"))) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.MaterialUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, string.Format(CultureInfo.InvariantCulture, "Vapour diffusion factor ({0:G4}) is not converted — EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", vapourDiffusionFactor), sAMObject); + } + + if (material is GasMaterial gasMaterial) + { + return openStudioMaterialUsage == OpenStudioMaterialUsage.FenestrationConstruction + ? ToOpenStudio_WindowGas(gasMaterial, sAMObject, thickness, openStudioConversionContext) + : ToOpenStudio_AirGap(gasMaterial, sAMObject, openStudioConversionContext); + } + + string cacheKey = string.Format(CultureInfo.InvariantCulture, "{0:N}:{1:R}", sAMObject.Guid, thickness); + global::OpenStudio.Material cached; + if (openStudioConversionContext.MaterialMap.TryGetValue(cacheKey, out cached)) + { + return cached; + } + + if (double.IsNaN(thickness) || thickness <= 0) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.MaterialUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("Invalid layer thickness {0} m", thickness), sAMObject); + return null; + } + + string name = Core.OpenStudio.Query.OpenStudioName(sAMObject.GetType().Name, string.Format(CultureInfo.InvariantCulture, "{0}_{1:0.###}mm", sAMObject.Name, thickness * 1000), sAMObject.Guid); + + global::OpenStudio.Material result = null; + + if (material is OpaqueMaterial opaqueMaterial) + { + if (!IsValidPositive(opaqueMaterial.ThermalConductivity) || !IsValidPositive(opaqueMaterial.Density) || !IsValidPositive(opaqueMaterial.SpecificHeatCapacity)) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.MaterialUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("Invalid physical properties (conductivity {0}, density {1}, specific heat {2})", opaqueMaterial.ThermalConductivity, opaqueMaterial.Density, opaqueMaterial.SpecificHeatCapacity), sAMObject, name); + return null; + } + + global::OpenStudio.StandardOpaqueMaterial standardOpaqueMaterial = new global::OpenStudio.StandardOpaqueMaterial(openStudioConversionContext.Target); + standardOpaqueMaterial.setRoughness("MediumSmooth"); + standardOpaqueMaterial.setThickness(thickness); + standardOpaqueMaterial.setThermalConductivity(opaqueMaterial.ThermalConductivity); + standardOpaqueMaterial.setDensity(opaqueMaterial.Density); + standardOpaqueMaterial.setSpecificHeat(opaqueMaterial.SpecificHeatCapacity); + + if (TryGetFraction(openStudioConversionContext, sAMObject, OpaqueMaterialParameter.ExternalEmissivity, name, out double externalEmissivity)) + { + standardOpaqueMaterial.setThermalAbsorptance(externalEmissivity); + } + + if (TryGetFraction(openStudioConversionContext, sAMObject, OpaqueMaterialParameter.ExternalSolarReflectance, name, out double externalSolarReflectance)) + { + standardOpaqueMaterial.setSolarAbsorptance(1 - externalSolarReflectance); + } + + if (TryGetFraction(openStudioConversionContext, sAMObject, OpaqueMaterialParameter.ExternalLightReflectance, name, out double externalLightReflectance)) + { + standardOpaqueMaterial.setVisibleAbsorptance(1 - externalLightReflectance); + } + + // Single-sided approximation (coverage manifest OpaqueMaterialParameter + // .Internal*, Approximated SAM-OS-MAT-002 info when Internal differs from + // External; review P1-01): EnergyPlus opaque materials carry one absorptance + // set — the external-side values govern both sides. Reported once per material. + List divergentInternalOptics = DivergentInternalOptics(sAMObject); + if (divergentInternalOptics.Count > 0 + && openStudioConversionContext.RegisterOnce("SAM-OS-MAT-002:InternalOptics:" + sAMObject.Guid.ToString("N"))) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.MaterialUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, string.Format("Internal-side optical properties ({0}) differ from the external-side values — EnergyPlus opaque materials are single-sided; the external values govern both sides", string.Join(", ", divergentInternalOptics)), sAMObject, name); + } + + result = standardOpaqueMaterial; + } + else if (material is TransparentMaterial transparentMaterial) + { + if (openStudioMaterialUsage != OpenStudioMaterialUsage.FenestrationConstruction) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.MaterialUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "TransparentMaterial (glazing) cannot be used as a layer of an opaque construction — mixed opaque/fenestration material families are rejected", sAMObject, name); + return null; + } + + if (!IsValidPositive(transparentMaterial.ThermalConductivity)) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.MaterialUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("Invalid thermal conductivity {0}", transparentMaterial.ThermalConductivity), sAMObject, name); + return null; + } + + if (sAMObject.TryGetValue(TransparentMaterialParameter.IsBlind, out bool isBlind) && isBlind) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.MaterialUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, "Material is flagged as a blind but SAM carries no slat geometry — converted as plain glazing (no WindowMaterial:Blind fabricated)", sAMObject, name); + } + + global::OpenStudio.StandardGlazing standardGlazing = new global::OpenStudio.StandardGlazing(openStudioConversionContext.Target); + standardGlazing.setThickness(thickness); + standardGlazing.setThermalConductivity(transparentMaterial.ThermalConductivity); + standardGlazing.setInfraredTransmittance(0); + standardGlazing.setDirtCorrectionFactorforSolarandVisibleTransmittance(1); + standardGlazing.setSolarDiffusing(false); + + // EnergyPlus defines the glazing Front side as "the side of the layer opposite + // the zone" (exterior-facing for exterior windows) and Back as the side closest + // to the zone (I/O Reference, Materials for Glass Windows and Doors). SAM + // External* is the building-exterior-facing side and Internal* the room-facing + // side, therefore External → Front and Internal → Back. (SAM_LadybugTools + // EnergyWindowMaterialGlazing.cs maps these the other way round — a deliberate + // deviation recorded in docs/SAM_OPENSTUDIO_MATERIAL_MAPPING.md, review P1-04.) + if (TryGetFraction(openStudioConversionContext, sAMObject, TransparentMaterialParameter.SolarTransmittance, name, out double solarTransmittance)) + { + standardGlazing.setSolarTransmittanceatNormalIncidence(solarTransmittance); + } + + if (TryGetFraction(openStudioConversionContext, sAMObject, TransparentMaterialParameter.ExternalSolarReflectance, name, out double externalSolarReflectance)) + { + standardGlazing.setFrontSideSolarReflectanceatNormalIncidence(externalSolarReflectance); + } + + if (TryGetFraction(openStudioConversionContext, sAMObject, TransparentMaterialParameter.InternalSolarReflectance, name, out double internalSolarReflectance)) + { + standardGlazing.setBackSideSolarReflectanceatNormalIncidence(internalSolarReflectance); + } + + if (TryGetFraction(openStudioConversionContext, sAMObject, TransparentMaterialParameter.LightTransmittance, name, out double lightTransmittance)) + { + standardGlazing.setVisibleTransmittanceatNormalIncidence(lightTransmittance); + } + + if (TryGetFraction(openStudioConversionContext, sAMObject, TransparentMaterialParameter.ExternalLightReflectance, name, out double externalLightReflectance)) + { + standardGlazing.setFrontSideVisibleReflectanceatNormalIncidence(externalLightReflectance); + } + + if (TryGetFraction(openStudioConversionContext, sAMObject, TransparentMaterialParameter.InternalLightReflectance, name, out double internalLightReflectance)) + { + standardGlazing.setBackSideVisibleReflectanceatNormalIncidence(internalLightReflectance); + } + + if (TryGetFraction(openStudioConversionContext, sAMObject, TransparentMaterialParameter.ExternalEmissivity, name, out double externalEmissivity)) + { + standardGlazing.setFrontSideInfraredHemisphericalEmissivity(externalEmissivity); + } + + if (TryGetFraction(openStudioConversionContext, sAMObject, TransparentMaterialParameter.InternalEmissivity, name, out double internalEmissivity)) + { + standardGlazing.setBackSideInfraredHemisphericalEmissivity(internalEmissivity); + } + + result = standardGlazing; + } + else + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.MaterialUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("Unsupported material kind {0}", material.GetType().Name), sAMObject, name); + return null; + } + + result.setName(name); + + openStudioConversionContext.MaterialMap[cacheKey] = result; + if (!openStudioConversionContext.References.Contains(sAMObject.Guid)) + { + openStudioConversionContext.RegisterModelObject(sAMObject, result); + } + + return result; + } + + /// + /// Opaque-context conversion of a SAM GasMaterial: an air/gas cavity layer of an opaque + /// construction becomes an OpenStudio AirGap (OS:Material:AirGap). The thermal resistance + /// is derived from SAM's authoritative cavity conductance — GasMaterialParameter + /// .HeatTransferCoefficient h [W/m²K] (written by SAM's UpdateHeatTransferCoefficients + /// from gas type, thickness and tilt) — as R = 1/h [m²K/W]. Missing, non-finite, + /// non-positive, or below-EnergyPlus-minimum (0.001 m²K/W) values raise SAM-OS-MAT-001 + /// errors before any CLI execution — never a silent zero-resistance layer. + /// + private static global::OpenStudio.Material ToOpenStudio_AirGap(GasMaterial gasMaterial, SAMObject sAMObject, OpenStudioConversionContext openStudioConversionContext) + { + const double energyPlusMinimumResistance = 0.001; // InitConductionTransferFunctions per-layer minimum [m²K/W] + + string name = Core.OpenStudio.Query.OpenStudioName(sAMObject.GetType().Name, sAMObject.Name, sAMObject.Guid); + + double heatTransferCoefficient = double.NaN; + if (!sAMObject.TryGetValue(GasMaterialParameter.HeatTransferCoefficient, out heatTransferCoefficient) || double.IsNaN(heatTransferCoefficient) || double.IsInfinity(heatTransferCoefficient) || heatTransferCoefficient <= 0) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.MaterialUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("Opaque gas cavity has no usable Heat Transfer Coefficient [W/m²K] (value {0}); the thermal resistance cannot be derived — no layer was substituted", double.IsNaN(heatTransferCoefficient) ? "missing" : heatTransferCoefficient.ToString(CultureInfo.InvariantCulture)), sAMObject, name); + return null; + } + + double thermalResistance = 1.0 / heatTransferCoefficient; + if (double.IsNaN(thermalResistance) || double.IsInfinity(thermalResistance) || thermalResistance < energyPlusMinimumResistance) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.MaterialUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format(CultureInfo.InvariantCulture, "Opaque gas cavity resistance {0:G4} m²K/W (from conductance {1} W/m²K) is below the EnergyPlus per-layer minimum {2:G4} m²K/W", thermalResistance, heatTransferCoefficient, energyPlusMinimumResistance), sAMObject, name); + return null; + } + + string cacheKey = string.Format(CultureInfo.InvariantCulture, "{0:N}:OpaqueAirGap:{1:R}", sAMObject.Guid, thermalResistance); + global::OpenStudio.Material cached; + if (openStudioConversionContext.MaterialMap.TryGetValue(cacheKey, out cached)) + { + return cached; + } + + global::OpenStudio.AirGap result = new global::OpenStudio.AirGap(openStudioConversionContext.Target); + result.setName(name); + result.setThermalResistance(thermalResistance); + + openStudioConversionContext.MaterialMap[cacheKey] = result; + if (!openStudioConversionContext.References.Contains(sAMObject.Guid)) + { + openStudioConversionContext.RegisterModelObject(sAMObject, result); + } + + return result; + } + + /// + /// Fenestration-context conversion of a SAM GasMaterial: a gas layer between glazing + /// panes becomes an OpenStudio Gas (OS:WindowMaterial:Gas), preserving gas type and + /// physical thickness with the existing supported-gas validation (Air/Argon/Krypton/Xenon). + /// + private static global::OpenStudio.Material ToOpenStudio_WindowGas(GasMaterial gasMaterial, SAMObject sAMObject, double thickness, OpenStudioConversionContext openStudioConversionContext) + { + string name = Core.OpenStudio.Query.OpenStudioName(sAMObject.GetType().Name, string.Format(CultureInfo.InvariantCulture, "{0}_{1:0.###}mm", sAMObject.Name, thickness * 1000), sAMObject.Guid); + + if (double.IsNaN(thickness) || thickness <= 0) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.MaterialUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("Invalid layer thickness {0} m", thickness), sAMObject, name); + return null; + } + + DefaultGasType defaultGasType = gasMaterial.DefaultGasType(); + if (defaultGasType != DefaultGasType.Air && defaultGasType != DefaultGasType.Argon && defaultGasType != DefaultGasType.Krypton && defaultGasType != DefaultGasType.Xenon) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.MaterialUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("Gas type {0} is not supported by OpenStudio (Air/Argon/Krypton/Xenon)", defaultGasType), sAMObject, name); + return null; + } + + string cacheKey = string.Format(CultureInfo.InvariantCulture, "{0:N}:WindowGas:{1:R}", sAMObject.Guid, thickness); + global::OpenStudio.Material cached; + if (openStudioConversionContext.MaterialMap.TryGetValue(cacheKey, out cached)) + { + return cached; + } + + global::OpenStudio.Gas result = new global::OpenStudio.Gas(openStudioConversionContext.Target); + result.setName(name); + result.setGasType(defaultGasType.ToString()); + result.setThickness(thickness); + + openStudioConversionContext.MaterialMap[cacheKey] = result; + if (!openStudioConversionContext.References.Contains(sAMObject.Guid)) + { + openStudioConversionContext.RegisterModelObject(sAMObject, result); + } + + return result; + } + + /// + /// Names of the opaque Internal* optical parameters whose value is present and diverges + /// from its External* counterpart (or has no external counterpart to govern it) — the + /// cases where the single-sided EnergyPlus approximation loses information. + /// + private static List DivergentInternalOptics(SAMObject sAMObject) + { + List result = new List(); + AddDivergentInternalOptic(sAMObject, OpaqueMaterialParameter.InternalEmissivity, OpaqueMaterialParameter.ExternalEmissivity, result); + AddDivergentInternalOptic(sAMObject, OpaqueMaterialParameter.InternalSolarReflectance, OpaqueMaterialParameter.ExternalSolarReflectance, result); + AddDivergentInternalOptic(sAMObject, OpaqueMaterialParameter.InternalLightReflectance, OpaqueMaterialParameter.ExternalLightReflectance, result); + return result; + } + + private static void AddDivergentInternalOptic(SAMObject sAMObject, OpaqueMaterialParameter internalParameter, OpaqueMaterialParameter externalParameter, List divergent) + { + if (!sAMObject.TryGetValue(internalParameter, out double internalValue) || double.IsNaN(internalValue)) + { + return; + } + + if (!sAMObject.TryGetValue(externalParameter, out double externalValue) || double.IsNaN(externalValue) || Math.Abs(internalValue - externalValue) > 1e-9) + { + divergent.Add(internalParameter.ToString()); + } + } + + private static bool IsValidPositive(double value) + { + return !double.IsNaN(value) && !double.IsInfinity(value) && value > 0; + } + + private static bool TryGetFraction(OpenStudioConversionContext openStudioConversionContext, SAMObject sAMObject, Enum parameter, string openStudioObjectName, out double value) + { + if (!sAMObject.TryGetValue(parameter, out value) || double.IsNaN(value)) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.MaterialUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Parameter {0} missing; OpenStudio default retained", parameter), sAMObject, openStudioObjectName); + return false; + } + + if (value < 0 || value > 1) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.MaterialUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("Parameter {0} value {1} outside [0,1]", parameter, value), sAMObject, openStudioObjectName); + return false; + } + + return true; + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Panel.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Panel.cs new file mode 100644 index 0000000..bc53879 --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Panel.cs @@ -0,0 +1,210 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; +using SAM.Geometry.OpenStudio; +using SAM.Geometry.Spatial; + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Convert + { + /// + /// Converts one space-facing side of a SAM Panel to an OpenStudio Surface. The panel is + /// expected to come from AdjacencyCluster.UpdateNormals for the owning space, so its + /// Face3D winding already gives an outward (out-of-space) normal — vertices are converted + /// in that order. Geometry is cleaned and validated (never repaired beyond cleaning); + /// failures are recorded as diagnostics and the surface is skipped. The first created side + /// of a panel is registered as its primary surface; boundary conditions and adjacent + /// surfaces are resolved by the orchestrator in a later pass. + /// + /// Space-oriented SAM panel (from UpdateNormals). + /// OpenStudio space this side belongs to. + /// AdjacencyCluster index of the owning space (name disambiguation). + /// Conversion context. + /// Registry collecting created SubSurfaces per aperture Guid for later pairing; may be null. + /// The created Surface, or null when skipped. + public static global::OpenStudio.Surface ToOpenStudio(this Panel panel, global::OpenStudio.Space openStudioSpace, int spaceIndex, OpenStudioConversionContext openStudioConversionContext, IDictionary> subSurfacesByAperture = null) + { + if (panel == null || openStudioSpace == null || openStudioConversionContext == null) + { + return null; + } + + if (panel.PanelType == PanelType.Shade) + { + return null; + } + + string name = Core.OpenStudio.Query.OpenStudioName("Surface", string.Format("{0}_{1}", panel.Name, spaceIndex), panel.Guid); + + Face3D face3D = panel.GetFace3D(); + if (face3D == null) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.GeometryInvalidBoundary, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "Panel has no geometry", panel, name); + return null; + } + + ISegmentable3D segmentable3D = face3D.GetExternalEdge3D() as ISegmentable3D; + List point3Ds = segmentable3D?.GetPoints(); + + List diagnostics = Geometry.OpenStudio.Query.ValidatePolygon(point3Ds, openStudioConversionContext.Options.DistanceTolerance, openStudioConversionContext.Options.AngleTolerance, openStudioConversionContext.Options.MinimumArea); + bool valid = true; + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in diagnostics) + { + openStudioConversionContext.AddDiagnostic(diagnostic.Code, diagnostic.Severity, diagnostic.Message, panel, name); + if (diagnostic.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error) + { + valid = false; + } + } + + if (!valid) + { + return null; + } + + List internalEdges = face3D.GetInternalEdge3Ds(); + if (internalEdges != null && internalEdges.Count > 0) + { + // Holes are never fabricated into windows: the external boundary only is used, + // reported with the panel Guid (attached to the diagnostic) and a geometry + // summary (count, per-hole and total area). + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + double totalHoleArea = 0; + int reportedHoles = 0; + foreach (IClosedPlanar3D internalEdge in internalEdges) + { + if (internalEdge == null) + { + continue; + } + + double holeArea = double.NaN; + try + { + holeArea = internalEdge.GetArea(); + } + catch (System.Exception) + { + // geometry kernel failure — report the hole without its area + } + + if (!double.IsNaN(holeArea)) + { + totalHoleArea += holeArea; + if (reportedHoles < 5) + { + stringBuilder.Append(string.Format(" hole{0}={1:G4} m²;", reportedHoles + 1, holeArea)); + } + } + + reportedHoles++; + } + + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.GeometryInvalidBoundary, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Panel face has {0} internal edge(s) (holes, total area {1:G4} m²):{2}{3} holes are not converted — only the external boundary is used", internalEdges.Count, totalHoleArea, stringBuilder.ToString(), reportedHoles > 5 ? string.Format(" (+{0} more);", reportedHoles - 5) : string.Empty), panel, name); + openStudioConversionContext.RegisterSkip(); + } + + // The Face3D external-edge order does NOT reliably wind about the panel's outward + // normal, so align it explicitly — the same normalisation the aperture already + // applies to its SubSurface. Without this every surface was emitted facing into the + // space: EnergyPlus reported "Floor is upside down", "Roof/Ceiling is upside down" + // and "Indicated Zone Volume <= 0.0", and rejected every window with + // "checkSubSurfAzTiltNorm: Outward facing angle of subsurface differs more than 90.0 + // degrees from base surface" — fatal, because the aperture was wound outward while + // its host was wound inward. + List surfacePoint3Ds = Geometry.OpenStudio.Query.CleanVertices(point3Ds, openStudioConversionContext.Options.DistanceTolerance, openStudioConversionContext.Options.AngleTolerance); + if (surfacePoint3Ds == null || surfacePoint3Ds.Count < 3) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.GeometryInvalidBoundary, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "Panel boundary could not be converted to an OpenStudio polygon", panel, name); + return null; + } + + // EnergyPlus applies its own 0.01 m vertex-proximity rule on top of our cleaning: + // a sliver panel collapses below three sides and is reported as a severe + // "degenerate surface". Reject it here instead — EnergyPlus never sees it. + int energyPlusSides = Geometry.OpenStudio.Query.EnergyPlusSideCount(surfacePoint3Ds); + if (energyPlusSides < 3) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.GeometryInvalidBoundary, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Panel would be degenerate in EnergyPlus: its vertices collapse to {0} side(s) under the 0.01 m proximity rule (sliver geometry); skipped — repair the source panel", energyPlusSides), panel, name); + openStudioConversionContext.RegisterSkip(); + return null; + } + + if (Geometry.OpenStudio.Query.IsClockwise(surfacePoint3Ds, panel.Normal)) + { + surfacePoint3Ds.Reverse(); + } + + global::OpenStudio.Point3dVector point3dVector = surfacePoint3Ds.ToOpenStudio(); + if (point3dVector == null || point3dVector.Count < 3) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.GeometryInvalidBoundary, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "Panel boundary could not be converted to an OpenStudio polygon", panel, name); + return null; + } + + global::OpenStudio.Surface result = new global::OpenStudio.Surface(point3dVector, openStudioConversionContext.Target); + result.setName(name); + result.setSpace(openStudioSpace); + + string surfaceType = Query.SurfaceType(panel); + if (!string.IsNullOrWhiteSpace(surfaceType)) + { + result.setSurfaceType(surfaceType); + } + + // Identity on EVERY side, not just the primary one. RegisterModelObject is + // deliberately once-per-Guid — it is the traceability map — but an internal panel + // produces two surfaces, and a reverse import that happens to meet the unstamped side + // first would issue that panel a fresh Guid. Which side it meets depends on + // OpenStudio's handle ordering, so stamping only the primary made round-trip identity + // intermittent. + Core.OpenStudio.Modify.SetSAMIdentity(result, panel); + + if (!openStudioConversionContext.PrimarySurfaceMap.ContainsKey(panel.Guid)) + { + openStudioConversionContext.PrimarySurfaceMap[panel.Guid] = result; + openStudioConversionContext.RegisterModelObject(panel, result); + + // Panel-level feature shade (coverage manifest PanelParameter.FeatureShade, + // Unsupported SAM-OS-CON-002 info; review P1-01): SAM carries no shade/slat + // geometry to build shading surfaces or WindowShadingControl. Reported once per + // panel (with the primary side). + if (panel.GetValue(PanelParameter.FeatureShade) != null) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ConstructionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, "Panel feature shade is not converted — SAM carries no shade/slat geometry to build shading surfaces or WindowShadingControl", panel, name); + openStudioConversionContext.RegisterSkip(); + } + } + + List apertures = panel.Apertures; + if (apertures != null) + { + foreach (Aperture aperture in apertures) + { + global::OpenStudio.SubSurface subSurface = aperture.ToOpenStudio(result, panel, spaceIndex, openStudioConversionContext); + if (subSurface == null) + { + continue; + } + + if (subSurfacesByAperture != null) + { + List subSurfaces; + if (!subSurfacesByAperture.TryGetValue(aperture.Guid, out subSurfaces)) + { + subSurfaces = new List(); + subSurfacesByAperture[aperture.Guid] = subSurfaces; + } + + subSurfaces.Add(subSurface); + } + } + } + + return result; + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Profile.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Profile.cs new file mode 100644 index 0000000..2f8c67a --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Profile.cs @@ -0,0 +1,309 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Convert + { + /// + /// Converts a SAM Profile to an OpenStudio ScheduleFixedInterval with 8760 hourly values + /// (expansion rules in docs/SAM_OPENSTUDIO_INTERNAL_CONDITION_MAPPING.md): annual profiles + /// pass through; daily sub-profiles are cycled to a Monday-first week (SAM_LadybugTools + /// parity) and tiled across 365 days; shorter sequences are held/averaged to hourly. + /// Type limits follow the profile type (fractional, temperature or activity level); + /// fraction values outside [0,1] raise warnings and are never clamped. Cached per + /// (Guid, ProfileType): the same profile reused under a different type (e.g. a fraction + /// profile used for both equipment and infiltration) yields a separate schedule with the + /// correct type limits and a per-type name. + /// + /// SAM profile. + /// Semantic usage, selects schedule type limits. + /// Conversion context. + /// The schedule, or null (diagnostic raised). + public static global::OpenStudio.Schedule ToOpenStudio(this Profile profile, ProfileType profileType, OpenStudioConversionContext openStudioConversionContext) + { + if (profile == null || openStudioConversionContext == null) + { + return null; + } + + string cacheKey = string.Format("{0}:{1}", profile.Guid, profileType); + + global::OpenStudio.Schedule cached; + if (openStudioConversionContext.ScheduleMap.TryGetValue(cacheKey, out cached)) + { + return cached; + } + + string name = Core.OpenStudio.Query.OpenStudioName("Schedule", string.Format("{0}_{1}", profile.Name, profileType), profile.Guid); + + double[] annualValues = AnnualHourlyValues(profile, name, openStudioConversionContext); + if (annualValues == null) + { + return null; + } + + bool temperature = profileType == ProfileType.Heating || profileType == ProfileType.Cooling; + bool percent = profileType == ProfileType.Humidification || profileType == ProfileType.Dehumidification; + if (!temperature) + { + double upper = percent ? 100 : 1; + foreach (double value in annualValues) + { + if (value < 0 || value > upper) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ScheduleMissingProfile, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("{0} profile contains value {1} outside [0,{2}]; not clamped", percent ? "Percent" : "Fraction", value, upper), profile, name); + break; + } + } + } + + global::OpenStudio.ScheduleFixedInterval result = new global::OpenStudio.ScheduleFixedInterval(openStudioConversionContext.Target); + result.setName(name); + result.setInterpolatetoTimestep(false); + result.setScheduleTypeLimits(ScheduleTypeLimits(openStudioConversionContext.Target, temperature ? "Temperature" : percent ? "Percent" : "Fractional")); + + global::OpenStudio.Vector vector = new global::OpenStudio.Vector((uint)annualValues.Length); + for (int i = 0; i < annualValues.Length; i++) + { + vector.__setitem__((uint)i, annualValues[i]); + } + + global::OpenStudio.TimeSeries timeSeries = new global::OpenStudio.TimeSeries(new global::OpenStudio.Date(new global::OpenStudio.MonthOfYear(1), 1), new global::OpenStudio.Time(0, 1, 0, 0), vector, string.Empty); + if (!result.setTimeSeries(timeSeries)) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ScheduleMissingProfile, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "OpenStudio rejected the annual time series", profile, name); + result.remove(); + return null; + } + + openStudioConversionContext.ScheduleMap[cacheKey] = result; + if (!openStudioConversionContext.References.Contains(profile.Guid)) + { + openStudioConversionContext.RegisterModelObject(profile, result); + } + + return result; + } + + /// + /// Creates (or returns) a constant annual schedule with the given value — used for + /// people activity levels. Deterministically named; one instance per (name, value). + /// + /// Conversion context. + /// Deterministic schedule name. + /// Constant value for every hour of the year. + /// "Fractional", "Temperature" or "ActivityLevel". + /// The constant schedule. + public static global::OpenStudio.Schedule ToOpenStudio_ConstantSchedule(this OpenStudioConversionContext openStudioConversionContext, string name, double value, string typeLimitsName) + { + global::OpenStudio.OptionalScheduleFixedInterval existing = openStudioConversionContext.Target.getScheduleFixedIntervalByName(name); + if (existing != null && !existing.isNull()) + { + return existing.get(); + } + + global::OpenStudio.ScheduleFixedInterval result = new global::OpenStudio.ScheduleFixedInterval(openStudioConversionContext.Target); + result.setName(name); + result.setInterpolatetoTimestep(false); + result.setScheduleTypeLimits(ScheduleTypeLimits(openStudioConversionContext.Target, typeLimitsName)); + + global::OpenStudio.Vector vector = new global::OpenStudio.Vector(8760, value); + global::OpenStudio.TimeSeries timeSeries = new global::OpenStudio.TimeSeries(new global::OpenStudio.Date(new global::OpenStudio.MonthOfYear(1), 1), new global::OpenStudio.Time(0, 1, 0, 0), vector, string.Empty); + result.setTimeSeries(timeSeries); + + return result; + } + + private static global::OpenStudio.ScheduleTypeLimits ScheduleTypeLimits(global::OpenStudio.Model model, string kind) + { + string name = "SAM_ScheduleTypeLimits_" + kind; + global::OpenStudio.OptionalScheduleTypeLimits existing = model.getScheduleTypeLimitsByName(name); + if (existing != null && !existing.isNull()) + { + return existing.get(); + } + + global::OpenStudio.ScheduleTypeLimits result = new global::OpenStudio.ScheduleTypeLimits(model); + result.setName(name); + result.setNumericType("Continuous"); + + switch (kind) + { + case "Fractional": + result.setLowerLimitValue(0); + result.setUpperLimitValue(1); + result.setUnitType("Dimensionless"); + break; + + case "Percent": + result.setLowerLimitValue(0); + result.setUpperLimitValue(100); + result.setUnitType("Percent"); + break; + + case "Temperature": + result.setUnitType("Temperature"); + break; + + case "ActivityLevel": + result.setLowerLimitValue(0); + result.setUnitType("ActivityLevel"); + break; + } + + return result; + } + + private static double[] ProfileValues(Profile profile) + { + // Profile stores an indexed (possibly range-compressed) sequence; Count is the index + // span, not the value count. The indexer over Min..Max resolves every hour reliably. + int min = profile.Min; + int max = profile.Max; + if (max < min) + { + return new double[0]; + } + + double[] result = new double[max - min + 1]; + for (int i = 0; i < result.Length; i++) + { + result[i] = profile[min + i]; + } + + return result; + } + + private static double[] AnnualHourlyValues(Profile profile, string openStudioObjectName, OpenStudioConversionContext openStudioConversionContext) + { + // Leap-year runs (OpenStudioConversionOptions.IsLeapYear) generate 8784-value + // schedules: explicit ≥8784 stores pass through (or truncate with a warning), + // explicit 8760 stores repeat 31 Dec, day-composed profiles tile 366 days. + int targetLength = openStudioConversionContext.Options.IsLeapYear == true ? 8784 : 8760; + + double[] profileValues = ProfileValues(profile); + if (profileValues.Length == 0) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ScheduleMissingProfile, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "Profile has no values", profile, openStudioObjectName); + return null; + } + + if (profileValues.Length == targetLength) + { + return CheckedAnnualValues(profile, profileValues, openStudioObjectName, openStudioConversionContext); + } + + if (profileValues.Length > targetLength) + { + // Longer profiles (e.g. 8784 leap-year values in a 365-day run): keep the first + // targetLength hours; never average the year into one day. + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ScheduleMissingProfile, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Profile has {0} values; the first {1} hours are used ({2}-day schedule policy)", profileValues.Length, targetLength, targetLength / 24), profile, openStudioObjectName); + double[] truncated = new double[targetLength]; + Array.Copy(profileValues, truncated, targetLength); + return CheckedAnnualValues(profile, truncated, openStudioObjectName, openStudioConversionContext); + } + + if (profileValues.Length == 8760 && targetLength == 8784) + { + // Explicit non-leap annual store in a leap-year run: repeat 31 Dec (the last + // 24 hours) — values are never stretched or interpolated. + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ScheduleMissingProfile, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, "Profile has 8760 values in a leap-year run; 31 December is repeated for day 366", profile, openStudioObjectName); + double[] extended = new double[8784]; + Array.Copy(profileValues, extended, 8760); + Array.Copy(profileValues, 8736, extended, 8760, 24); + return CheckedAnnualValues(profile, extended, openStudioObjectName, openStudioConversionContext); + } + + List subProfiles = null; + IEnumerable subProfilesEnumerable = profile.GetProfiles(); + if (subProfilesEnumerable != null) + { + subProfiles = new List(subProfilesEnumerable); + subProfiles.RemoveAll(x => x == null); + } + + if (subProfiles == null || subProfiles.Count == 0) + { + // SAM's own yearly expansion (Profile.GetYearlyValues / the wrapping indexer): + // the sequence tiles hour-for-hour at its own period — a 24-hour day repeats + // daily, a 168-hour week repeats weekly; nothing is stretched or averaged. + double[] tiled = new double[targetLength]; + for (int i = 0; i < tiled.Length; i++) + { + tiled[i] = profile[i]; + } + + return CheckedAnnualValues(profile, tiled, openStudioObjectName, openStudioConversionContext); + } + + List dailyValues = new List(); + foreach (Profile subProfile in subProfiles) + { + double[] day = DayHourlyValues(subProfile, openStudioObjectName, openStudioConversionContext); + if (day == null) + { + return null; + } + + dailyValues.Add(day); + } + + int index = 0; + while (dailyValues.Count < 7) + { + dailyValues.Add(dailyValues[index]); + index++; + } + + double[] annual = new double[targetLength]; + int firstDayOfWeekOffset = openStudioConversionContext.FirstDayOfWeekOffset; + for (int dayIndex = 0; dayIndex < targetLength / 24; dayIndex++) + { + // Rotate the Monday-first week onto the run calendar: day 0 of the year maps to + // the sub-profile of its actual weekday (Monday = 0 … Sunday = 6). + double[] day = dailyValues[(dayIndex + firstDayOfWeekOffset) % 7]; + Array.Copy(day, 0, annual, dayIndex * 24, 24); + } + + return CheckedAnnualValues(profile, annual, openStudioObjectName, openStudioConversionContext); + } + + private static double[] CheckedAnnualValues(Profile profile, double[] annualValues, string openStudioObjectName, OpenStudioConversionContext openStudioConversionContext) + { + for (int i = 0; i < annualValues.Length; i++) + { + if (double.IsNaN(annualValues[i])) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ScheduleMissingProfile, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("Profile has a gap at hour {0}; missing values are never substituted", i), profile, openStudioObjectName); + return null; + } + } + + return annualValues; + } + + private static double[] DayHourlyValues(Profile profile, string openStudioObjectName, OpenStudioConversionContext openStudioConversionContext) + { + double[] profileValues = ProfileValues(profile); + if (profileValues.Length == 0) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ScheduleMissingProfile, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "Profile has no values", profile, openStudioObjectName); + return null; + } + + // One day-type sub-profile expanded to 24 hourly values through the SAM indexer + // (cyclic within the sub-profile's own index span — SAM GetDailyValues semantics). + double[] result = new double[24]; + for (int i = 0; i < result.Length; i++) + { + result[i] = profile[i]; + } + + return result; + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/ShadingSurfaces.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/ShadingSurfaces.cs new file mode 100644 index 0000000..8d3475f --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/ShadingSurfaces.cs @@ -0,0 +1,110 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Collections.Generic; +using SAM.Geometry.OpenStudio; +using SAM.Geometry.Spatial; + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Convert + { + /// + /// Converts SAM shading panels (PanelType.Shade from AdjacencyCluster.GetShadingPanels) + /// to OpenStudio ShadingSurfaces in a single building-level ShadingSurfaceGroup — + /// mirroring the SAM_LadybugTools orphan-shade handling. Invalid shade geometry is + /// skipped with a diagnostic. + /// + /// Conversion context with a non-null source model. + /// Created shading surfaces (possibly empty, never null). + public static List ToOpenStudio_ShadingSurfaces(this OpenStudioConversionContext openStudioConversionContext) + { + List result = new List(); + + AdjacencyCluster adjacencyCluster = openStudioConversionContext?.Source?.AdjacencyCluster; + if (adjacencyCluster == null) + { + return result; + } + + List panels = adjacencyCluster.GetShadingPanels(); + if (panels == null || panels.Count == 0) + { + return result; + } + + global::OpenStudio.ShadingSurfaceGroup shadingSurfaceGroup = null; + + foreach (Panel panel in panels) + { + if (panel == null || panel.PanelType != PanelType.Shade) + { + continue; + } + + string name = Core.OpenStudio.Query.OpenStudioName("ShadingSurface", panel.Name, panel.Guid); + + Face3D face3D = panel.GetFace3D(); + ISegmentable3D segmentable3D = face3D?.GetExternalEdge3D() as ISegmentable3D; + List point3Ds = segmentable3D?.GetPoints(); + + List diagnostics = Geometry.OpenStudio.Query.ValidatePolygon(point3Ds, openStudioConversionContext.Options.DistanceTolerance, openStudioConversionContext.Options.AngleTolerance, openStudioConversionContext.Options.MinimumArea); + bool valid = true; + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in diagnostics) + { + openStudioConversionContext.AddDiagnostic(diagnostic.Code, diagnostic.Severity, diagnostic.Message, panel, name); + if (diagnostic.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error) + { + valid = false; + } + } + + if (!valid) + { + continue; + } + + // EnergyPlus applies its own 0.01 m vertex-proximity rule on top of our + // cleaning: a sliver shade collapses below three sides and is reported as a + // severe "degenerate surface". Reject it here instead — EnergyPlus never + // sees it. + List shadingPoint3Ds = Geometry.OpenStudio.Query.CleanVertices(point3Ds, openStudioConversionContext.Options.DistanceTolerance, openStudioConversionContext.Options.AngleTolerance); + int energyPlusSides = Geometry.OpenStudio.Query.EnergyPlusSideCount(shadingPoint3Ds); + if (energyPlusSides < 3) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.GeometryInvalidBoundary, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Shading panel would be degenerate in EnergyPlus: its vertices collapse to {0} side(s) under the 0.01 m proximity rule (sliver geometry); skipped — repair the source panel", energyPlusSides), panel, name); + openStudioConversionContext.RegisterSkip(); + continue; + } + + global::OpenStudio.Point3dVector point3dVector = face3D.ToOpenStudio(openStudioConversionContext.Options.DistanceTolerance, openStudioConversionContext.Options.AngleTolerance); + if (point3dVector == null || point3dVector.Count < 3) + { + continue; + } + + if (shadingSurfaceGroup == null) + { + shadingSurfaceGroup = new global::OpenStudio.ShadingSurfaceGroup(openStudioConversionContext.Target); + shadingSurfaceGroup.setName("SAM_ShadingSurfaceGroup_Building"); + shadingSurfaceGroup.setShadingSurfaceType("Building"); + } + + global::OpenStudio.ShadingSurface shadingSurface = new global::OpenStudio.ShadingSurface(point3dVector, openStudioConversionContext.Target); + shadingSurface.setName(name); + shadingSurface.setShadingSurfaceGroup(shadingSurfaceGroup); + + EmitNonConvexCastingDiagnostic(panel, name, openStudioConversionContext); + + if (!openStudioConversionContext.References.Contains(panel.Guid)) + { + openStudioConversionContext.RegisterModelObject(panel, shadingSurface); + } + + result.Add(shadingSurface); + } + + return result; + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/SimulationSettings.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/SimulationSettings.cs new file mode 100644 index 0000000..61956b3 --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/SimulationSettings.cs @@ -0,0 +1,163 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Convert + { + private static readonly string[] DayOfWeekNames = new string[] { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" }; + + /// + /// Applies the simulation settings (C4): building North Axis (explicit option → SAM + /// AnalyticalModelParameter.NorthAngle [radians → degrees, the TAS/EnergyPlus + /// clockwise-from-north convention] → OpenStudio default), explicit RunPeriod, timestep, + /// optional solar distribution and shadow-calculation frequency, YearDescription (first + /// day of week from the run calendar, calendar year, leap year), daylight saving time + /// (default OFF per the energy-model convention — SAM carries no DST data), sizing + /// control (enabled when design days were imported unless overridden) and the requested + /// output variables at the optioned reporting frequency. + /// + /// Conversion context (weather and design days already applied). + public static void ToOpenStudio_SimulationSettings(this OpenStudioConversionContext openStudioConversionContext) + { + if (openStudioConversionContext == null) + { + return; + } + + global::OpenStudio.Model model = openStudioConversionContext.Target; + Core.OpenStudio.OpenStudioConversionOptions options = openStudioConversionContext.Options; + + // North axis: degrees clockwise from true North (SAM stores radians — same + // convention as TAS northAngle, see SAM_Tas ToT3D/ToTBD Building.cs). + double northAngleDegrees = double.NaN; + if (options.NorthAngleDegrees.HasValue) + { + northAngleDegrees = options.NorthAngleDegrees.Value; + } + else if (openStudioConversionContext.Source != null && openStudioConversionContext.Source.TryGetValue(AnalyticalModelParameter.NorthAngle, out double northAngleRadians) && !double.IsNaN(northAngleRadians)) + { + northAngleDegrees = northAngleRadians * 180.0 / Math.PI; + } + + if (!double.IsNaN(northAngleDegrees)) + { + model.getBuilding().setNorthAxis(northAngleDegrees); + } + + if (options.ShadowCalculationFrequencyDays.HasValue) + { + model.getShadowCalculation().setShadingCalculationUpdateFrequency(options.ShadowCalculationFrequencyDays.Value); + } + + // PixelCounting by default (see OpenStudioConversionOptions.ShadingCalculationMethod): + // PolygonClipping flags every non-convex casting surface as a severe + // DetermineShadowingCombinations error; PixelCounting has no concavity limitation. + if (!string.IsNullOrWhiteSpace(options.ShadingCalculationMethod) && !model.getShadowCalculation().setShadingCalculationMethod(options.ShadingCalculationMethod)) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.SimulationSettingsUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("OpenStudio rejected Shading Calculation Method '{0}'; valid values are PolygonClipping and PixelCounting", options.ShadingCalculationMethod)); + } + + global::OpenStudio.RunPeriod runPeriod = model.getRunPeriod(); + runPeriod.setName("SAM_RunPeriod"); + runPeriod.setBeginMonth(options.RunPeriodBeginMonth ?? 1); + runPeriod.setBeginDayOfMonth(options.RunPeriodBeginDay ?? 1); + runPeriod.setEndMonth(options.RunPeriodEndMonth ?? 12); + runPeriod.setEndDayOfMonth(options.RunPeriodEndDay ?? 31); + + // YearDescription is a unique model object flattened onto Model in the C# wrapper. + int firstDayOfWeekOffset = openStudioConversionContext.FirstDayOfWeekOffset; + if (firstDayOfWeekOffset < 0 || firstDayOfWeekOffset > 6) + { + firstDayOfWeekOffset = 0; + } + + model.setDayofWeekforStartDay(DayOfWeekNames[firstDayOfWeekOffset]); + if (options.CalendarYear.HasValue) + { + model.setCalendarYear(options.CalendarYear.Value); + } + + if (options.IsLeapYear.HasValue) + { + model.setIsLeapYear(options.IsLeapYear.Value); + } + + if (options.DaylightSavingsTime) + { + // Ensure the object exists (EnergyPlus default dates: 2nd Sunday March → + // 1st Sunday November). + model.getRunPeriodControlDaylightSavingTime(); + } + else + { + global::OpenStudio.OptionalRunPeriodControlDaylightSavingTime optionalDaylightSavingTime = model.getOptionalRunPeriodControlDaylightSavingTime(); + if (optionalDaylightSavingTime != null && !optionalDaylightSavingTime.isNull()) + { + optionalDaylightSavingTime.get().remove(); + } + } + + model.getTimestep().setNumberOfTimestepsPerHour(options.TimestepsPerHour ?? 6); + + bool runSizingPeriods = options.RunSizingPeriods ?? openStudioConversionContext.DesignDaysImported; + global::OpenStudio.SimulationControl simulationControl = model.getSimulationControl(); + simulationControl.setRunSimulationforWeatherFileRunPeriods(true); + simulationControl.setRunSimulationforSizingPeriods(runSizingPeriods); + simulationControl.setDoZoneSizingCalculation(runSizingPeriods); + simulationControl.setDoSystemSizingCalculation(false); + simulationControl.setDoPlantSizingCalculation(false); + + if (!string.IsNullOrWhiteSpace(options.SolarDistribution)) + { + // OpenStudio exposes the EnergyPlus Building Solar Distribution through + // SimulationControl (forward-translated to the Building object). + simulationControl.setSolarDistribution(options.SolarDistribution); + } + + string reportingFrequency = string.IsNullOrWhiteSpace(options.OutputVariableFrequency) ? "Hourly" : options.OutputVariableFrequency; + + // Review P2-02 (mitigation): the result extractor converts per-row energies with a + // fixed 3600 s interval and assumes 8760/8784 hour indices — under a non-hourly + // frequency the peaks, peak hours and series are mis-scaled (annual sums stay + // correct: energy sums are frequency-independent). Frequency-aware extraction is + // follow-up work; until then the conversion says so out loud. + if (!string.Equals(reportingFrequency, "Hourly", System.StringComparison.OrdinalIgnoreCase)) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ResultExtractionLimitation, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Output-variable frequency '{0}' is not Hourly: extracted peak loads, peak hours and hourly series assume hourly reporting and will be mis-scaled; annual sums remain correct", reportingFrequency)); + } + + string[] variableNames = new string[] + { + "Zone Ideal Loads Supply Air Total Heating Energy", + "Zone Ideal Loads Supply Air Total Cooling Energy", + "Zone Ideal Loads Supply Air Sensible Heating Energy", + "Zone Ideal Loads Supply Air Sensible Cooling Energy", + "Zone Ideal Loads Outdoor Air Sensible Heating Energy", + "Zone Ideal Loads Outdoor Air Sensible Cooling Energy", + "Zone Mean Air Temperature", + "Zone Operative Temperature", + "Zone Air Relative Humidity", + "Zone Heating Setpoint Not Met Time", + "Zone Cooling Setpoint Not Met Time", + "Zone Heating Setpoint Not Met While Occupied Time", + "Zone Cooling Setpoint Not Met While Occupied Time", + "Zone People Total Heating Energy", + "Zone Lights Total Heating Energy", + "Zone Electric Equipment Total Heating Energy", + "Enclosure Windows Total Transmitted Solar Radiation Energy", + "Zone Infiltration Sensible Heat Gain Energy", + "Zone Infiltration Sensible Heat Loss Energy", + }; + + foreach (string variableName in variableNames) + { + global::OpenStudio.OutputVariable outputVariable = new global::OpenStudio.OutputVariable(variableName, model); + outputVariable.setKeyValue("*"); + outputVariable.setReportingFrequency(reportingFrequency); + } + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Space.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Space.cs new file mode 100644 index 0000000..129f8e1 --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Space.cs @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Convert + { + /// + /// Converts a SAM Space to an OpenStudio Space with its own ThermalZone (one zone per SAM + /// space, plan §5). The space is registered in the context; a space already converted is + /// returned from the cache instead of being duplicated. + /// + /// SAM space. + /// Conversion context. + /// The OpenStudio space, or null. + public static global::OpenStudio.Space ToOpenStudio(this Space space, OpenStudioConversionContext openStudioConversionContext) + { + if (space == null || openStudioConversionContext == null) + { + return null; + } + + if (openStudioConversionContext.TryGetModelObject(space.Guid, out global::OpenStudio.Space existing)) + { + return existing; + } + + global::OpenStudio.Space result = new global::OpenStudio.Space(openStudioConversionContext.Target); + result.setName(Core.OpenStudio.Query.OpenStudioName(space)); + + global::OpenStudio.ThermalZone thermalZone = new global::OpenStudio.ThermalZone(openStudioConversionContext.Target); + thermalZone.setName(Core.OpenStudio.Query.OpenStudioName("ThermalZone", space.Name, space.Guid)); + result.setThermalZone(thermalZone); + + openStudioConversionContext.RegisterModelObject(space, result); + return result; + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Thermostat.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Thermostat.cs new file mode 100644 index 0000000..6c8a7dd --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Thermostat.cs @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Convert + { + /// + /// Creates a dual-setpoint thermostat for a conditioned space's thermal zone from the + /// InternalCondition's Heating and Cooling profiles. Single-mode zones are supported: + /// with only one setpoint profile, only that schedule is set (forward-translation turns + /// the object into EnergyPlus SingleHeating/SingleCooling control — no invented extreme + /// setpoints). A conditioned zone missing BOTH setpoint profiles raises SAM-OS-HVAC-001 + /// (error). Heating exceeding cooling at any hour (dual mode only) raises + /// SAM-OS-HVAC-001 (error) — there is no override. + /// + /// Conditioned SAM space. + /// The zone created for the space. + /// Conversion context. + /// The thermostat, or null (diagnostic raised). + public static global::OpenStudio.ThermostatSetpointDualSetpoint ToOpenStudio_Thermostat(this Space space, global::OpenStudio.ThermalZone thermalZone, OpenStudioConversionContext openStudioConversionContext) + { + if (space == null || thermalZone == null || openStudioConversionContext == null) + { + return null; + } + + string name = Core.OpenStudio.Query.OpenStudioName("Thermostat", space.Name, space.Guid); + + InternalCondition internalCondition = space.InternalCondition; + ProfileLibrary profileLibrary = openStudioConversionContext.Source?.ProfileLibrary; + + Profile heatingProfile = internalCondition == null || profileLibrary == null ? null : internalCondition.GetProfile(ProfileType.Heating, profileLibrary); + Profile coolingProfile = internalCondition == null || profileLibrary == null ? null : internalCondition.GetProfile(ProfileType.Cooling, profileLibrary); + + if (heatingProfile == null && coolingProfile == null) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.HvacMissingSetpoints, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "Conditioned space is missing heating and cooling setpoint profiles; no thermostat was created", space, name); + return null; + } + + double[] heatingValues = heatingProfile == null ? null : AnnualHourlyValues(heatingProfile, name, openStudioConversionContext); + double[] coolingValues = coolingProfile == null ? null : AnnualHourlyValues(coolingProfile, name, openStudioConversionContext); + if (heatingValues != null && coolingValues != null) + { + for (int i = 0; i < heatingValues.Length && i < coolingValues.Length; i++) + { + if (heatingValues[i] > coolingValues[i]) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.HvacMissingSetpoints, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("Heating setpoint {0} °C exceeds cooling setpoint {1} °C at hour {2}; no thermostat was created", heatingValues[i], coolingValues[i], i), space, name); + return null; + } + } + } + + global::OpenStudio.Schedule heatingSchedule = heatingProfile?.ToOpenStudio(ProfileType.Heating, openStudioConversionContext); + global::OpenStudio.Schedule coolingSchedule = coolingProfile?.ToOpenStudio(ProfileType.Cooling, openStudioConversionContext); + if ((heatingProfile != null && heatingSchedule == null) || (coolingProfile != null && coolingSchedule == null)) + { + return null; + } + + global::OpenStudio.ThermostatSetpointDualSetpoint result = new global::OpenStudio.ThermostatSetpointDualSetpoint(openStudioConversionContext.Target); + result.setName(name); + if (heatingSchedule != null) + { + result.setHeatingSetpointTemperatureSchedule(heatingSchedule); + } + + if (coolingSchedule != null) + { + result.setCoolingSetpointTemperatureSchedule(coolingSchedule); + } + + thermalZone.setThermostatSetpointDualSetpoint(result); + return result; + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Weather.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Weather.cs new file mode 100644 index 0000000..26cbc9b --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Weather.cs @@ -0,0 +1,274 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Collections.Generic; +using System.IO; + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Convert + { + /// + /// Validates the EPW file, assigns it as the model's weather file and populates the Site + /// (latitude, longitude, time zone, elevation). The EPW is an explicit input. + /// Precedence (never silently overridden): the SAM model Location overrides the EPW + /// site coordinates with an information diagnostic; ground temperatures come from the + /// SAM model WeatherData (nearest-to-surface set) when present, otherwise the EPW + /// header (imported by OpenStudio itself), otherwise the EnergyPlus 18 °C default is + /// named in a warning. Failures raise SAM-OS-RUN-001 errors. + /// + /// Conversion context. + /// Path to the EPW weather file. + /// True when the weather file was assigned. + public static bool ToOpenStudio_Weather(this OpenStudioConversionContext openStudioConversionContext, string epwPath) + { + return ToOpenStudio_Weather(openStudioConversionContext, epwPath, true, false); + } + + /// + /// Assigns the resolved annual weather source. Source precedence (documented contract): + /// an explicit EPW wins over the AnalyticalModel WeatherData; when no EPW source exists + /// the embedded WeatherData still supplies location/elevation/time zone and ground + /// temperatures. A missing source is a blocking error only when an annual run was + /// requested ( true); conversion-only stays valid with a warning. + /// + /// Conversion context. + /// Resolved EPW path (explicit or exported from the embedded WeatherData); null when no annual source exists. + /// True when an annual simulation was requested. + /// True when the EPW was exported from the embedded AnalyticalModel WeatherData. + /// True when a weather file was assigned. + public static bool ToOpenStudio_Weather(this OpenStudioConversionContext openStudioConversionContext, string epwPath, bool run, bool embeddedSource) + { + if (openStudioConversionContext == null) + { + return false; + } + + bool weatherAssigned = false; + + if (string.IsNullOrWhiteSpace(epwPath) || !File.Exists(epwPath)) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.RunCliFailed, run ? Core.OpenStudio.OpenStudioDiagnosticSeverity.Error : Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "No usable annual EPW source: supply an explicit EPW path or embed WeatherData with hourly weather years in the AnalyticalModel" + (run ? string.Empty : " (conversion-only: the OSM/OSW are saved without a weather file)")); + } + else + { + global::OpenStudio.OptionalEpwFile optionalEpwFile = global::OpenStudio.EpwFile.load(global::OpenStudio.OpenStudioUtilitiesCore.toPath(epwPath)); + if (optionalEpwFile == null || optionalEpwFile.isNull()) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.RunCliFailed, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("EPW weather file could not be parsed: {0}", epwPath)); + } + else + { + global::OpenStudio.EpwFile epwFile = optionalEpwFile.get(); + + global::OpenStudio.OptionalWeatherFile optionalWeatherFile = global::OpenStudio.WeatherFile.setWeatherFile(openStudioConversionContext.Target, epwFile); + if (optionalWeatherFile == null || optionalWeatherFile.isNull()) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.RunCliFailed, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "OpenStudio rejected the EPW weather file"); + } + else + { + weatherAssigned = true; + + global::OpenStudio.Site site = openStudioConversionContext.Target.getSite(); + site.setName("SAM_Site_" + Core.OpenStudio.Query.SanitizeName(Path.GetFileNameWithoutExtension(epwPath))); + site.setLatitude(epwFile.latitude()); + site.setLongitude(epwFile.longitude()); + site.setTimeZone(epwFile.timeZone()); + site.setElevation(epwFile.elevation()); + + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.WeatherDataIssue, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, embeddedSource ? "Annual weather source: AnalyticalModel WeatherData (exported to an EPW file)" : string.Format("Annual weather source: explicit EPW ({0})", Path.GetFileName(epwPath))); + } + } + } + + if (!weatherAssigned) + { + // Metadata fallback: the embedded WeatherData still supplies the site when no + // annual EPW exists. An explicit EPW wins over this metadata — the fallback + // never overrides an assigned weather file. + Weather.WeatherData weatherData = null; + openStudioConversionContext.Source?.TryGetValue(AnalyticalModelParameter.WeatherData, out weatherData); + + Core.Location location_WeatherData = weatherData?.Location; + if (location_WeatherData != null && IsFinite(location_WeatherData.Latitude) && location_WeatherData.Latitude >= -90 && location_WeatherData.Latitude <= 90 && IsFinite(location_WeatherData.Longitude) && location_WeatherData.Longitude >= -180 && location_WeatherData.Longitude <= 180) + { + global::OpenStudio.Site site = openStudioConversionContext.Target.getSite(); + site.setName("SAM_Site_" + Core.OpenStudio.Query.SanitizeName(weatherData.Name ?? "WeatherData")); + site.setLatitude(location_WeatherData.Latitude); + site.setLongitude(location_WeatherData.Longitude); + if (IsFinite(location_WeatherData.Elevation)) + { + site.setElevation(location_WeatherData.Elevation); + } + + string timeZone = null; + if (weatherData.TryGetValue(Weather.WeatherDataParameter.TimeZone, out timeZone) && !string.IsNullOrWhiteSpace(timeZone)) + { + double timeZoneValue = Core.Query.Double(Core.Query.UTC(timeZone)); + if (IsFinite(timeZoneValue)) + { + site.setTimeZone(timeZoneValue); + } + } + + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.WeatherDataIssue, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, string.Format("Site coordinates taken from the AnalyticalModel WeatherData (lat {0}, lon {1}); an EPW path is still required for an annual run", location_WeatherData.Latitude, location_WeatherData.Longitude)); + } + } + + // Review P2-03: the SAM Location override is validated — NaN or out-of-range + // coordinates never reach OS:Site (EnergyPlus would run them). Invalid coordinates + // keep the resolved site with a warning naming the rejected values; a non-finite + // elevation keeps the resolved elevation while valid coordinates still override. + Core.Location location = openStudioConversionContext.Source?.Location; + if (location != null) + { + bool validLatitude = IsFinite(location.Latitude) && location.Latitude >= -90 && location.Latitude <= 90; + bool validLongitude = IsFinite(location.Longitude) && location.Longitude >= -180 && location.Longitude <= 180; + + global::OpenStudio.Site site = openStudioConversionContext.Target.getSite(); + + if (validLatitude && validLongitude) + { + site.setLatitude(location.Latitude); + site.setLongitude(location.Longitude); + + bool validElevation = IsFinite(location.Elevation); + if (validElevation) + { + site.setElevation(location.Elevation); + } + + string siteSource = weatherAssigned ? "the EPW header" : "the AnalyticalModel WeatherData"; + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.RunCliFailed, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, string.Format("Site coordinates taken from the SAM model Location (lat {0}, lon {1}, elevation {2}), overriding {3}; the time zone stays with {3}", location.Latitude, location.Longitude, validElevation ? location.Elevation + " m" : string.Format("kept from {0} — SAM value {1} is not finite", siteSource, location.Elevation), siteSource)); + } + else + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.WeatherDataIssue, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("SAM model Location has invalid coordinates (lat {0} [-90..90], lon {1} [-180..180]); the weather-source site is kept", location.Latitude, location.Longitude)); + } + } + + ApplyGroundTemperatures(openStudioConversionContext, epwPath); + return weatherAssigned; + } + + private static bool IsFinite(double value) + { + return !double.IsNaN(value) && !double.IsInfinity(value); + } + + /// + /// Ground-temperature precedence: SAM model WeatherData (nearest-to-surface set) → + /// EPW GROUND TEMPERATURES header (parsed via SAM.Weather's native EPW reader — + /// OpenStudio's setWeatherFile does NOT import them) → warning naming the EnergyPlus + /// 18 °C default. STAT parsing is deferred (no parser exists in the SAM ecosystem). + /// + private static void ApplyGroundTemperatures(OpenStudioConversionContext openStudioConversionContext, string epwPath) + { + Weather.WeatherData weatherData = null; + openStudioConversionContext.Source?.TryGetValue(AnalyticalModelParameter.WeatherData, out weatherData); + + if (weatherData != null && weatherData.TryGetValue(Weather.WeatherDataParameter.GroundTemperatures, out Core.SAMCollection groundTemperatures) && groundTemperatures != null) + { + Weather.GroundTemperature nearestToSurface = null; + foreach (Weather.GroundTemperature groundTemperature in groundTemperatures) + { + if (groundTemperature?.Temperatures == null || groundTemperature.Temperatures.Length < 12) + { + continue; + } + + if (nearestToSurface == null || (double.IsNaN(nearestToSurface.Depth) && !double.IsNaN(groundTemperature.Depth)) || (!double.IsNaN(groundTemperature.Depth) && groundTemperature.Depth < nearestToSurface.Depth)) + { + nearestToSurface = groundTemperature; + } + } + + if (nearestToSurface != null) + { + SetGroundTemperatures(openStudioConversionContext.Target, nearestToSurface.Temperatures); + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.WeatherDataIssue, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, string.Format("Ground temperatures taken from the SAM model WeatherData (depth {0} m set, 12 monthly values)", nearestToSurface.Depth)); + return; + } + } + + List epwGroundTemperatures = null; + if (!string.IsNullOrWhiteSpace(epwPath) && File.Exists(epwPath)) + { + try + { + // OpenStudio's setWeatherFile does NOT import ground temperatures — parse the + // EPW header with SAM.Weather's native EPW reader. + string[] lines = File.ReadAllLines(epwPath); + int index = -1; + for (int i = 0; i < lines.Length; i++) + { + if (lines[i].IndexOf("GROUND TEMPERATURES", System.StringComparison.OrdinalIgnoreCase) >= 0) + { + index = i; + break; + } + + if (lines[i].StartsWith("DATA PERIODS", System.StringComparison.OrdinalIgnoreCase)) + { + break; + } + } + + if (index >= 0) + { + Weather.Query.TryGetGroundTemperatures(lines, index, out epwGroundTemperatures); + } + } + catch (System.Exception) + { + // header parse is best effort; the EPW itself was already validated + } + } + + Weather.GroundTemperature epwNearestToSurface = null; + if (epwGroundTemperatures != null) + { + foreach (Weather.GroundTemperature groundTemperature in epwGroundTemperatures) + { + if (groundTemperature?.Temperatures == null || groundTemperature.Temperatures.Length < 12) + { + continue; + } + + if (epwNearestToSurface == null || (double.IsNaN(epwNearestToSurface.Depth) && !double.IsNaN(groundTemperature.Depth)) || (!double.IsNaN(groundTemperature.Depth) && groundTemperature.Depth < epwNearestToSurface.Depth)) + { + epwNearestToSurface = groundTemperature; + } + } + } + + if (epwNearestToSurface != null) + { + SetGroundTemperatures(openStudioConversionContext.Target, epwNearestToSurface.Temperatures); + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.WeatherDataIssue, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, string.Format("Ground temperatures taken from the EPW GROUND TEMPERATURES header (depth {0} m set, 12 monthly values)", epwNearestToSurface.Depth)); + } + else + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.WeatherDataIssue, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "No ground temperatures in the SAM model WeatherData or the EPW header; the EnergyPlus 18 °C default ground temperature applies"); + } + } + + private static void SetGroundTemperatures(global::OpenStudio.Model model, double[] temperatures) + { + global::OpenStudio.SiteGroundTemperatureBuildingSurface siteGroundTemperature = model.getSiteGroundTemperatureBuildingSurface(); + siteGroundTemperature.setJanuaryGroundTemperature(temperatures[0]); + siteGroundTemperature.setFebruaryGroundTemperature(temperatures[1]); + siteGroundTemperature.setMarchGroundTemperature(temperatures[2]); + siteGroundTemperature.setAprilGroundTemperature(temperatures[3]); + siteGroundTemperature.setMayGroundTemperature(temperatures[4]); + siteGroundTemperature.setJuneGroundTemperature(temperatures[5]); + siteGroundTemperature.setJulyGroundTemperature(temperatures[6]); + siteGroundTemperature.setAugustGroundTemperature(temperatures[7]); + siteGroundTemperature.setSeptemberGroundTemperature(temperatures[8]); + siteGroundTemperature.setOctoberGroundTemperature(temperatures[9]); + siteGroundTemperature.setNovemberGroundTemperature(temperatures[10]); + siteGroundTemperature.setDecemberGroundTemperature(temperatures[11]); + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/AnalyticalModel.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/AnalyticalModel.cs new file mode 100644 index 0000000..66ebd57 --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/AnalyticalModel.cs @@ -0,0 +1,477 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; +using SAM.Geometry.Spatial; + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Convert + { + /// + /// Converts an OpenStudio model into a SAM . + /// + /// The model is read, never mutated, and never disposed here — the caller owns it. Use + /// the path overloads in Convert/ToSAM/Import.cs when the model should be loaded and + /// released for you. + /// + /// + /// Passes, mirroring the established SAM_LadybugTools reverse pipeline: + /// A) shared libraries (materials, constructions, schedules, internal conditions); + /// B) surfaces → panels, with the two sides of an interzone partition deduplicated into + /// one shared panel; C) spaces, each with the shell of its own converted faces; + /// D) the AdjacencyCluster and its space ↔ panel relations; E) shading; F) model + /// metadata, site and design days; G) pruning of unreferenced library entries. + /// + /// + /// Source OpenStudio model; null returns null. + /// Import options; defaults when null. + /// Import result carrying the SAM model, diagnostics and statistics; null when the model is null. + public static OpenStudioImportResult ToSAM(this global::OpenStudio.Model model, Core.OpenStudio.OpenStudioImportOptions openStudioImportOptions = null) + { + if (model == null) + { + return null; + } + + OpenStudioImportContext context = new OpenStudioImportContext(model, openStudioImportOptions); + AnalyticalModel analyticalModel = ToSAM_AnalyticalModel(context); + return new OpenStudioImportResult(context, analyticalModel); + } + + /// + /// Runs the whole import against a prepared context. Separated from + /// + /// so the path/OSW entry points can reuse one context across loading and conversion and + /// keep their diagnostics in a single stream. + /// + /// Import context; null returns null. + /// The imported SAM model; never null once a context exists. + internal static AnalyticalModel ToSAM_AnalyticalModel(OpenStudioImportContext openStudioImportContext) + { + if (openStudioImportContext == null) + { + return null; + } + + global::OpenStudio.Model model = openStudioImportContext.Source; + + // Pass A: shared libraries first — panels and spaces resolve their constructions and + // internal conditions out of these caches. + Core.MaterialLibrary materialLibrary = openStudioImportContext.ToSAM_MaterialLibrary(); + ProfileLibrary profileLibrary = openStudioImportContext.ToSAM_ProfileLibrary(); + openStudioImportContext.ToSAM_Constructions(materialLibrary); + openStudioImportContext.ToSAM_InternalConditions(profileLibrary); + + AdjacencyCluster adjacencyCluster = new AdjacencyCluster(); + + global::OpenStudio.SpaceVector spaceVector = model.getSpaces(); + int sourceSpaceCount = spaceVector?.Count ?? 0; + openStudioImportContext.Statistics.SourceObjects += sourceSpaceCount; + + if (sourceSpaceCount == 0) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ZoneIncomplete, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "The OpenStudio model contains no spaces; the imported SAM model has no geometry", (string)null); + } + + // Pass B/C: surfaces → panels (deduplicated across an interzone pair) and spaces. + // panelBySurfaceName is the deduplication ledger: both sides of a pair resolve to the + // same SAM panel, which is then related to both SAM spaces in pass D. + Dictionary panelBySurfaceName = new Dictionary(); + List>> spacePanels = new List>>(); + List unpairedInterzoneSurfaces = new List(); + + if (spaceVector != null) + { + foreach (global::OpenStudio.Space openStudioSpace in spaceVector) + { + if (openStudioSpace == null) + { + continue; + } + + global::OpenStudio.Transformation transformation = SpaceTransformation(openStudioSpace); + + List panels = new List(); + List face3Ds = new List(); + + global::OpenStudio.SurfaceVector surfaceVector = openStudioSpace.surfaces; + if (surfaceVector != null) + { + openStudioImportContext.Statistics.SourceObjects += surfaceVector.Count; + + foreach (global::OpenStudio.Surface surface in surfaceVector) + { + if (surface == null) + { + continue; + } + + Panel panel = ResolvePanel(surface, transformation, panelBySurfaceName, unpairedInterzoneSurfaces, openStudioImportContext); + if (panel == null) + { + continue; + } + + panels.Add(panel); + + // The shell must be built from THIS space's own surface geometry, not + // from the shared panel's face: a shared internal panel carries the + // winding of whichever space converted it first, and reusing it here + // would give the second space an inconsistent shell. + List faceDiagnostics; + Face3D face3D = Geometry.OpenStudio.Convert.ToSAM(surface, openStudioImportContext.Options.DistanceTolerance, openStudioImportContext.Options.AngleTolerance, openStudioImportContext.Options.MinimumArea, out faceDiagnostics, transformation); + if (face3D != null) + { + face3Ds.Add(face3D); + } + } + } + + Space space = openStudioSpace.ToSAM(face3Ds, openStudioImportContext); + if (space == null) + { + continue; + } + + openStudioImportContext.SpaceMap[openStudioSpace.nameString()] = space; + spacePanels.Add(new KeyValuePair>(space, panels)); + } + } + + // Interzone surfaces whose partner never materialised: try the geometric fallback + // once, across the whole model, then demote what is still unpaired. A pairing + // supersedes the second surface's panel with the first; those supersessions are + // recorded so the captured spacePanels lists can be remapped before topology. + Dictionary supersededPanels = new Dictionary(); + ResolveUnpairedInterzoneSurfaces(unpairedInterzoneSurfaces, panelBySurfaceName, supersededPanels, openStudioImportContext); + + // Pass D: topology. A shared internal panel is added once and related to BOTH spaces — + // that relation, not a second coincident panel, is how SAM represents one physical + // partition between two rooms. + foreach (KeyValuePair> keyValuePair in spacePanels) + { + adjacencyCluster.AddObject(keyValuePair.Key); + + // A geometric-fallback pairing replaced the second panel with the first after + // this list was captured, so resolve each panel through the supersession map + // (and dedupe) or the cluster would keep two coincident panels for one partition. + HashSet addedPanels = new HashSet(); + foreach (Panel panel in keyValuePair.Value) + { + Panel resolvedPanel = ResolveSupersededPanel(panel, supersededPanels); + if (resolvedPanel == null || !addedPanels.Add(resolvedPanel)) + { + continue; + } + + adjacencyCluster.AddObject(resolvedPanel); + adjacencyCluster.AddRelation(keyValuePair.Key, resolvedPanel); + } + } + + // Pass E: shading. Shade panels are free-standing — added to the cluster with no + // space relation, as the forward direction and SAM_LadybugTools both expect. + if (openStudioImportContext.Options.IncludeShading) + { + foreach (Panel panel in openStudioImportContext.ToSAM_ShadingPanels()) + { + adjacencyCluster.AddObject(panel); + } + } + + // Pass F: assign internal conditions now that spaces exist and zone data can be read. + if (openStudioImportContext.Options.IncludeInternalConditions) + { + openStudioImportContext.ToSAM_AssignInternalConditions(adjacencyCluster, profileLibrary); + } + + // Pass G: prune library entries nothing references, then build the model. + if (openStudioImportContext.Options.PruneUnreferencedLibraryEntries) + { + Modify.RemoveUnreferencedMaterials(materialLibrary, adjacencyCluster); + Modify.RemoveUnreferencedProfiles(profileLibrary, adjacencyCluster); + } + + return openStudioImportContext.ToSAM_AnalyticalModel(adjacencyCluster, materialLibrary, profileLibrary); + } + + /// + /// Space → building transformation. Surface vertices are stored relative to their space, + /// so this is what puts them into the shared coordinate system SAM works in. + /// + private static global::OpenStudio.Transformation SpaceTransformation(global::OpenStudio.Space space) + { + try + { + return space.buildingTransformation(); + } + catch (Exception) + { + return null; + } + } + + /// + /// Returns the SAM panel for an OpenStudio surface, creating it only once per physical + /// element. + /// + /// When the surface declares an adjacentSurface and that partner has already been + /// converted, the existing panel is returned — this is the deduplication that turns two + /// opposite OpenStudio surfaces into one SAM panel related to two spaces. OpenStudio's + /// own adjacency handles are authoritative and are always tried first; geometry is only + /// consulted later, for surfaces that claim a "Surface" boundary but carry no handle. + /// + /// + private static Panel ResolvePanel(global::OpenStudio.Surface surface, global::OpenStudio.Transformation transformation, Dictionary panelBySurfaceName, List unpairedInterzoneSurfaces, OpenStudioImportContext openStudioImportContext) + { + string surfaceName = surface.nameString(); + + Panel existing; + if (panelBySurfaceName.TryGetValue(surfaceName, out existing)) + { + return existing; + } + + global::OpenStudio.OptionalSurface optionalAdjacentSurface = null; + try + { + optionalAdjacentSurface = surface.adjacentSurface(); + } + catch (Exception) + { + // an unreadable adjacency is treated as absent and handled by the fallback + } + + bool hasAdjacentHandle = optionalAdjacentSurface != null && !optionalAdjacentSurface.isNull(); + if (hasAdjacentHandle) + { + string adjacentName = optionalAdjacentSurface.get().nameString(); + Panel adjacentPanel; + if (panelBySurfaceName.TryGetValue(adjacentName, out adjacentPanel)) + { + // Second side of an already-converted pair: reuse, do not duplicate. + panelBySurfaceName[surfaceName] = adjacentPanel; + return adjacentPanel; + } + } + + Panel panel = surface.ToSAM(openStudioImportContext, transformation); + if (panel == null) + { + return null; + } + + panelBySurfaceName[surfaceName] = panel; + + if (hasAdjacentHandle) + { + // Claim the partner now so it resolves to this panel whichever space reaches it. + panelBySurfaceName[optionalAdjacentSurface.get().nameString()] = panel; + } + else if (string.Equals(surface.outsideBoundaryCondition(), "Surface", StringComparison.OrdinalIgnoreCase)) + { + // Snapshot the managed identity NOW. The native SWIG wrapper must not be retained + // and dereferenced after the model walk: doing so aborts the process with an + // unmanaged AccessViolationException. The name is the key back into + // panelBySurfaceName; the label is all the diagnostics need. + unpairedInterzoneSurfaces.Add(new UnpairedInterzoneSurface(surfaceName, OpenStudioImportContext.OpenStudioObjectLabel(surface))); + } + + return panel; + } + + /// + /// Handles surfaces that declare an interzone ("Surface") boundary but carry no + /// OpenStudio adjacency handle. + /// + /// A validated geometric fallback pairs them: coincident centroids within the distance + /// tolerance, comparable areas, and opposed normals — all three, so two parallel surfaces + /// of a thick construction or two stacked floor slabs are not mistaken for a pair. Every + /// geometric pairing is reported (SAM-OSI-ADJ-001) because it is an inference, not data + /// read from the model. + /// + /// + /// What still cannot be paired is reported (SAM-OSI-ADJ-002) and marked adiabatic — the + /// only defensible reading of "internal surface with nothing on the other side", and + /// exactly what the forward direction does with the mirror-image case. + /// + /// + private static void ResolveUnpairedInterzoneSurfaces(List surfaces, Dictionary panelBySurfaceName, Dictionary supersededPanels, OpenStudioImportContext openStudioImportContext) + { + if (surfaces == null || surfaces.Count == 0) + { + return; + } + + double distanceTolerance = openStudioImportContext.Options.DistanceTolerance; + HashSet paired = new HashSet(); + + if (openStudioImportContext.Options.AllowGeometricAdjacencyFallback) + { + for (int i = 0; i < surfaces.Count; i++) + { + string nameI = surfaces[i].Name; + if (paired.Contains(nameI)) + { + continue; + } + + Panel panelI; + if (!panelBySurfaceName.TryGetValue(nameI, out panelI) || panelI == null) + { + continue; + } + + for (int j = i + 1; j < surfaces.Count; j++) + { + string nameJ = surfaces[j].Name; + if (paired.Contains(nameJ)) + { + continue; + } + + Panel panelJ; + if (!panelBySurfaceName.TryGetValue(nameJ, out panelJ) || panelJ == null || ReferenceEquals(panelI, panelJ)) + { + continue; + } + + if (!AreCoincidentOpposites(panelI, panelJ, distanceTolerance)) + { + continue; + } + + // Both surfaces now resolve to the first panel; the second panel is + // superseded. Record the supersession so the topology pass can rewrite + // the already-captured space→panel list, and repoint the name ledger too. + panelBySurfaceName[nameJ] = panelI; + supersededPanels[panelJ] = panelI; + paired.Add(nameI); + paired.Add(nameJ); + + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.AdjacencyGeometricFallback, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Surfaces '{0}' and '{1}' declare an interzone boundary but carry no OpenStudio adjacency handle; they were paired into one SAM panel by validated geometric matching (coincident centroids, comparable areas, opposed normals) - verify the source model's adjacency", nameI, nameJ), surfaces[i].Label, panelI); + break; + } + } + } + + foreach (UnpairedInterzoneSurface surface in surfaces) + { + string name = surface.Name; + if (paired.Contains(name)) + { + continue; + } + + Panel panel; + if (!panelBySurfaceName.TryGetValue(name, out panel) || panel == null) + { + continue; + } + + panel.SetValue(PanelParameter.Adiabatic, true); + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.AdjacencyPairingFailed, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Surface '{0}' declares an interzone boundary but no partner could be resolved{1}; the SAM panel was marked adiabatic", name, openStudioImportContext.Options.AllowGeometricAdjacencyFallback ? " (neither by handle nor by geometric matching)" : " (by handle; geometric matching is disabled)"), surface.Label, panel); + } + } + + /// + /// Follows the supersession map so a captured panel reference resolves to the panel that + /// replaced it during the geometric-adjacency fallback. The map is a flat old→new lookup, + /// but the walk is bounded so a pathological cycle can never loop forever. + /// + private static Panel ResolveSupersededPanel(Panel panel, Dictionary supersededPanels) + { + Panel current = panel; + int guard = supersededPanels.Count + 1; + Panel next; + while (current != null && guard-- > 0 && supersededPanels.TryGetValue(current, out next)) + { + current = next; + } + + return current; + } + + /// + /// Managed snapshot of an interzone surface that carried no OpenStudio adjacency handle: + /// its name — the key back into the panel-by-surface-name ledger — and its diagnostic + /// label. Captured during the model walk so the native SWIG Surface wrapper is + /// never retained and dereferenced afterwards, which can abort the process with an + /// unmanaged access violation. + /// + private struct UnpairedInterzoneSurface + { + public UnpairedInterzoneSurface(string name, string label) + { + Name = name; + Label = label; + } + + /// OpenStudio surface name; the key into panelBySurfaceName. + public string Name { get; } + + /// "<name> [<handle>]" diagnostic label captured at traversal time. + public string Label { get; } + } + + /// + /// True when two panels look like the two faces of one physical partition: their internal + /// points coincide within tolerance, their areas agree to within 1 %, and their normals + /// oppose. All three conditions are required — centroid coincidence alone would also + /// match two surfaces of a thick wall or a floor/ceiling stack. + /// + private static bool AreCoincidentOpposites(Panel panel_1, Panel panel_2, double distanceTolerance) + { + try + { + Face3D face3D_1 = panel_1.GetFace3D(); + Face3D face3D_2 = panel_2.GetFace3D(); + if (face3D_1 == null || face3D_2 == null) + { + return false; + } + + Point3D point3D_1 = face3D_1.GetInternalPoint3D(distanceTolerance); + Point3D point3D_2 = face3D_2.GetInternalPoint3D(distanceTolerance); + if (point3D_1 == null || point3D_2 == null) + { + return false; + } + + // MacroDistance, not the raw distance tolerance: two modelled faces of the same + // partition are authored to the same plane but rarely to 1e-6 m. + if (point3D_1.Distance(point3D_2) > Core.Tolerance.MacroDistance) + { + return false; + } + + double area_1 = face3D_1.GetArea(); + double area_2 = face3D_2.GetArea(); + if (double.IsNaN(area_1) || double.IsNaN(area_2) || area_1 <= 0 || area_2 <= 0) + { + return false; + } + + if (Math.Abs(area_1 - area_2) / Math.Max(area_1, area_2) > 0.01) + { + return false; + } + + Vector3D normal_1 = panel_1.Normal; + Vector3D normal_2 = panel_2.Normal; + if (normal_1 == null || normal_2 == null) + { + return false; + } + + return normal_1.Unit.DotProduct(normal_2.Unit) < -0.99; + } + catch (Exception) + { + return false; + } + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/Aperture.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/Aperture.cs new file mode 100644 index 0000000..8a79160 --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/Aperture.cs @@ -0,0 +1,228 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Convert + { + /// + /// Converts the subsurfaces of an OpenStudio Surface into SAM apertures and attaches them + /// to the host panel. + /// + /// Attachment goes through with + /// the import tolerances, so SAM validates containment: a subsurface that OpenStudio + /// accepted but that does not actually sit inside its host boundary (a stale window after + /// a measure resized a wall, for example) is reported rather than silently attached to a + /// panel it does not fit. + /// + /// + /// OpenStudio host surface. + /// SAM panel created for it. + /// SAM panel type of the host, used to type the aperture construction. + /// Import context. + /// Space → model transformation applied to the vertices. + /// The apertures successfully attached. + public static List ToSAM_Apertures(this global::OpenStudio.Surface surface, Panel panel, PanelType panelType, OpenStudioImportContext openStudioImportContext, global::OpenStudio.Transformation transformation = null) + { + List result = new List(); + + if (surface == null || panel == null || openStudioImportContext == null) + { + return result; + } + + global::OpenStudio.SubSurfaceVector subSurfaceVector; + try + { + subSurfaceVector = surface.subSurfaces(); + } + catch (Exception) + { + return result; + } + + if (subSurfaceVector == null) + { + return result; + } + + foreach (global::OpenStudio.SubSurface subSurface in subSurfaceVector) + { + Aperture aperture = subSurface.ToSAM(panelType, openStudioImportContext, transformation); + if (aperture == null) + { + continue; + } + + if (!panel.AddAperture(aperture, openStudioImportContext.Options.AngleTolerance, openStudioImportContext.Options.DistanceTolerance)) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.GeometryInvalid, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "The subsurface is not contained by its host surface boundary within tolerance; it was not attached to the SAM panel", OpenStudioImportContext.OpenStudioObjectLabel(subSurface), panel); + openStudioImportContext.RegisterSkip(); + continue; + } + + result.Add(aperture); + openStudioImportContext.RegisterCreated(); + } + + return result; + } + + /// + /// Converts one OpenStudio SubSurface into a SAM Aperture. Unsupported subsurface types + /// are reported (SAM-OSI-SUB-001) and skipped — never silently dropped. + /// + /// OpenStudio subsurface; null returns null. + /// SAM panel type of the host surface. + /// Import context. + /// Space → model transformation applied to the vertices. + /// The created aperture, or null. + public static Aperture ToSAM(this global::OpenStudio.SubSurface subSurface, PanelType panelType, OpenStudioImportContext openStudioImportContext, global::OpenStudio.Transformation transformation = null) + { + if (subSurface == null || openStudioImportContext == null) + { + return null; + } + + string label = OpenStudioImportContext.OpenStudioObjectLabel(subSurface); + string subSurfaceType = subSurface.subSurfaceType(); + + bool approximated; + ApertureType apertureType = Query.SAMApertureType(subSurfaceType, out approximated); + if (apertureType == ApertureType.Undefined) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.SubSurfaceUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Subsurface type '{0}' has no SAM equivalent; the subsurface was not imported", subSurfaceType), label); + openStudioImportContext.RegisterSkip(); + return null; + } + + if (approximated && openStudioImportContext.RegisterOnce("SAM-OSI-APX-001:SubSurfaceType:" + subSurfaceType)) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ApproximationApplied, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, string.Format("Subsurface type '{0}' was imported as a SAM {1}; SAM has no distinct representation for it (openability, tubular light path and similar behaviour are not carried)", subSurfaceType, apertureType), label); + } + + List diagnostics; + Geometry.Spatial.Face3D face3D = Geometry.OpenStudio.Convert.ToSAM(subSurface, openStudioImportContext.Options.DistanceTolerance, openStudioImportContext.Options.AngleTolerance, openStudioImportContext.Options.MinimumArea, out diagnostics, transformation); + + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in diagnostics) + { + openStudioImportContext.AddDiagnostic(diagnostic.Code, diagnostic.Severity, diagnostic.Message, label); + } + + if (face3D == null) + { + openStudioImportContext.RegisterSkip(); + return null; + } + + double multiplier = 1; + try + { + multiplier = subSurface.multiplier(); + } + catch (Exception) + { + // an unreadable multiplier is treated as 1 and never reported as a fabricated value + } + + if (multiplier > 1) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ApproximationApplied, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format(System.Globalization.CultureInfo.InvariantCulture, "Subsurface multiplier {0:G4} is not represented: SAM apertures have no multiplier, so the imported aperture carries the modelled geometry once and the total glazed area is lower than in the OpenStudio model", multiplier), label); + } + + ApertureConstruction apertureConstruction = ResolveApertureConstruction(subSurface, apertureType, panelType, openStudioImportContext); + + Aperture result; + try + { + result = new Aperture(apertureConstruction, face3D); + } + catch (Exception exception) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.GeometryInvalid, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("The SAM aperture could not be created ({0}: {1})", exception.GetType().Name, exception.Message), label); + openStudioImportContext.RegisterSkip(); + return null; + } + + Guid guid = openStudioImportContext.ResolveGuid(subSurface, typeof(Aperture).Name); + result = new Aperture(guid, result); + + Modify.SetOpenStudioSource(result, subSurface); + + return result; + } + + /// + /// Resolves the SAM aperture construction for a subsurface from the constructions already + /// imported into . + /// + /// A solid (opaque-pane) door exports as an OS:Construction with opaque layers, + /// shape-identical to a wall construction, so — absent a SAM.Type stamp — the + /// construction pass classifies it by its layers and files it in + /// as an opaque + /// . This resolver recognises that a subsurface's use of such a + /// construction makes it fenestration, and carries the real opaque layers onto a SAM + /// aperture construction as its pane layers rather than discarding them for an empty + /// placeholder. Only a construction that is genuinely absent falls back to a name-only + /// placeholder with no invented layers — see the equivalent policy in + /// Convert/ToSAM/Panel.cs. + /// + /// + private static ApertureConstruction ResolveApertureConstruction(global::OpenStudio.SubSurface subSurface, ApertureType apertureType, PanelType panelType, OpenStudioImportContext openStudioImportContext) + { + string constructionName = null; + global::OpenStudio.OptionalConstructionBase optionalConstructionBase = subSurface.construction(); + bool hasConstruction = optionalConstructionBase != null && !optionalConstructionBase.isNull(); + if (hasConstruction) + { + constructionName = optionalConstructionBase.get().nameString(); + } + + if (string.IsNullOrWhiteSpace(constructionName)) + { + constructionName = string.Format("Unassigned_{0}_{1}", panelType, apertureType); + if (openStudioImportContext.RegisterOnce("SAM-OSI-CON-001:UnassignedAperture:" + constructionName)) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ConstructionUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Subsurface has no construction; a name-only SAM aperture construction '{0}' was created with no layers (nothing was substituted)", constructionName), OpenStudioImportContext.OpenStudioObjectLabel(subSurface)); + } + } + + ApertureConstruction result; + if (openStudioImportContext.ApertureConstructionMap.TryGetValue(constructionName, out result)) + { + return result; + } + + // The construction was classified opaque and filed under ConstructionMap because its + // layers are opaque, but a subsurface uses it: it is a solid door. Carry its layers + // across instead of inventing an empty placeholder. + Construction opaqueConstruction; + if (hasConstruction + && openStudioImportContext.ConstructionMap.TryGetValue(constructionName, out opaqueConstruction) + && opaqueConstruction != null + && opaqueConstruction.ConstructionLayers != null + && opaqueConstruction.ConstructionLayers.Count > 0) + { + global::OpenStudio.ConstructionBase constructionBase = optionalConstructionBase.get(); + Guid guid = openStudioImportContext.ResolveGuid(constructionBase, typeof(ApertureConstruction).Name); + result = new ApertureConstruction(guid, constructionName, apertureType, new List(opaqueConstruction.ConstructionLayers), null); + Modify.SetOpenStudioSource(result, constructionBase); + openStudioImportContext.ApertureConstructionMap[constructionName] = result; + + if (openStudioImportContext.RegisterOnce("SAM-OSI-APX-001:OpaqueApertureConstruction:" + constructionName)) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ApproximationApplied, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, string.Format("Construction '{0}' has opaque (non-glazing) layers but is used by a subsurface - a solid door or panel; its layers were carried onto a SAM aperture construction as pane layers (nothing was substituted)", constructionName), OpenStudioImportContext.OpenStudioObjectLabel(subSurface)); + } + + return result; + } + + result = new ApertureConstruction(constructionName, apertureType); + openStudioImportContext.ApertureConstructionMap[constructionName] = result; + return result; + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/AssignInternalConditions.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/AssignInternalConditions.cs new file mode 100644 index 0000000..0d3eed0 --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/AssignInternalConditions.cs @@ -0,0 +1,249 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Convert + { + /// + /// Assigns an to every imported SAM space and adds the + /// zone-level controls — heating/cooling setpoints, humidistat setpoints and the + /// conditioning state — that only become available once spaces and zones are paired. + /// + /// Setpoints live on the ThermalZone, not the SpaceType, so the shared space-type + /// condition is cloned per space before any zone data is written; otherwise one zone's + /// thermostat would leak into every space of that type. + /// + /// + /// SAM stores setpoints as profiles whose values are the temperatures themselves, so a + /// dual-setpoint thermostat maps across without approximation — including setback + /// schedules, which survive as the profile's hourly variation. + /// + /// + /// Import context. + /// Topology whose spaces receive the conditions. + /// Library receiving the setpoint profiles created here. + public static void ToSAM_AssignInternalConditions(this OpenStudioImportContext openStudioImportContext, AdjacencyCluster adjacencyCluster, ProfileLibrary profileLibrary) + { + if (openStudioImportContext == null || adjacencyCluster == null) + { + return; + } + + global::OpenStudio.SpaceVector spaceVector; + try + { + spaceVector = openStudioImportContext.Source.getSpaces(); + } + catch (Exception) + { + return; + } + + if (spaceVector == null) + { + return; + } + + foreach (global::OpenStudio.Space openStudioSpace in spaceVector) + { + if (openStudioSpace == null) + { + continue; + } + + Space space; + if (!openStudioImportContext.SpaceMap.TryGetValue(openStudioSpace.nameString(), out space) || space == null) + { + continue; + } + + InternalCondition internalCondition = ResolveInternalCondition(openStudioSpace, openStudioImportContext); + if (internalCondition == null) + { + continue; + } + + // Clone before writing zone data: the space-type condition is shared, and zone + // setpoints are per zone. + internalCondition = new InternalCondition(Guid.NewGuid(), internalCondition); + + ApplyZoneControls(openStudioSpace, internalCondition, openStudioImportContext, profileLibrary); + + space.InternalCondition = internalCondition; + + // Space.InternalCondition clones again with a new Guid, so the cluster copy must + // be refreshed for the assignment to be visible on the imported topology. + adjacencyCluster.AddObject(space); + } + } + + /// + /// The SAM internal condition for a space: its space type's condition when it has one, + /// otherwise a bare condition named after the space so the zone controls have somewhere + /// to live. A space with no space type but with its own loads is reported — those loads + /// are not imported, because SAM carries loads on the internal condition only. + /// + private static InternalCondition ResolveInternalCondition(global::OpenStudio.Space openStudioSpace, OpenStudioImportContext openStudioImportContext) + { + global::OpenStudio.OptionalSpaceType optionalSpaceType = openStudioSpace.spaceType; + if (optionalSpaceType != null && !optionalSpaceType.isNull()) + { + string spaceTypeName = optionalSpaceType.get().nameString(); + + InternalCondition internalCondition; + if (openStudioImportContext.InternalConditionMap.TryGetValue(spaceTypeName, out internalCondition)) + { + ReportSpaceLevelOverrides(openStudioSpace, openStudioImportContext, spaceTypeName); + return internalCondition; + } + } + + ReportSpaceLevelOverrides(openStudioSpace, openStudioImportContext, null); + + return new InternalCondition(openStudioSpace.nameString()); + } + + /// + /// Reports loads defined directly on a space rather than on its space type. SAM has no + /// per-space load layer on top of an internal condition, so these are not imported; + /// saying so is the difference between an incomplete model and a wrong one. + /// + private static void ReportSpaceLevelOverrides(global::OpenStudio.Space openStudioSpace, OpenStudioImportContext openStudioImportContext, string spaceTypeName) + { + int count = 0; + count += openStudioSpace.people()?.Count ?? 0; + count += openStudioSpace.lights()?.Count ?? 0; + count += openStudioSpace.electricEquipment()?.Count ?? 0; + count += openStudioSpace.spaceInfiltrationDesignFlowRates()?.Count ?? 0; + + if (count == 0) + { + return; + } + + string label = OpenStudioImportContext.OpenStudioObjectLabel(openStudioSpace); + + if (spaceTypeName == null) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.LoadUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("The space carries {0} load(s) directly and belongs to no space type; SAM holds loads on the internal condition only, so these loads were not imported", count), label); + } + else + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.LoadAssignmentConflict, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("The space carries {0} load(s) directly, in addition to those of space type '{1}'; SAM has no per-space load layer, so only the space type's loads were imported and the space-level ones are missing", count, spaceTypeName), label); + } + + openStudioImportContext.RegisterSkip(); + } + + /// + /// Writes the zone's thermostat and humidistat setpoints onto the space's internal + /// condition and reports detailed HVAC that is deliberately not imported. + /// + private static void ApplyZoneControls(global::OpenStudio.Space openStudioSpace, InternalCondition internalCondition, OpenStudioImportContext openStudioImportContext, ProfileLibrary profileLibrary) + { + global::OpenStudio.OptionalThermalZone optionalThermalZone = openStudioSpace.thermalZone(); + if (optionalThermalZone == null || optionalThermalZone.isNull()) + { + return; + } + + global::OpenStudio.ThermalZone thermalZone = optionalThermalZone.get(); + string label = OpenStudioImportContext.OpenStudioObjectLabel(thermalZone); + + global::OpenStudio.OptionalThermostatSetpointDualSetpoint optionalThermostat = thermalZone.thermostatSetpointDualSetpoint(); + if (optionalThermostat != null && !optionalThermostat.isNull()) + { + global::OpenStudio.ThermostatSetpointDualSetpoint thermostat = optionalThermostat.get(); + AssignProfile(internalCondition, InternalConditionParameter.HeatingProfileName, thermostat.heatingSetpointTemperatureSchedule(), ProfileType.Heating, openStudioImportContext, profileLibrary); + AssignProfile(internalCondition, InternalConditionParameter.CoolingProfileName, thermostat.coolingSetpointTemperatureSchedule(), ProfileType.Cooling, openStudioImportContext, profileLibrary); + } + + global::OpenStudio.OptionalZoneControlHumidistat optionalHumidistat = thermalZone.zoneControlHumidistat(); + if (optionalHumidistat != null && !optionalHumidistat.isNull()) + { + global::OpenStudio.ZoneControlHumidistat humidistat = optionalHumidistat.get(); + AssignProfile(internalCondition, InternalConditionParameter.HumidificationProfileName, humidistat.humidifyingRelativeHumiditySetpointSchedule(), ProfileType.Humidification, openStudioImportContext, profileLibrary); + AssignProfile(internalCondition, InternalConditionParameter.DehumidificationProfileName, humidistat.dehumidifyingRelativeHumiditySetpointSchedule(), ProfileType.Dehumidification, openStudioImportContext, profileLibrary); + } + + ReportZoneHvac(thermalZone, openStudioImportContext, label); + } + + /// + /// Reports the zone's HVAC. Ideal Loads is recognised as "conditioned" and needs no + /// further translation, because SAM's own conversion targets Ideal Loads too. Air loops + /// and zone equipment are named and explicitly declared not imported — the first release + /// must never leave the impression that detailed HVAC came across. + /// + private static void ReportZoneHvac(global::OpenStudio.ThermalZone thermalZone, OpenStudioImportContext openStudioImportContext, string label) + { + bool idealAirLoads = false; + try + { + idealAirLoads = thermalZone.useIdealAirLoads(); + } + catch (Exception) + { + // an unreadable flag is treated as absent and covered by the equipment report + } + + if (idealAirLoads) + { + return; + } + + List equipmentTypes = new List(); + + try + { + global::OpenStudio.ModelObjectVector modelObjectVector = thermalZone.equipment(); + if (modelObjectVector != null) + { + foreach (global::OpenStudio.ModelObject modelObject in modelObjectVector) + { + string typeName = IddTypeName(modelObject); + + // ZoneHVAC:IdealLoadsAirSystem is the system SAM itself exports, so its + // presence means "conditioned" rather than "unsupported HVAC". + if (typeName != null && typeName.IndexOf("IdealLoads", StringComparison.OrdinalIgnoreCase) >= 0) + { + continue; + } + + if (!equipmentTypes.Contains(typeName)) + { + equipmentTypes.Add(typeName); + } + } + } + } + catch (Exception) + { + // best effort — the report must not fail the import + } + + int airLoopCount = 0; + try + { + airLoopCount = thermalZone.airLoopHVACs()?.Count ?? 0; + } + catch (Exception) + { + // best effort + } + + if (equipmentTypes.Count == 0 && airLoopCount == 0) + { + return; + } + + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.HvacUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("The zone is served by detailed HVAC ({0}{1}{2}); this release imports zone setpoints and the conditioning state only - no air loop, plant loop or zone equipment was translated into SAM Systems", equipmentTypes.Count == 0 ? string.Empty : string.Join(", ", equipmentTypes), equipmentTypes.Count > 0 && airLoopCount > 0 ? "; " : string.Empty, airLoopCount > 0 ? string.Format("{0} air loop(s)", airLoopCount) : string.Empty), label); + openStudioImportContext.RegisterSkip(); + } + + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/Construction.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/Construction.cs new file mode 100644 index 0000000..894ccc1 --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/Construction.cs @@ -0,0 +1,232 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; +using SAM.Core; + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Convert + { + /// + /// Converts every construction in the model into SAM + /// (opaque) or + /// (fenestration) objects and caches them + /// on the context, keyed by OpenStudio construction name, so panels and apertures created + /// later resolve straight out of the cache. + /// + /// Which of the two a construction becomes is decided by its layers, not by the surfaces + /// that reference it: a construction whose layers are glazing/gas materials is a + /// fenestration construction even if nothing uses it yet. That keeps the classification + /// stable regardless of import order. + /// + /// + /// Layer order is preserved exactly as OpenStudio stores it — outside first — which is + /// the order the forward converter writes, so a construction survives a round trip + /// without being reversed. + /// + /// + /// Import context. + /// Material library the layers resolve against. + public static void ToSAM_Constructions(this OpenStudioImportContext openStudioImportContext, MaterialLibrary materialLibrary) + { + if (openStudioImportContext == null || !openStudioImportContext.Options.IncludeConstructions) + { + return; + } + + global::OpenStudio.ConstructionBaseVector constructionBaseVector; + try + { + constructionBaseVector = openStudioImportContext.Source.getConstructionBases(); + } + catch (Exception) + { + return; + } + + if (constructionBaseVector == null) + { + return; + } + + openStudioImportContext.Statistics.SourceObjects += constructionBaseVector.Count; + + foreach (global::OpenStudio.ConstructionBase constructionBase in constructionBaseVector) + { + if (constructionBase == null) + { + continue; + } + + ToSAM_Construction(constructionBase, openStudioImportContext, materialLibrary); + } + } + + /// + /// Converts one OpenStudio construction, caching the result on the context. Returns the + /// SAM object created (a , an + /// , or null when the kind is unsupported). + /// + private static object ToSAM_Construction(global::OpenStudio.ConstructionBase constructionBase, OpenStudioImportContext openStudioImportContext, MaterialLibrary materialLibrary) + { + string name = constructionBase.nameString(); + string label = OpenStudioImportContext.OpenStudioObjectLabel(constructionBase); + + Construction cachedConstruction; + if (openStudioImportContext.ConstructionMap.TryGetValue(name, out cachedConstruction)) + { + return cachedConstruction; + } + + ApertureConstruction cachedApertureConstruction; + if (openStudioImportContext.ApertureConstructionMap.TryGetValue(name, out cachedApertureConstruction)) + { + return cachedApertureConstruction; + } + + // An air boundary carries no layers at all — it becomes PanelType.Air on the panel, + // and only a named, layer-free SAM construction here. + global::OpenStudio.OptionalConstructionAirBoundary optionalConstructionAirBoundary = global::OpenStudio.OpenStudioModelResources.toConstructionAirBoundary(constructionBase); + if (optionalConstructionAirBoundary != null && !optionalConstructionAirBoundary.isNull()) + { + Construction airConstruction = new Construction(openStudioImportContext.ResolveGuid(constructionBase, typeof(Construction).Name), name); + Modify.SetOpenStudioSource(airConstruction, constructionBase); + openStudioImportContext.ConstructionMap[name] = airConstruction; + openStudioImportContext.RegisterCreated(); + return airConstruction; + } + + global::OpenStudio.OptionalConstruction optionalConstruction = global::OpenStudio.OpenStudioModelResources.toConstruction(constructionBase); + if (optionalConstruction == null || optionalConstruction.isNull()) + { + // ConstructionWithInternalSource, CFactorUndergroundWall, FFactorGroundFloor, + // ConstructionAirBoundary variants and window data files all land here: they + // describe heat transfer in ways SAM's layered model cannot express. + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ConstructionUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Construction type '{0}' is not a layered construction and has no SAM equivalent; a name-only SAM construction was created with no layers - no build-up was invented", IddTypeName(constructionBase)), label); + openStudioImportContext.RegisterSkip(); + + Construction placeholder = new Construction(openStudioImportContext.ResolveGuid(constructionBase, typeof(Construction).Name), name); + Modify.SetOpenStudioSource(placeholder, constructionBase); + openStudioImportContext.ConstructionMap[name] = placeholder; + return placeholder; + } + + global::OpenStudio.Construction construction = optionalConstruction.get(); + + List constructionLayers = new List(); + + // The stamped SAM type is authoritative when present. An aperture construction with + // opaque panes — a solid door — exports as an OS:Construction with opaque layers, + // indistinguishable from a wall construction by its materials alone. Only the + // SAM.Type feature says it is fenestration, and trusting it both restores the GUID + // (the type-guard would otherwise reject it) and files it in the aperture-construction + // map, so the door keeps its real construction instead of a placeholder. + string stampedType; + bool fenestration = Core.OpenStudio.Query.TryGetSAMType(constructionBase, out stampedType) + && string.Equals(stampedType, typeof(ApertureConstruction).Name, StringComparison.Ordinal); + bool anyLayer = false; + + global::OpenStudio.MaterialVector materialVector = construction.layers(); + if (materialVector != null) + { + foreach (global::OpenStudio.Material material in materialVector) + { + if (material == null) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ConstructionUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "Construction contains a null layer; the layer was skipped", label); + openStudioImportContext.RegisterSkip(); + continue; + } + + anyLayer = true; + + if (IsFenestrationMaterial(material)) + { + fenestration = true; + } + + IMaterial iMaterial = material.ToSAM(openStudioImportContext); + if (iMaterial == null) + { + continue; + } + + if (materialLibrary != null && materialLibrary.GetMaterial(iMaterial.Name) == null) + { + materialLibrary.Add(iMaterial); + } + + constructionLayers.Add(new ConstructionLayer(iMaterial.Name, LayerThickness(material, iMaterial))); + } + } + + if (!anyLayer) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ConstructionUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "Construction has no layers; a name-only SAM construction was created", label); + } + + if (fenestration) + { + // Pane layers only: OpenStudio has no frame layer inside the construction (frame + // and divider are a separate WindowPropertyFrameAndDivider object), so inventing + // SAM frame layers here would fabricate build-up that does not exist. + ApertureConstruction apertureConstruction = new ApertureConstruction(openStudioImportContext.ResolveGuid(constructionBase, typeof(ApertureConstruction).Name), name, ApertureType.Window, constructionLayers, null); + Modify.SetOpenStudioSource(apertureConstruction, constructionBase); + openStudioImportContext.ApertureConstructionMap[name] = apertureConstruction; + openStudioImportContext.RegisterCreated(); + return apertureConstruction; + } + + Construction result = new Construction(openStudioImportContext.ResolveGuid(constructionBase, typeof(Construction).Name), name, constructionLayers); + Modify.SetOpenStudioSource(result, constructionBase); + openStudioImportContext.ConstructionMap[name] = result; + openStudioImportContext.RegisterCreated(); + return result; + } + + /// + /// Thickness [m] of a construction layer. OpenStudio reports 0 for layers defined by + /// resistance rather than geometry (massless, air gap, simple glazing); the nominal + /// thickness the material converter recorded is used instead, so the SAM layer is never + /// zero-thickness. + /// + private static double LayerThickness(global::OpenStudio.Material material, IMaterial iMaterial) + { + double thickness = double.NaN; + try + { + thickness = material.thickness(); + } + catch (Exception) + { + // resistance-defined layers report no thickness + } + + if (!double.IsNaN(thickness) && thickness > 0) + { + return thickness; + } + + ParameterizedSAMObject parameterizedSAMObject = iMaterial as ParameterizedSAMObject; + double defaultThickness; + if (parameterizedSAMObject != null && parameterizedSAMObject.TryGetValue(Core.MaterialParameter.DefaultThickness, out defaultThickness) && !double.IsNaN(defaultThickness) && defaultThickness > 0) + { + return defaultThickness; + } + + return 0; + } + + /// + /// True when a layer belongs to the fenestration material family (glazing or gas), which + /// is what makes its construction an aperture construction. + /// + private static bool IsFenestrationMaterial(global::OpenStudio.Material material) + { + global::OpenStudio.OptionalFenestrationMaterial optionalFenestrationMaterial = global::OpenStudio.OpenStudioModelResources.toFenestrationMaterial(material); + return optionalFenestrationMaterial != null && !optionalFenestrationMaterial.isNull(); + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/Import.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/Import.cs new file mode 100644 index 0000000..75c34f7 --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/Import.cs @@ -0,0 +1,334 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Convert + { + /// + /// Imports an OSM or OSW file into a SAM . + /// + /// The loaded OpenStudio model is disposed before this method returns: the result carries + /// SAM objects and diagnostics only, never a live native model. + /// + /// + /// For an OSM the file is loaded through the existing VersionTranslator path and + /// converted directly — the OpenStudio CLI is never invoked, and no EPW is needed to + /// convert geometry and analytical data. + /// + /// + /// For an OSW the behaviour depends on + /// ; see + /// . An OSW is a workflow description, so parsing it is never + /// treated as equivalent to importing the model it would produce. + /// + /// + /// OSM or OSW file path. + /// Import options; defaults when null. + /// Run options for OSW execution (CLI path, timeout); defaults when null. + /// Optional stage progress sink, used during workflow execution. + /// Cancellation; terminates the CLI/EnergyPlus process tree. + /// The import result; never null. + public static OpenStudioImportResult ToSAM(string path, Core.OpenStudio.OpenStudioImportOptions openStudioImportOptions = null, Core.OpenStudio.OpenStudioRunOptions openStudioRunOptions = null, IProgress progress = null, CancellationToken cancellationToken = default(CancellationToken)) + { + Core.OpenStudio.OpenStudioImportOptions options = openStudioImportOptions ?? new Core.OpenStudio.OpenStudioImportOptions(); + List diagnostics = new List(); + + if (string.IsNullOrWhiteSpace(path) || !File.Exists(path)) + { + diagnostics.Add(new Core.OpenStudio.OpenStudioDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.InputPathInvalid, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("The input path is missing or does not exist: {0}", path))); + return new OpenStudioImportResult(diagnostics, path); + } + + string extension = Path.GetExtension(path); + + if (string.Equals(extension, ".osm", StringComparison.OrdinalIgnoreCase)) + { + return ToSAM_Osm(path, path, options, diagnostics); + } + + if (string.Equals(extension, ".osw", StringComparison.OrdinalIgnoreCase)) + { + return ToSAM_Osw(path, options, openStudioRunOptions, diagnostics, progress, cancellationToken); + } + + diagnostics.Add(new Core.OpenStudio.OpenStudioDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.InputExtensionUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("Unsupported file extension '{0}'; expected .osm or .osw", extension))); + return new OpenStudioImportResult(diagnostics, path); + } + + /// + /// Asynchronous wrapper over + /// : + /// the whole import runs on a worker thread. Worth having even for a plain OSM — a large + /// model takes seconds to convert — and essential for an executed workflow, which takes + /// minutes. + /// + public static Task ToSAMAsync(string path, Core.OpenStudio.OpenStudioImportOptions openStudioImportOptions = null, Core.OpenStudio.OpenStudioRunOptions openStudioRunOptions = null, IProgress progress = null, CancellationToken cancellationToken = default(CancellationToken)) + { + return Task.Run(() => ToSAM(path, openStudioImportOptions, openStudioRunOptions, progress, cancellationToken), cancellationToken); + } + + /// + /// Loads an OSM and converts it, disposing the native model deterministically afterwards. + /// An unloadable OSM produces a blocking SAM-OSI-OSM-001 — never an empty + /// that would look like a building with nothing in it. + /// + /// OSM to load. + /// Path the caller supplied (the OSW for a workflow import). + /// Import options. + /// Diagnostics accumulated before the model was loaded. + private static OpenStudioImportResult ToSAM_Osm(string osmPath, string sourcePath, Core.OpenStudio.OpenStudioImportOptions options, List diagnostics) + { + string originalVersion; + List translationMessages; + string failureReason; + + global::OpenStudio.Model model = Core.OpenStudio.Create.Model(osmPath, out originalVersion, out translationMessages, out failureReason); + + if (model == null) + { + diagnostics.Add(new Core.OpenStudio.OpenStudioDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.OsmLoadFailed, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("The OSM could not be loaded: {0} ({1})", failureReason, osmPath))); + return new OpenStudioImportResult(diagnostics, sourcePath, osmPath); + } + + try + { + OpenStudioImportContext context = new OpenStudioImportContext(model, options); + context.SourceDirectory = Path.GetDirectoryName(Path.GetFullPath(osmPath)); + + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in diagnostics) + { + context.Diagnostics.Add(diagnostic); + } + + if (!string.IsNullOrWhiteSpace(originalVersion)) + { + context.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.OsmVersionTranslationFailed, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, string.Format("The OSM was written by OpenStudio {0} and translated on load", originalVersion), (string)null); + } + + // Translator warnings are surfaced even on a successful load: a model that needed + // repair to open is a model whose imported content deserves a second look. + foreach (string translationMessage in translationMessages) + { + context.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.OsmVersionTranslationFailed, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("The version translator reported: {0}", translationMessage), (string)null); + } + + AnalyticalModel analyticalModel = ToSAM_AnalyticalModel(context); + + if (analyticalModel != null) + { + analyticalModel.SetValue(OpenStudioSourceParameter.SourcePath, osmPath); + if (!string.IsNullOrWhiteSpace(originalVersion)) + { + analyticalModel.SetValue(OpenStudioSourceParameter.OpenStudioVersion, originalVersion); + } + } + + return new OpenStudioImportResult(context, analyticalModel, sourcePath, osmPath, originalVersion); + } + finally + { + // Deterministic disposal: the result never exposes a live native model, so this + // is the last point at which the SWIG wrapper can be released. + model.Dispose(); + } + } + + /// + /// Imports an OSW. + /// + /// Execution disabled (the default): the seed model is resolved and imported, with + /// SAM-OSI-OSW-004 stating that the workflow's measures were NOT applied — the imported + /// model is the seed, not the workflow's output. With no seed, SAM-OSI-OSW-002 blocks: + /// there is nothing to import. + /// + /// + /// Execution enabled: the workflow runs verbatim through the existing CLI runner + /// (its steps and arguments untouched) in an isolated run directory, and the final + /// post-model-measure OSM is located deterministically and converted. This also covers a + /// seedless workflow whose model-creation measures build the model. + /// + /// + private static OpenStudioImportResult ToSAM_Osw(string oswPath, Core.OpenStudio.OpenStudioImportOptions options, Core.OpenStudio.OpenStudioRunOptions openStudioRunOptions, List diagnostics, IProgress progress, CancellationToken cancellationToken) + { + string failureReason; + OpenStudioWorkflow workflow = OpenStudioWorkflow.Parse(oswPath, out failureReason); + if (workflow == null) + { + diagnostics.Add(new Core.OpenStudio.OpenStudioDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.OswParseFailed, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("The OSW could not be parsed: {0} ({1})", failureReason, oswPath))); + return new OpenStudioImportResult(diagnostics, oswPath); + } + + List searchedPaths; + string seedPath = workflow.ResolveSeedPath(out searchedPaths); + + if (string.IsNullOrWhiteSpace(workflow.SeedFile)) + { + if (!options.ExecuteWorkflow) + { + diagnostics.Add(new Core.OpenStudio.OpenStudioDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.OswSeedMissing, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "The OSW declares no seed_file and workflow execution is disabled, so no OpenStudio model exists to import. Enable workflow execution to let the workflow's model-creation measures build one.")); + return new OpenStudioImportResult(diagnostics, oswPath); + } + } + else if (seedPath == null) + { + string message = string.Format("The OSW seed_file '{0}' could not be found. Searched: {1}", workflow.SeedFile, string.Join("; ", searchedPaths)); + + if (!options.ExecuteWorkflow) + { + diagnostics.Add(new Core.OpenStudio.OpenStudioDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.OswSeedNotFound, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, message)); + return new OpenStudioImportResult(diagnostics, oswPath); + } + + diagnostics.Add(new Core.OpenStudio.OpenStudioDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.OswSeedNotFound, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, message + " The workflow will still be executed; it must create the model itself.")); + } + + if (!options.ExecuteWorkflow) + { + diagnostics.Add(new Core.OpenStudio.OpenStudioDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.OswWorkflowNotExecuted, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("The workflow was NOT executed: the imported model is the seed OSM, without the {0} workflow step(s) applied. Enable workflow execution to import the model the workflow actually produces.", workflow.StepMeasureNames.Count))); + return ToSAM_Osm(seedPath, oswPath, options, diagnostics); + } + + return ToSAM_ExecutedOsw(workflow, seedPath, options, openStudioRunOptions, diagnostics, progress, cancellationToken); + } + + /// + /// Runs the workflow and imports the model it produced. Reuses the existing CLI + /// discovery, asynchronous execution, timeout, cancellation and process-tree termination + /// in — nothing about running OpenStudio is + /// reimplemented here. + /// + private static OpenStudioImportResult ToSAM_ExecutedOsw(OpenStudioWorkflow workflow, string seedPath, Core.OpenStudio.OpenStudioImportOptions options, Core.OpenStudio.OpenStudioRunOptions openStudioRunOptions, List diagnostics, IProgress progress, CancellationToken cancellationToken) + { + string outputDirectory = options.OutputDirectory; + if (string.IsNullOrWhiteSpace(outputDirectory)) + { + outputDirectory = Path.GetDirectoryName(workflow.Path); + } + + // A per-import directory, always: the CLI writes its run folder beside the workflow + // file, so two parallel imports of one OSW would otherwise share a run directory and + // overwrite each other's output. + string runDirectory = Path.Combine(outputDirectory, "SAM_OpenStudio_Import_" + Guid.NewGuid().ToString("N").Substring(0, 8)); + + string isolatedOswPath; + try + { + isolatedOswPath = workflow.WriteIsolatedCopy(runDirectory, seedPath); + } + catch (Exception exception) + { + diagnostics.Add(new Core.OpenStudio.OpenStudioDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.OswExecutionFailed, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("The workflow could not be staged into an isolated run directory ({0}: {1})", exception.GetType().Name, exception.Message))); + return new OpenStudioImportResult(diagnostics, workflow.Path, seedPath); + } + + if (workflow.MayContainEnergyPlusMeasures) + { + diagnostics.Add(new Core.OpenStudio.OpenStudioDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.OswEnergyPlusMeasureNotRepresentable, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, string.Format("The workflow has {0} step(s). Any EnergyPlus measure among them modifies only the generated IDF, not the OpenStudio model, so its changes cannot appear in the imported SAM model: what is imported is the final OpenStudio model after the model measures.", workflow.StepMeasureNames.Count))); + } + + DateTime runStartedUtc = DateTime.UtcNow; + + Core.OpenStudio.OpenStudioRunOptions runOptions = openStudioRunOptions ?? new Core.OpenStudio.OpenStudioRunOptions(); + + progress?.Report(new Core.OpenStudio.OpenStudioSimulationProgress(Core.OpenStudio.OpenStudioSimulationStage.RunningCli, isolatedOswPath)); + + // The shared runner's diagnostics are collected separately, not straight into the + // import's list. It judges a run by whether EnergyPlus produced results, which is the + // right test for a simulation and the wrong one for an import: an import needs the + // final OpenStudio model and nothing else. Its verdict is re-badged below once we + // know whether a model was actually produced. + List runDiagnostics = new List(); + + OpenStudioLoadSummary loadSummary; + Core.OpenStudio.OpenStudioRunResult runResult = OpenStudioSimulationRunner.Run(isolatedOswPath, null, runDirectory, runOptions, out loadSummary, runDiagnostics, cancellationToken); + + string how; + string finalOsmPath = OpenStudioWorkflow.FindFinalOsm(runDirectory, runStartedUtc, out how); + + AppendRunDiagnostics(diagnostics, runDiagnostics, runResult, finalOsmPath != null); + + if (finalOsmPath == null) + { + // Distinguish "the run failed" from "the run succeeded but produced no model": + // they need different fixes, and collapsing them wastes the reader's time. + diagnostics.Add(new Core.OpenStudio.OpenStudioDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.OswFinalOsmNotFound, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("No final OpenStudio model was produced by the workflow (run directory: {0}). {1}", runDirectory, runResult != null && runResult.Success ? "The run reported success, so the workflow itself creates no OSM." : "The run did not complete successfully - see the run diagnostics above."))); + + if (runResult != null && !runResult.Success) + { + diagnostics.Add(new Core.OpenStudio.OpenStudioDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.OswExecutionFailed, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("Workflow execution failed (exit code {0}); no model could be imported", runResult.ExitCode))); + } + + return new OpenStudioImportResult(diagnostics, workflow.Path, null, runResult); + } + + diagnostics.Add(new Core.OpenStudio.OpenStudioDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.OswWorkflowExecuted, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, string.Format("The workflow was executed; the imported model is the final post-model-measure OSM, located by {0}", how))); + + OpenStudioImportResult result = ToSAM_Osm(finalOsmPath, workflow.Path, options, diagnostics); + + + // Re-wrap so the workflow's run outcome travels with the imported model; the OSM + // import already carries every diagnostic, including the run diagnostics passed into + // it. + return new OpenStudioImportResult(result.Diagnostics, result.AnalyticalModel, workflow.Path, finalOsmPath, result.OpenStudioVersion, runResult); + } + + /// + /// Folds the shared simulation runner's diagnostics into the import's list, re-badging the + /// one verdict that does not transfer between the two jobs. + /// + /// calls a run failed when EnergyPlus produced no + /// SQLite results. For a simulation that is exactly right; for an import it is not a + /// failure at all — a workflow of model measures with no simulation step legitimately + /// produces a model and no results. Left as an Error it would make + /// false and report a perfectly good import + /// as failed. + /// + /// + /// So when the workflow did produce a final model, the CLI exited cleanly and nothing was + /// fatal, that specific verdict is downgraded to an informational + /// SAM-OSI-OSW-009 explaining why results are irrelevant here. Every other run + /// diagnostic — EnergyPlus severe errors, real CLI failures, cancellations — passes + /// through untouched at its original severity. + /// + /// + /// The import's diagnostic list. + /// Diagnostics produced by the simulation runner. + /// Run outcome, used to tell a clean run from a failed one. + /// True when the workflow's final OSM was located. + private static void AppendRunDiagnostics(List diagnostics, List runDiagnostics, Core.OpenStudio.OpenStudioRunResult runResult, bool modelProduced) + { + // A clean exit with no fatal errors: the CLI did its job, whatever it was asked to do. + bool cleanRun = runResult != null + && runResult.ExitCode == 0 + && (runResult.FatalErrors == null || runResult.FatalErrors.Count == 0); + + foreach (Core.OpenStudio.OpenStudioDiagnostic runDiagnostic in runDiagnostics) + { + if (runDiagnostic == null) + { + continue; + } + + bool resultsOnlyFailure = modelProduced + && cleanRun + && runDiagnostic.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error + && runDiagnostic.Code == Core.OpenStudio.OpenStudioDiagnosticCodes.RunCliFailed; + + if (resultsOnlyFailure) + { + diagnostics.Add(new Core.OpenStudio.OpenStudioDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.OswNoSimulationResults, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, string.Format("The workflow completed (exit code 0, no fatal errors) and produced the model that was imported, but no EnergyPlus simulation results - an import needs the OpenStudio model, not the results, so this does not affect the imported model. The simulation runner reported: {0}", runDiagnostic.Message))); + continue; + } + + diagnostics.Add(runDiagnostic); + } + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/InternalCondition.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/InternalCondition.cs new file mode 100644 index 0000000..c47eccb --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/InternalCondition.cs @@ -0,0 +1,494 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; +using System.Globalization; + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Convert + { + /// + /// Converts every OpenStudio SpaceType into a deduplicated SAM + /// , caching them on the context by space-type name. + /// + /// Deduplication is by space type, which is exactly how OpenStudio itself shares loads: + /// N spaces of one space type produce one SAM internal condition, and SAM's own + /// per-space cloning (Space.InternalCondition assigns a clone with a new Guid) then + /// applies it. Per-space overrides are handled separately in + /// . + /// + /// + /// Import context. + /// Library receiving the schedules the loads reference. + public static void ToSAM_InternalConditions(this OpenStudioImportContext openStudioImportContext, ProfileLibrary profileLibrary) + { + if (openStudioImportContext == null || !openStudioImportContext.Options.IncludeInternalConditions) + { + return; + } + + global::OpenStudio.SpaceTypeVector spaceTypeVector; + try + { + spaceTypeVector = openStudioImportContext.Source.getSpaceTypes(); + } + catch (Exception) + { + return; + } + + if (spaceTypeVector == null) + { + return; + } + + openStudioImportContext.Statistics.SourceObjects += spaceTypeVector.Count; + + foreach (global::OpenStudio.SpaceType spaceType in spaceTypeVector) + { + if (spaceType == null) + { + continue; + } + + InternalCondition internalCondition = spaceType.ToSAM(openStudioImportContext, profileLibrary); + if (internalCondition != null) + { + openStudioImportContext.InternalConditionMap[spaceType.nameString()] = internalCondition; + } + } + } + + /// + /// Converts one OpenStudio SpaceType into a SAM : people, + /// lights, electric equipment, infiltration and outdoor-air requirements, each with its + /// schedule expanded into a SAM profile. + /// + /// Gains are imported per unit area or per person exactly as OpenStudio stores them. They + /// are deliberately NOT multiplied out to absolute watts here: a space type is shared by + /// spaces of different sizes, and resolving the density against one space's floor area + /// would impose that space's loads on all the others. + /// + /// + /// Load kinds SAM cannot carry (gas, steam and hot-water equipment, luminaires, IT + /// equipment, internal mass, leakage-area and flow-coefficient infiltration) are reported + /// through SAM-OSI-LOAD-001 rather than dropped. + /// + /// + /// OpenStudio space type; null returns null. + /// Import context. + /// Library receiving the converted schedules. + /// The SAM internal condition, or null. + public static InternalCondition ToSAM(this global::OpenStudio.SpaceType spaceType, OpenStudioImportContext openStudioImportContext, ProfileLibrary profileLibrary) + { + if (spaceType == null || openStudioImportContext == null) + { + return null; + } + + string name = spaceType.nameString(); + string label = OpenStudioImportContext.OpenStudioObjectLabel(spaceType); + + InternalCondition cached; + if (openStudioImportContext.InternalConditionMap.TryGetValue(name, out cached)) + { + return cached; + } + + string samName; + if (!Core.OpenStudio.Query.TryGetSAMName(spaceType, out samName) || string.IsNullOrWhiteSpace(samName)) + { + samName = name; + } + + InternalCondition result = new InternalCondition(openStudioImportContext.ResolveGuid(spaceType, typeof(InternalCondition).Name), samName); + + ToSAM_People(spaceType, result, openStudioImportContext, profileLibrary, label); + ToSAM_Lights(spaceType, result, openStudioImportContext, profileLibrary, label); + ToSAM_ElectricEquipment(spaceType, result, openStudioImportContext, profileLibrary, label); + ToSAM_Infiltration(spaceType, result, openStudioImportContext, profileLibrary, label); + ToSAM_OutdoorAir(spaceType, result, openStudioImportContext, profileLibrary, label); + + ReportUnsupportedLoads(spaceType, openStudioImportContext, label); + + Modify.SetOpenStudioSource(result, spaceType); + + openStudioImportContext.InternalConditionMap[name] = result; + openStudioImportContext.RegisterCreated(); + return result; + } + + /// + /// People → occupancy density, per-person sensible/latent split and occupancy profile. + /// The sensible/latent split is reconstructed from the activity-level schedule and the + /// definition's sensible heat fraction — the exact inverse of the forward direction, + /// which derives both from those same two values. + /// + private static void ToSAM_People(global::OpenStudio.SpaceType spaceType, InternalCondition internalCondition, OpenStudioImportContext openStudioImportContext, ProfileLibrary profileLibrary, string label) + { + global::OpenStudio.PeopleVector peopleVector = spaceType.people(); + if (peopleVector == null || peopleVector.Count == 0) + { + return; + } + + if (peopleVector.Count > 1) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.LoadAssignmentConflict, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Space type carries {0} People loads; SAM holds one occupancy definition, so only the first was imported", peopleVector.Count), label, internalCondition); + openStudioImportContext.RegisterSkip(); + } + + global::OpenStudio.People people = peopleVector[0]; + global::OpenStudio.PeopleDefinition peopleDefinition = people.peopleDefinition(); + + double peoplePerArea = OptionalValue(peopleDefinition.peopleperSpaceFloorArea()); + if (!double.IsNaN(peoplePerArea) && peoplePerArea > 0) + { + internalCondition.SetValue(InternalConditionParameter.AreaPerPerson, 1.0 / peoplePerArea); + } + else + { + double areaPerPerson = OptionalValue(peopleDefinition.spaceFloorAreaperPerson()); + if (!double.IsNaN(areaPerPerson) && areaPerPerson > 0) + { + internalCondition.SetValue(InternalConditionParameter.AreaPerPerson, areaPerPerson); + } + else + { + // "Number of People" is an absolute count for one space; a space type shared + // by several spaces cannot carry it as a density without inventing an area. + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.LoadUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("People load uses the '{0}' calculation method, which carries no occupancy density; SAM's area-per-person was left unset rather than derived from an assumed floor area", peopleDefinition.numberofPeopleCalculationMethod()), label, internalCondition); + openStudioImportContext.RegisterSkip(); + } + } + + double activityLevel = ConstantScheduleValue(people.activityLevelSchedule()); + if (!double.IsNaN(activityLevel) && activityLevel > 0) + { + double sensibleHeatFraction = OptionalValue(peopleDefinition.sensibleHeatFraction()); + if (double.IsNaN(sensibleHeatFraction)) + { + // Autocalculated by EnergyPlus from the zone air temperature: no single value + // exists to import, so the whole metabolic rate is recorded as sensible and + // the omission is stated. + internalCondition.SetValue(InternalConditionParameter.OccupancySensibleGainPerPerson, activityLevel); + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ApproximationApplied, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format(CultureInfo.InvariantCulture, "The People definition autocalculates its sensible heat fraction, so no fixed split exists; the whole metabolic rate ({0:G4} W/person) was imported as sensible and the latent gain left at zero", activityLevel), label, internalCondition); + } + else + { + internalCondition.SetValue(InternalConditionParameter.OccupancySensibleGainPerPerson, activityLevel * sensibleHeatFraction); + internalCondition.SetValue(InternalConditionParameter.OccupancyLatentGainPerPerson, activityLevel * (1.0 - sensibleHeatFraction)); + } + } + else if (!double.IsNaN(activityLevel)) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.LoadUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, "The People activity level is zero or varies through the year; SAM carries a single per-person gain, so no occupancy gain was imported", label, internalCondition); + } + + double fractionRadiant = peopleDefinition.fractionRadiant(); + if (!double.IsNaN(fractionRadiant)) + { + internalCondition.SetValue(InternalConditionParameter.OccupancyRadiantProportion, fractionRadiant); + } + + AssignProfile(internalCondition, InternalConditionParameter.OccupancyProfileName, people.numberofPeopleSchedule(), ProfileType.Occupancy, openStudioImportContext, profileLibrary); + } + + /// Lights → lighting gain per area, radiant/visible fractions and lighting profile. + private static void ToSAM_Lights(global::OpenStudio.SpaceType spaceType, InternalCondition internalCondition, OpenStudioImportContext openStudioImportContext, ProfileLibrary profileLibrary, string label) + { + global::OpenStudio.LightsVector lightsVector = spaceType.lights(); + if (lightsVector == null || lightsVector.Count == 0) + { + return; + } + + if (lightsVector.Count > 1) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.LoadAssignmentConflict, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Space type carries {0} Lights loads; SAM holds one lighting definition, so only the first was imported", lightsVector.Count), label, internalCondition); + openStudioImportContext.RegisterSkip(); + } + + global::OpenStudio.Lights lights = lightsVector[0]; + global::OpenStudio.LightsDefinition lightsDefinition = lights.lightsDefinition(); + + double wattsPerArea = OptionalValue(lightsDefinition.wattsperSpaceFloorArea()); + if (!double.IsNaN(wattsPerArea)) + { + internalCondition.SetValue(InternalConditionParameter.LightingGainPerArea, wattsPerArea); + } + else + { + double wattsPerPerson = OptionalValue(lightsDefinition.wattsperPerson()); + if (!double.IsNaN(wattsPerPerson)) + { + internalCondition.SetValue(InternalConditionParameter.LightingGainPerPerson, wattsPerPerson); + } + else + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.LoadUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Lights load uses the '{0}' calculation method (an absolute level), which cannot be carried by a shared SAM internal condition; no lighting gain was imported", lightsDefinition.designLevelCalculationMethod()), label, internalCondition); + openStudioImportContext.RegisterSkip(); + } + } + + internalCondition.SetValue(InternalConditionParameter.LightingRadiantProportion, lightsDefinition.fractionRadiant()); + internalCondition.SetValue(InternalConditionParameter.LightingViewCoefficient, lightsDefinition.fractionVisible()); + + AssignProfile(internalCondition, InternalConditionParameter.LightingProfileName, lights.schedule(), ProfileType.Lighting, openStudioImportContext, profileLibrary); + } + + /// + /// ElectricEquipment → sensible and latent equipment gains. + /// + /// The forward direction writes two instances — one sensible, one with Fraction Latent = + /// 1 — so each side keeps its own profile. That split is recognised here by the latent + /// fraction, which makes the round trip exact; a third-party model with a single + /// part-latent instance has its gain apportioned by that fraction, reported as an + /// approximation because the two halves then share one schedule. + /// + /// + private static void ToSAM_ElectricEquipment(global::OpenStudio.SpaceType spaceType, InternalCondition internalCondition, OpenStudioImportContext openStudioImportContext, ProfileLibrary profileLibrary, string label) + { + global::OpenStudio.ElectricEquipmentVector electricEquipmentVector = spaceType.electricEquipment(); + if (electricEquipmentVector == null || electricEquipmentVector.Count == 0) + { + return; + } + + bool sensibleAssigned = false; + bool latentAssigned = false; + + foreach (global::OpenStudio.ElectricEquipment electricEquipment in electricEquipmentVector) + { + global::OpenStudio.ElectricEquipmentDefinition definition = electricEquipment.electricEquipmentDefinition(); + + double wattsPerArea = OptionalValue(definition.wattsperSpaceFloorArea()); + if (double.IsNaN(wattsPerArea)) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.LoadUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Electric equipment '{0}' uses the '{1}' calculation method, which carries no per-area density; no equipment gain was imported from it", electricEquipment.nameString(), definition.designLevelCalculationMethod()), label, internalCondition); + openStudioImportContext.RegisterSkip(); + continue; + } + + double fractionLatent = definition.fractionLatent(); + + if (fractionLatent >= 1.0) + { + if (AssignEquipmentGain(internalCondition, InternalConditionParameter.EquipmentLatentGainPerArea, wattsPerArea, latentAssigned, electricEquipment, openStudioImportContext, label)) + { + latentAssigned = true; + AssignProfile(internalCondition, InternalConditionParameter.EquipmentLatentProfileName, electricEquipment.schedule(), ProfileType.EquipmentLatent, openStudioImportContext, profileLibrary); + } + + continue; + } + + if (AssignEquipmentGain(internalCondition, InternalConditionParameter.EquipmentSensibleGainPerArea, wattsPerArea * (1.0 - fractionLatent), sensibleAssigned, electricEquipment, openStudioImportContext, label)) + { + sensibleAssigned = true; + internalCondition.SetValue(InternalConditionParameter.EquipmentRadiantProportion, definition.fractionRadiant()); + AssignProfile(internalCondition, InternalConditionParameter.EquipmentSensibleProfileName, electricEquipment.schedule(), ProfileType.EquipmentSensible, openStudioImportContext, profileLibrary); + } + + if (fractionLatent > 0 && !latentAssigned) + { + internalCondition.SetValue(InternalConditionParameter.EquipmentLatentGainPerArea, wattsPerArea * fractionLatent); + latentAssigned = true; + AssignProfile(internalCondition, InternalConditionParameter.EquipmentLatentProfileName, electricEquipment.schedule(), ProfileType.EquipmentLatent, openStudioImportContext, profileLibrary); + + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ApproximationApplied, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, string.Format(CultureInfo.InvariantCulture, "Electric equipment '{0}' is {1:P0} latent; the gain was split into SAM's separate sensible and latent parameters, which then share the one source schedule", electricEquipment.nameString(), fractionLatent), label, internalCondition); + } + } + } + + /// + /// Writes an equipment gain unless that slot is already taken, in which case the extra + /// instance is reported instead of silently overwriting the first. + /// + private static bool AssignEquipmentGain(InternalCondition internalCondition, InternalConditionParameter parameter, double value, bool alreadyAssigned, global::OpenStudio.ElectricEquipment electricEquipment, OpenStudioImportContext openStudioImportContext, string label) + { + if (alreadyAssigned) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.LoadAssignmentConflict, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Electric equipment '{0}' would overwrite an equipment gain already imported for this space type; SAM holds one gain per kind, so it was not imported", electricEquipment.nameString()), label, internalCondition); + openStudioImportContext.RegisterSkip(); + return false; + } + + internalCondition.SetValue(parameter, value); + return true; + } + + /// + /// SpaceInfiltrationDesignFlowRate → air changes per hour. + /// + /// Only the native ACH parameterisation converts directly. The flow-based methods depend + /// on the space's floor area, exterior area or volume, none of which a shared space type + /// has — converting them here would silently attach one space's geometry to every space + /// of the type — so they are reported instead. + /// + /// + private static void ToSAM_Infiltration(global::OpenStudio.SpaceType spaceType, InternalCondition internalCondition, OpenStudioImportContext openStudioImportContext, ProfileLibrary profileLibrary, string label) + { + global::OpenStudio.SpaceInfiltrationDesignFlowRateVector vector = spaceType.spaceInfiltrationDesignFlowRates(); + if (vector == null || vector.Count == 0) + { + return; + } + + global::OpenStudio.SpaceInfiltrationDesignFlowRate infiltration = vector[0]; + + if (vector.Count > 1) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.LoadAssignmentConflict, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Space type carries {0} infiltration objects; SAM holds one infiltration rate, so only the first was imported", vector.Count), label, internalCondition); + openStudioImportContext.RegisterSkip(); + } + + double airChangesPerHour = OptionalValue(infiltration.airChangesperHour()); + if (!double.IsNaN(airChangesPerHour)) + { + internalCondition.SetValue(InternalConditionParameter.InfiltrationAirChangesPerHour, airChangesPerHour); + AssignProfile(internalCondition, InternalConditionParameter.InfiltrationProfileName, infiltration.schedule(), ProfileType.Infiltration, openStudioImportContext, profileLibrary); + return; + } + + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.LoadUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Infiltration uses the '{0}' calculation method; converting it to SAM's air changes per hour needs the space's floor/exterior area or volume, which a shared space type does not have, so no infiltration rate was imported", infiltration.designFlowRateCalculationMethod()), label, internalCondition); + openStudioImportContext.RegisterSkip(); + } + + /// + /// DesignSpecificationOutdoorAir → SAM supply-air parameters, using whichever of the + /// per-person, per-area, ACH or absolute fields the outdoor-air method actually populates. + /// + private static void ToSAM_OutdoorAir(global::OpenStudio.SpaceType spaceType, InternalCondition internalCondition, OpenStudioImportContext openStudioImportContext, ProfileLibrary profileLibrary, string label) + { + global::OpenStudio.OptionalDesignSpecificationOutdoorAir optional = spaceType.designSpecificationOutdoorAir(); + if (optional == null || optional.isNull()) + { + return; + } + + global::OpenStudio.DesignSpecificationOutdoorAir designSpecificationOutdoorAir = optional.get(); + + AssignIfPositive(internalCondition, InternalConditionParameter.SupplyAirFlowPerPerson, designSpecificationOutdoorAir.outdoorAirFlowperPerson()); + AssignIfPositive(internalCondition, InternalConditionParameter.SupplyAirFlowPerArea, designSpecificationOutdoorAir.outdoorAirFlowperFloorArea()); + AssignIfPositive(internalCondition, InternalConditionParameter.SupplyAirChangesPerHour, designSpecificationOutdoorAir.outdoorAirFlowAirChangesperHour()); + AssignIfPositive(internalCondition, InternalConditionParameter.SupplyAirFlow, designSpecificationOutdoorAir.outdoorAirFlowRate()); + + AssignProfile(internalCondition, InternalConditionParameter.VentilationProfileName, designSpecificationOutdoorAir.outdoorAirFlowRateFractionSchedule(), ProfileType.Ventilation, openStudioImportContext, profileLibrary); + } + + /// + /// Reports the load kinds present on the space type that SAM has no representation for. + /// Each is named once per model so a template with fifty space types does not produce + /// fifty identical warnings. + /// + private static void ReportUnsupportedLoads(global::OpenStudio.SpaceType spaceType, OpenStudioImportContext openStudioImportContext, string label) + { + ReportUnsupportedLoad(spaceType.gasEquipment()?.Count ?? 0, "GasEquipment", openStudioImportContext, label); + ReportUnsupportedLoad(spaceType.steamEquipment()?.Count ?? 0, "SteamEquipment", openStudioImportContext, label); + ReportUnsupportedLoad(spaceType.hotWaterEquipment()?.Count ?? 0, "HotWaterEquipment", openStudioImportContext, label); + ReportUnsupportedLoad(spaceType.otherEquipment()?.Count ?? 0, "OtherEquipment", openStudioImportContext, label); + ReportUnsupportedLoad(spaceType.luminaires()?.Count ?? 0, "Luminaire", openStudioImportContext, label); + ReportUnsupportedLoad(spaceType.electricEquipmentITEAirCooled()?.Count ?? 0, "ElectricEquipment:ITE:AirCooled", openStudioImportContext, label); + ReportUnsupportedLoad(spaceType.internalMass()?.Count ?? 0, "InternalMass", openStudioImportContext, label); + ReportUnsupportedLoad(spaceType.spaceInfiltrationEffectiveLeakageAreas()?.Count ?? 0, "SpaceInfiltration:EffectiveLeakageArea", openStudioImportContext, label); + ReportUnsupportedLoad(spaceType.spaceInfiltrationFlowCoefficients()?.Count ?? 0, "SpaceInfiltration:FlowCoefficient", openStudioImportContext, label); + } + + private static void ReportUnsupportedLoad(int count, string kind, OpenStudioImportContext openStudioImportContext, string label) + { + if (count <= 0 || !openStudioImportContext.RegisterOnce("SAM-OSI-LOAD-001:" + kind)) + { + return; + } + + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.LoadUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("{0} loads have no SAM equivalent and were not imported; their gains are absent from the SAM model", kind), label); + openStudioImportContext.RegisterSkip(); + } + + /// + /// Converts a schedule and records its SAM profile name on the internal condition. A + /// schedule that cannot be expanded leaves the profile name unset — the load then has no + /// profile, which is visible, rather than an invented always-on one. + /// + private static void AssignProfile(InternalCondition internalCondition, InternalConditionParameter parameter, global::OpenStudio.OptionalSchedule optionalSchedule, ProfileType profileType, OpenStudioImportContext openStudioImportContext, ProfileLibrary profileLibrary) + { + if (optionalSchedule == null || optionalSchedule.isNull()) + { + return; + } + + Profile profile = optionalSchedule.get().ToSAM(profileType, openStudioImportContext, profileLibrary); + if (profile != null) + { + internalCondition.SetValue(parameter, profile.Name); + } + } + + /// + /// Value of a schedule that is constant across the year, or NaN when it varies. Used for + /// quantities SAM stores as a single number (the People activity level), where a varying + /// schedule genuinely has no single equivalent. + /// + private static double ConstantScheduleValue(global::OpenStudio.OptionalSchedule optionalSchedule) + { + if (optionalSchedule == null || optionalSchedule.isNull()) + { + return double.NaN; + } + + global::OpenStudio.OptionalScheduleConstant optionalScheduleConstant = global::OpenStudio.OpenStudioModelResources.toScheduleConstant(optionalSchedule.get()); + if (optionalScheduleConstant != null && !optionalScheduleConstant.isNull()) + { + return optionalScheduleConstant.get().value(); + } + + // A ruleset whose default day is a single constant value is equally constant; that is + // how OpenStudio templates usually express an activity level. + global::OpenStudio.OptionalScheduleRuleset optionalScheduleRuleset = global::OpenStudio.OpenStudioModelCore.toScheduleRuleset(optionalSchedule.get()); + if (optionalScheduleRuleset == null || optionalScheduleRuleset.isNull()) + { + return double.NaN; + } + + global::OpenStudio.ScheduleRuleset scheduleRuleset = optionalScheduleRuleset.get(); + if (scheduleRuleset.scheduleRules() != null && scheduleRuleset.scheduleRules().Count > 0) + { + return double.NaN; + } + + global::OpenStudio.DoubleVector values = scheduleRuleset.defaultDaySchedule()?.values(); + if (values == null || values.Count == 0) + { + return double.NaN; + } + + double first = values[0]; + for (int i = 1; i < values.Count; i++) + { + if (Math.Abs(values[i] - first) > 1e-9) + { + return double.NaN; + } + } + + return first; + } + + private static void AssignIfPositive(InternalCondition internalCondition, InternalConditionParameter parameter, double value) + { + if (!double.IsNaN(value) && value > 0) + { + internalCondition.SetValue(parameter, value); + } + } + + /// Value of an OpenStudio optional double, or NaN when absent. + private static double OptionalValue(global::OpenStudio.OptionalDouble optionalDouble) + { + return optionalDouble == null || optionalDouble.isNull() ? double.NaN : optionalDouble.get(); + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/MaterialLibrary.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/MaterialLibrary.cs new file mode 100644 index 0000000..7688cc3 --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/MaterialLibrary.cs @@ -0,0 +1,452 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; +using System.Globalization; +using SAM.Core; + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Convert + { + /// + /// Nominal thickness [m] assigned to a massless layer so it can become a SAM material, + /// which is always thickness-and-conductivity based. 25 mm is a typical insulation-board + /// thickness and keeps the derived conductivity in a physically plausible range; the + /// *resistance* — the only quantity EnergyPlus actually used — is preserved exactly, + /// because conductivity is derived as thickness / R. + /// + private const double MasslessNominalThickness = 0.025; + + /// + /// Density [kg/m³] and specific heat [J/kgK] assigned to a massless layer. Their product + /// gives the layer's thermal mass, which a massless EnergyPlus layer does not have; they + /// are chosen as low as SAM tolerates so the imported layer stays as close to massless as + /// the SAM material model allows. The substitution is always reported. + /// + private const double MasslessNominalDensity = 1.0; + + /// Specific heat [J/kgK] paired with . + private const double MasslessNominalSpecificHeat = 1000.0; + + /// + /// Converts every material referenced by the model's constructions into a deduplicated + /// SAM . + /// + /// Deduplication is by OpenStudio material name, which is unique per model — one SAM + /// material per source material, however many constructions use it. + /// + /// + /// Nothing unknown is replaced by something known: an unsupported material family + /// (blinds, shades, screens, thermochromic or refraction/extinction glazing) produces a + /// name-only placeholder and a SAM-OSI-MAT-001 diagnostic naming the source object, never + /// a plausible-looking default that would silently change the model's physics. + /// + /// + /// Import context. + /// The material library; never null. + public static MaterialLibrary ToSAM_MaterialLibrary(this OpenStudioImportContext openStudioImportContext) + { + MaterialLibrary result = new MaterialLibrary("OpenStudio"); + + if (openStudioImportContext == null || !openStudioImportContext.Options.IncludeConstructions) + { + return result; + } + + global::OpenStudio.MaterialVector materialVector; + try + { + materialVector = openStudioImportContext.Source.getMaterials(); + } + catch (Exception) + { + return result; + } + + if (materialVector == null) + { + return result; + } + + openStudioImportContext.Statistics.SourceObjects += materialVector.Count; + + foreach (global::OpenStudio.Material material in materialVector) + { + IMaterial iMaterial = material.ToSAM(openStudioImportContext); + if (iMaterial != null) + { + result.Add(iMaterial); + } + } + + return result; + } + + /// + /// Converts one OpenStudio material into a SAM material, caching it by OpenStudio name. + /// The inverse of Convert/ToOpenStudio/Material.cs; see + /// docs/SAM_OPENSTUDIO_MATERIAL_MAPPING.md for the forward mapping this must undo. + /// + /// OpenStudio material; null returns null. + /// Import context. + /// The SAM material, or null when it could not be represented at all. + public static IMaterial ToSAM(this global::OpenStudio.Material material, OpenStudioImportContext openStudioImportContext) + { + if (material == null || openStudioImportContext == null) + { + return null; + } + + string name = material.nameString(); + + IMaterial cached; + if (openStudioImportContext.MaterialMap.TryGetValue(name, out cached)) + { + return cached; + } + + string label = OpenStudioImportContext.OpenStudioObjectLabel(material); + Guid guid = openStudioImportContext.ResolveGuid(material); + + IMaterial result = null; + + global::OpenStudio.OptionalStandardOpaqueMaterial optionalStandardOpaqueMaterial = global::OpenStudio.OpenStudioModelResources.toStandardOpaqueMaterial(material); + if (optionalStandardOpaqueMaterial != null && !optionalStandardOpaqueMaterial.isNull()) + { + result = ToSAM_OpaqueMaterial(optionalStandardOpaqueMaterial.get(), guid, name, openStudioImportContext, label); + } + + if (result == null) + { + global::OpenStudio.OptionalMasslessOpaqueMaterial optionalMasslessOpaqueMaterial = global::OpenStudio.OpenStudioModelResources.toMasslessOpaqueMaterial(material); + if (optionalMasslessOpaqueMaterial != null && !optionalMasslessOpaqueMaterial.isNull()) + { + result = ToSAM_MasslessOpaqueMaterial(optionalMasslessOpaqueMaterial.get(), guid, name, openStudioImportContext, label); + } + } + + if (result == null) + { + global::OpenStudio.OptionalAirGap optionalAirGap = global::OpenStudio.OpenStudioModelResources.toAirGap(material); + if (optionalAirGap != null && !optionalAirGap.isNull()) + { + result = ToSAM_AirGap(optionalAirGap.get(), guid, name, openStudioImportContext, label); + } + } + + if (result == null) + { + global::OpenStudio.OptionalStandardGlazing optionalStandardGlazing = global::OpenStudio.OpenStudioModelResources.toStandardGlazing(material); + if (optionalStandardGlazing != null && !optionalStandardGlazing.isNull()) + { + result = ToSAM_StandardGlazing(optionalStandardGlazing.get(), guid, name, openStudioImportContext, label); + } + } + + if (result == null) + { + global::OpenStudio.OptionalSimpleGlazing optionalSimpleGlazing = global::OpenStudio.OpenStudioModelResources.toSimpleGlazing(material); + if (optionalSimpleGlazing != null && !optionalSimpleGlazing.isNull()) + { + result = ToSAM_SimpleGlazing(optionalSimpleGlazing.get(), guid, name, openStudioImportContext, label); + } + } + + if (result == null) + { + global::OpenStudio.OptionalGas optionalGas = global::OpenStudio.OpenStudioModelResources.toGas(material); + if (optionalGas != null && !optionalGas.isNull()) + { + result = ToSAM_Gas(optionalGas.get(), guid, name, openStudioImportContext, label); + } + } + + if (result == null) + { + global::OpenStudio.OptionalGasMixture optionalGasMixture = global::OpenStudio.OpenStudioModelResources.toGasMixture(material); + if (optionalGasMixture != null && !optionalGasMixture.isNull()) + { + result = ToSAM_GasMixture(optionalGasMixture.get(), guid, name, openStudioImportContext, label); + } + } + + if (result == null) + { + // Placeholder, never a substitute: an opaque material with no properties is + // visibly incomplete, whereas a "reasonable default" would look like real data. + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.MaterialUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Material type '{0}' has no SAM equivalent; a name-only placeholder was created with no physical properties - nothing was substituted", IddTypeName(material)), label); + openStudioImportContext.RegisterSkip(); + result = new OpaqueMaterial(guid, name); + } + + openStudioImportContext.MaterialMap[name] = result; + openStudioImportContext.RegisterCreated(); + return result; + } + + /// + /// StandardOpaqueMaterial → SAM OpaqueMaterial. Thickness is not a SAM material property + /// — it belongs to the construction layer — so it is carried on + /// and read back when the layer is built. + /// + private static IMaterial ToSAM_OpaqueMaterial(global::OpenStudio.StandardOpaqueMaterial standardOpaqueMaterial, Guid guid, string name, OpenStudioImportContext openStudioImportContext, string label) + { + OpaqueMaterial result = new OpaqueMaterial(guid, name, name, string.Empty, standardOpaqueMaterial.thermalConductivity(), standardOpaqueMaterial.density(), standardOpaqueMaterial.specificHeat()); + + result.SetValue(Core.MaterialParameter.DefaultThickness, standardOpaqueMaterial.thickness()); + + // EnergyPlus opaque materials are single-sided: one absorptance set governs both + // faces. Both SAM sides therefore receive the same value - recorded here so the + // asymmetry the forward converter warns about is not silently invented on the way + // back. + double thermalAbsorptance = standardOpaqueMaterial.thermalAbsorptance(); + result.SetValue(OpaqueMaterialParameter.ExternalEmissivity, thermalAbsorptance); + result.SetValue(OpaqueMaterialParameter.InternalEmissivity, thermalAbsorptance); + + double solarReflectance = 1.0 - standardOpaqueMaterial.solarAbsorptance(); + result.SetValue(OpaqueMaterialParameter.ExternalSolarReflectance, solarReflectance); + result.SetValue(OpaqueMaterialParameter.InternalSolarReflectance, solarReflectance); + + double visibleReflectance = 1.0 - standardOpaqueMaterial.visibleAbsorptance(); + result.SetValue(OpaqueMaterialParameter.ExternalLightReflectance, visibleReflectance); + result.SetValue(OpaqueMaterialParameter.InternalLightReflectance, visibleReflectance); + + return result; + } + + /// + /// MasslessOpaqueMaterial → SAM OpaqueMaterial. SAM has no massless material, so the + /// layer is reconstructed at a nominal thickness with conductivity = thickness / R: the + /// thermal resistance EnergyPlus used is preserved exactly, and only the (absent) thermal + /// mass is invented — as near zero as SAM allows. Always reported as an approximation. + /// + private static IMaterial ToSAM_MasslessOpaqueMaterial(global::OpenStudio.MasslessOpaqueMaterial masslessOpaqueMaterial, Guid guid, string name, OpenStudioImportContext openStudioImportContext, string label) + { + double thermalResistance = masslessOpaqueMaterial.thermalResistance(); + if (double.IsNaN(thermalResistance) || thermalResistance <= 0) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.MaterialUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format(CultureInfo.InvariantCulture, "Massless material has a non-usable thermal resistance ({0}); a name-only placeholder was created", thermalResistance), label); + openStudioImportContext.RegisterSkip(); + return new OpaqueMaterial(guid, name); + } + + double conductivity = MasslessNominalThickness / thermalResistance; + + OpaqueMaterial result = new OpaqueMaterial(guid, name, name, string.Empty, conductivity, MasslessNominalDensity, MasslessNominalSpecificHeat); + result.SetValue(Core.MaterialParameter.DefaultThickness, MasslessNominalThickness); + + ApplyOptionalFraction(result, OpaqueMaterialParameter.ExternalEmissivity, masslessOpaqueMaterial.thermalAbsorptance()); + ApplyOptionalFraction(result, OpaqueMaterialParameter.InternalEmissivity, masslessOpaqueMaterial.thermalAbsorptance()); + ApplyOptionalComplement(result, OpaqueMaterialParameter.ExternalSolarReflectance, masslessOpaqueMaterial.solarAbsorptance()); + ApplyOptionalComplement(result, OpaqueMaterialParameter.InternalSolarReflectance, masslessOpaqueMaterial.solarAbsorptance()); + ApplyOptionalComplement(result, OpaqueMaterialParameter.ExternalLightReflectance, masslessOpaqueMaterial.visibleAbsorptance()); + ApplyOptionalComplement(result, OpaqueMaterialParameter.InternalLightReflectance, masslessOpaqueMaterial.visibleAbsorptance()); + + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ApproximationApplied, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, string.Format(CultureInfo.InvariantCulture, "Massless material (R = {0:G4} m²K/W) imported as a SAM material {1:G4} m thick with conductivity {2:G4} W/mK: the resistance is preserved exactly, but SAM has no massless material so a near-zero thermal mass ({3:G4} kg/m³ x {4:G4} J/kgK) was assigned", thermalResistance, MasslessNominalThickness, conductivity, MasslessNominalDensity, MasslessNominalSpecificHeat), label); + + return result; + } + + /// + /// AirGap → SAM GasMaterial. The forward direction writes R = 1/h from + /// ; this inverts it exactly + /// (h = 1/R), so an air cavity survives a round trip unchanged. + /// + private static IMaterial ToSAM_AirGap(global::OpenStudio.AirGap airGap, Guid guid, string name, OpenStudioImportContext openStudioImportContext, string label) + { + double thermalResistance = airGap.thermalResistance(); + if (double.IsNaN(thermalResistance) || thermalResistance <= 0) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.MaterialUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format(CultureInfo.InvariantCulture, "Air gap has a non-usable thermal resistance ({0}); a name-only placeholder was created", thermalResistance), label); + openStudioImportContext.RegisterSkip(); + return new GasMaterial(guid, name); + } + + GasMaterial result = new GasMaterial(guid, name); + result.SetValue(GasMaterialParameter.HeatTransferCoefficient, 1.0 / thermalResistance); + return result; + } + + /// + /// StandardGlazing → SAM TransparentMaterial. Front/Back map back to External/Internal + /// exactly as Convert/ToOpenStudio/Material.cs writes them (EnergyPlus Front = the side + /// away from the zone = SAM External), so the round trip does not mirror the glazing. + /// + private static IMaterial ToSAM_StandardGlazing(global::OpenStudio.StandardGlazing standardGlazing, Guid guid, string name, OpenStudioImportContext openStudioImportContext, string label) + { + double conductivity = standardGlazing.thermalConductivity(); + + TransparentMaterial result = new TransparentMaterial(guid, name, name, string.Empty, conductivity, double.NaN, double.NaN); + result.SetValue(Core.MaterialParameter.DefaultThickness, standardGlazing.thickness()); + + ApplyOptionalFraction(result, TransparentMaterialParameter.SolarTransmittance, standardGlazing.solarTransmittanceatNormalIncidence()); + ApplyOptionalFraction(result, TransparentMaterialParameter.ExternalSolarReflectance, standardGlazing.frontSideSolarReflectanceatNormalIncidence()); + ApplyOptionalFraction(result, TransparentMaterialParameter.InternalSolarReflectance, standardGlazing.backSideSolarReflectanceatNormalIncidence()); + ApplyOptionalFraction(result, TransparentMaterialParameter.LightTransmittance, standardGlazing.visibleTransmittanceatNormalIncidence()); + ApplyOptionalFraction(result, TransparentMaterialParameter.ExternalLightReflectance, standardGlazing.frontSideVisibleReflectanceatNormalIncidence()); + ApplyOptionalFraction(result, TransparentMaterialParameter.InternalLightReflectance, standardGlazing.backSideVisibleReflectanceatNormalIncidence()); + + result.SetValue(TransparentMaterialParameter.ExternalEmissivity, standardGlazing.frontSideInfraredHemisphericalEmissivity()); + result.SetValue(TransparentMaterialParameter.InternalEmissivity, standardGlazing.backSideInfraredHemisphericalEmissivity()); + + return result; + } + + /// + /// SimpleGlazing → SAM TransparentMaterial. + /// + /// SimpleGlazing is a *performance* specification (U, SHGC, VT) with no thickness, + /// conductivity or spectral data, while SAM glazing is a physical layer. The reconstruction + /// keeps the assembly U-value by deriving a conductivity from a nominal thickness, and + /// takes solar transmittance from the SHGC — which overstates transmittance slightly, + /// because SHGC includes the inward-flowing fraction of absorbed radiation. Both are + /// reported: this is the least invented mapping available, not an exact one. + /// + /// + private static IMaterial ToSAM_SimpleGlazing(global::OpenStudio.SimpleGlazing simpleGlazing, Guid guid, string name, OpenStudioImportContext openStudioImportContext, string label) + { + double uFactor = simpleGlazing.uFactor(); + double solarHeatGainCoefficient = simpleGlazing.solarHeatGainCoefficient(); + + double thickness = simpleGlazing.thickness(); + if (double.IsNaN(thickness) || thickness <= 0) + { + thickness = 0.006; + } + + double conductivity = double.NaN; + if (!double.IsNaN(uFactor) && uFactor > 0) + { + conductivity = thickness * uFactor; + } + + TransparentMaterial result = new TransparentMaterial(guid, name, name, string.Empty, conductivity, double.NaN, double.NaN); + result.SetValue(Core.MaterialParameter.DefaultThickness, thickness); + + if (!double.IsNaN(solarHeatGainCoefficient)) + { + result.SetValue(TransparentMaterialParameter.SolarTransmittance, solarHeatGainCoefficient); + } + + ApplyOptionalFraction(result, TransparentMaterialParameter.LightTransmittance, simpleGlazing.visibleTransmittance()); + + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ApproximationApplied, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format(CultureInfo.InvariantCulture, "SimpleGlazing (U = {0:G4} W/m²K, SHGC = {1:G4}) is a performance specification with no physical build-up; it was reconstructed as a single {2:G4} m SAM glazing layer with conductivity {3:G4} W/mK (preserving U) and solar transmittance taken from the SHGC (which overstates transmittance, since SHGC includes inward-flowing absorbed radiation)", uFactor, solarHeatGainCoefficient, thickness, conductivity), label); + + return result; + } + + /// Gas (window cavity) → SAM GasMaterial, with h derived from the 20 °C conductance. + private static IMaterial ToSAM_Gas(global::OpenStudio.Gas gas, Guid guid, string name, OpenStudioImportContext openStudioImportContext, string label) + { + GasMaterial result = new GasMaterial(guid, name); + result.SetValue(Core.MaterialParameter.DefaultThickness, gas.thickness()); + result.SetValue(GasMaterialParameter.DefaultGasType, gas.gasType()); + + ApplyGasConductance(result, () => gas.getThermalConductance(293.15), openStudioImportContext, label, name); + + return result; + } + + /// + /// GasMixture → SAM GasMaterial. SAM carries one gas type, so the mixture's composition + /// is lost; its thermal conductance is preserved, which is what the fenestration heat + /// balance uses. Reported as an approximation naming the constituents. + /// + private static IMaterial ToSAM_GasMixture(global::OpenStudio.GasMixture gasMixture, Guid guid, string name, OpenStudioImportContext openStudioImportContext, string label) + { + GasMaterial result = new GasMaterial(guid, name); + result.SetValue(Core.MaterialParameter.DefaultThickness, gasMixture.thickness()); + + ApplyGasConductance(result, () => gasMixture.getThermalConductance(293.15), openStudioImportContext, label, name); + + List constituents = new List(); + try + { + for (uint i = 0; i < gasMixture.numGases(); i++) + { + constituents.Add(string.Format(CultureInfo.InvariantCulture, "{0} {1:P0}", gasMixture.getGasType(i), gasMixture.getGasFraction(i))); + } + } + catch (Exception) + { + // the composition is descriptive only; its absence must not fail the import + } + + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.MaterialUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Gas mixture ({0}) has no SAM equivalent - SAM carries a single gas type; the mixture's thermal conductance was preserved but its composition was not", constituents.Count == 0 ? "composition unavailable" : string.Join(", ", constituents)), label); + + return result; + } + + /// + /// Applies a gas cavity's conductance as SAM's authoritative + /// . A conductance that cannot + /// be evaluated leaves the material without one, reported rather than guessed. + /// + private static void ApplyGasConductance(GasMaterial gasMaterial, Func conductanceAccessor, OpenStudioImportContext openStudioImportContext, string label, string name) + { + double conductance; + try + { + conductance = conductanceAccessor(); + } + catch (Exception) + { + conductance = double.NaN; + } + + if (double.IsNaN(conductance) || double.IsInfinity(conductance) || conductance <= 0) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.MaterialUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("The thermal conductance of gas layer '{0}' could not be evaluated; the SAM gas material carries no heat transfer coefficient (no value was substituted)", name), label); + return; + } + + gasMaterial.SetValue(GasMaterialParameter.HeatTransferCoefficient, conductance); + } + + private static void ApplyOptionalFraction(ParameterizedSAMObject parameterizedSAMObject, Enum parameter, global::OpenStudio.OptionalDouble optionalDouble) + { + if (optionalDouble == null || optionalDouble.isNull()) + { + return; + } + + parameterizedSAMObject.SetValue(parameter, optionalDouble.get()); + } + + private static void ApplyOptionalFraction(ParameterizedSAMObject parameterizedSAMObject, Enum parameter, double value) + { + if (double.IsNaN(value)) + { + return; + } + + parameterizedSAMObject.SetValue(parameter, value); + } + + /// Applies 1 − absorptance as a reflectance, skipping absent values. + private static void ApplyOptionalComplement(ParameterizedSAMObject parameterizedSAMObject, Enum parameter, global::OpenStudio.OptionalDouble optionalDouble) + { + if (optionalDouble == null || optionalDouble.isNull()) + { + return; + } + + parameterizedSAMObject.SetValue(parameter, 1.0 - optionalDouble.get()); + } + + /// IDD type name of an OpenStudio object, for diagnostics; never throws. + internal static string IddTypeName(global::OpenStudio.ModelObject modelObject) + { + try + { + return modelObject.iddObjectType().valueName(); + } + catch (Exception) + { + return modelObject?.GetType().Name ?? "unknown"; + } + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/ModelMetadata.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/ModelMetadata.cs new file mode 100644 index 0000000..c3eea03 --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/ModelMetadata.cs @@ -0,0 +1,464 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; +using System.Globalization; + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Convert + { + /// + /// Assembles the final SAM from the imported topology and + /// libraries, and attaches the model-level metadata: name, site location, north axis, + /// design days and the weather-file reference. + /// + /// Nothing absent is fabricated. A model with no Site object gets no SAM + /// ; a WeatherFile reference is recorded as a path only and + /// never presented as embedded hourly weather. + /// + /// + /// Import context. + /// Imported topology. + /// Imported material library. + /// Imported profile library. + /// The assembled SAM analytical model. + internal static AnalyticalModel ToSAM_AnalyticalModel(this OpenStudioImportContext openStudioImportContext, AdjacencyCluster adjacencyCluster, Core.MaterialLibrary materialLibrary, ProfileLibrary profileLibrary) + { + global::OpenStudio.Model model = openStudioImportContext.Source; + global::OpenStudio.Building building = model.getBuilding(); + + string name = null; + string description = null; + Guid guid = Guid.Empty; + + if (building != null) + { + if (!Core.OpenStudio.Query.TryGetSAMName(building, out name) || string.IsNullOrWhiteSpace(name)) + { + name = building.nameString(); + } + + if (openStudioImportContext.Options.RestoreSAMIdentity) + { + Core.OpenStudio.Query.TryGetSAMGuid(building, out guid); + } + } + + Core.Location location = ToSAM_Location(openStudioImportContext); + + AnalyticalModel result = new AnalyticalModel(name, description, location, null, adjacencyCluster, materialLibrary, profileLibrary); + + if (guid != Guid.Empty && guid != result.Guid) + { + // AnalyticalModel exposes no (Guid, AnalyticalModel) constructor, so the + // model-level Guid can only be restored through a JSON round trip — the same + // approach SAM_LadybugTools uses. A failed reconstruction must never destroy an + // otherwise valid model, so the original instance is kept and the loss reported. + AnalyticalModel restored = TryRestoreGuid(result, guid); + if (restored != null) + { + result = restored; + } + else + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.IdentityCollision, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("The model-level SAM Guid {0} could not be restored onto the imported AnalyticalModel; the model is valid but carries a new Guid", guid), OpenStudioImportContext.OpenStudioObjectLabel(building)); + } + } + + ToSAM_NorthAxis(building, result, openStudioImportContext); + ToSAM_WeatherReference(openStudioImportContext, result); + ToSAM_DesignDays(openStudioImportContext, result); + ToSAM_SimulationSettings(openStudioImportContext); + + return result; + } + + /// + /// Site → SAM . Returns null when the model carries no Site, or + /// when its latitude, longitude and elevation are all exactly zero. + /// + /// Every OpenStudio model has a Site object with an auto-assigned name, so the name says + /// nothing about whether the site was ever set; the coordinates do. All three exactly + /// zero is the OpenStudio default, and importing it would place the building in the Gulf + /// of Guinea — a fabricated location is worse than none. + /// + /// + private static Core.Location ToSAM_Location(OpenStudioImportContext openStudioImportContext) + { + global::OpenStudio.Site site; + try + { + site = openStudioImportContext.Source.getSite(); + } + catch (Exception) + { + return null; + } + + if (site == null) + { + return null; + } + + string name = site.nameString(); + double latitude = site.latitude(); + double longitude = site.longitude(); + double elevation = site.elevation(); + + if (latitude == 0 && longitude == 0 && elevation == 0) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.WeatherLimitation, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, "The model's Site still carries the default (0, 0, 0) coordinates, so no site was ever set; no SAM Location was created rather than placing the model at the equator", OpenStudioImportContext.OpenStudioObjectLabel(site)); + return null; + } + + double timeZone = site.timeZone(); + string terrain = site.terrain(); + if (!string.IsNullOrWhiteSpace(terrain)) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.WeatherLimitation, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, string.Format(CultureInfo.InvariantCulture, "Site terrain '{0}' and time zone {1:G4} have no SAM Location equivalent and were not imported; latitude, longitude and elevation were", terrain, timeZone), OpenStudioImportContext.OpenStudioObjectLabel(site)); + } + + return new Core.Location(name, longitude, latitude, elevation); + } + + /// + /// Building north axis [degrees clockwise from north] → SAM + /// [radians], the exact inverse of the + /// forward conversion in Convert/ToOpenStudio/SimulationSettings.cs. + /// + private static void ToSAM_NorthAxis(global::OpenStudio.Building building, AnalyticalModel analyticalModel, OpenStudioImportContext openStudioImportContext) + { + if (building == null) + { + return; + } + + double northAxisDegrees; + try + { + northAxisDegrees = building.northAxis(); + } + catch (Exception) + { + return; + } + + if (double.IsNaN(northAxisDegrees)) + { + return; + } + + analyticalModel.SetValue(AnalyticalModelParameter.NorthAngle, northAxisDegrees * Math.PI / 180.0); + } + + /// + /// Imports the model's weather. + /// + /// A OS:WeatherFile object names an EPW; it does not contain one. When that EPW is + /// found on disk — as it is for a SAM round trip, whose forward export writes the file — + /// its hourly weather is loaded into SAM WeatherData and embedded in the model, so + /// the imported model carries real weather rather than a dangling path. When the file + /// cannot be found, or + /// is off, only the path is recorded and a diagnostic states that no weather was embedded: + /// a reference is never presented as embedded hourly weather. + /// + /// + private static void ToSAM_WeatherReference(OpenStudioImportContext openStudioImportContext, AnalyticalModel analyticalModel) + { + global::OpenStudio.OptionalWeatherFile optionalWeatherFile; + try + { + optionalWeatherFile = openStudioImportContext.Source.weatherFile(); + } + catch (Exception) + { + return; + } + + if (optionalWeatherFile == null || optionalWeatherFile.isNull()) + { + return; + } + + global::OpenStudio.WeatherFile weatherFile = optionalWeatherFile.get(); + string label = OpenStudioImportContext.OpenStudioObjectLabel(weatherFile); + + string path = null; + global::OpenStudio.OptionalString optionalUrl = weatherFile.url(); + if (optionalUrl != null && !optionalUrl.isNull()) + { + path = optionalUrl.get(); + } + + if (string.IsNullOrWhiteSpace(path)) + { + global::OpenStudio.OptionalPath optionalPath = weatherFile.path(); + if (optionalPath != null && !optionalPath.isNull()) + { + path = optionalPath.get().__str__(); + } + } + + if (!string.IsNullOrWhiteSpace(path)) + { + analyticalModel.SetValue(OpenStudioSourceParameter.WeatherFilePath, path); + } + + string resolvedPath = ResolveWeatherPath(path, openStudioImportContext.SourceDirectory); + + if (openStudioImportContext.Options.ImportWeatherData && resolvedPath != null && ToSAM_EmbedWeatherData(resolvedPath, analyticalModel, openStudioImportContext, label)) + { + return; + } + + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.WeatherLimitation, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, string.Format("The model references the weather file '{0}' ({1}, {2}) but it {3}, so no SAM WeatherData was embedded - supply the EPW separately for annual simulation", string.IsNullOrWhiteSpace(path) ? "path unavailable" : path, weatherFile.city(), weatherFile.country(), openStudioImportContext.Options.ImportWeatherData ? "could not be found on disk" : "was not loaded (weather import disabled)"), label); + } + + /// + /// Loads an EPW into SAM and embeds it in the model. + /// Returns false when the file carries no usable hourly weather. The embedded WeatherData + /// is the same slot the forward converter reads back on export, so this closes the weather + /// round trip. mutates the model in + /// place, so no reconstruction is needed. + /// + private static bool ToSAM_EmbedWeatherData(string resolvedPath, AnalyticalModel analyticalModel, OpenStudioImportContext openStudioImportContext, string label) + { + Weather.WeatherData weatherData; + try + { + weatherData = Weather.Convert.ToSAM(resolvedPath); + } + catch (Exception exception) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.WeatherLimitation, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("The referenced EPW '{0}' could not be read ({1}: {2}); no SAM WeatherData was embedded", resolvedPath, exception.GetType().Name, exception.Message), label); + return false; + } + + // A weather file with no hourly years is a header only — a reference, not weather. + if (weatherData == null || weatherData.Years == null || !System.Linq.Enumerable.Any(weatherData.Years)) + { + return false; + } + + analyticalModel.SetValue(AnalyticalModelParameter.WeatherData, weatherData); + + int yearCount = System.Linq.Enumerable.Count(weatherData.Years); + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.WeatherLimitation, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, string.Format("Hourly weather was loaded from the referenced EPW '{0}' ({1} year(s)) and embedded in the AnalyticalModel as SAM WeatherData", resolvedPath, yearCount), label); + return true; + } + + /// + /// Resolves a weather-file reference to an existing EPW on disk: the path as given (after + /// stripping a file:/file:// scheme), then — for a relative path — against + /// the source OSM directory. Returns null when nothing resolves to an existing file. + /// + private static string ResolveWeatherPath(string path, string sourceDirectory) + { + if (string.IsNullOrWhiteSpace(path)) + { + return null; + } + + string candidate = path.Trim(); + if (candidate.StartsWith("file://", StringComparison.OrdinalIgnoreCase)) + { + candidate = candidate.Substring("file://".Length); + } + else if (candidate.StartsWith("file:", StringComparison.OrdinalIgnoreCase)) + { + candidate = candidate.Substring("file:".Length); + } + + candidate = candidate.Replace('/', System.IO.Path.DirectorySeparatorChar); + + try + { + if (System.IO.Path.IsPathRooted(candidate)) + { + return System.IO.File.Exists(candidate) ? System.IO.Path.GetFullPath(candidate) : null; + } + + if (!string.IsNullOrWhiteSpace(sourceDirectory)) + { + string combined = System.IO.Path.GetFullPath(System.IO.Path.Combine(sourceDirectory, candidate)); + if (System.IO.File.Exists(combined)) + { + return combined; + } + } + + return System.IO.File.Exists(candidate) ? System.IO.Path.GetFullPath(candidate) : null; + } + catch (Exception) + { + return null; + } + } + + /// + /// SizingPeriod:DesignDay objects → SAM heating/cooling + /// collections, classified by their day type. + /// + /// A SAM DesignDay is an hourly weather day, whereas an EnergyPlus design day is a + /// parametric definition (maximum dry bulb, daily range, a temperature-range profile + /// type). The dates and names transfer; the hourly reconstruction does not, so the design + /// days are imported as identity and date only and the limitation is reported. + /// + /// + private static void ToSAM_DesignDays(OpenStudioImportContext openStudioImportContext, AnalyticalModel analyticalModel) + { + global::OpenStudio.DesignDayVector designDayVector; + try + { + designDayVector = openStudioImportContext.Source.getDesignDays(); + } + catch (Exception) + { + return; + } + + if (designDayVector == null || designDayVector.Count == 0) + { + return; + } + + Core.SAMCollection heatingDesignDays = new Core.SAMCollection(); + Core.SAMCollection coolingDesignDays = new Core.SAMCollection(); + + foreach (global::OpenStudio.DesignDay openStudioDesignDay in designDayVector) + { + if (openStudioDesignDay == null) + { + continue; + } + + DesignDay designDay; + try + { + designDay = new DesignDay(openStudioDesignDay.nameString(), 0, (byte)openStudioDesignDay.month(), (byte)openStudioDesignDay.dayOfMonth()); + } + catch (Exception) + { + continue; + } + + // "WinterDesignDay" is the only EnergyPlus day type that means heating sizing; + // everything else (SummerDesignDay and the day-of-week types) sizes cooling. + if (string.Equals(openStudioDesignDay.dayType(), "WinterDesignDay", StringComparison.OrdinalIgnoreCase)) + { + heatingDesignDays.Add(designDay); + } + else + { + coolingDesignDays.Add(designDay); + } + } + + if (heatingDesignDays.Count > 0) + { + analyticalModel.SetValue(AnalyticalModelParameter.HeatingDesignDays, heatingDesignDays); + } + + if (coolingDesignDays.Count > 0) + { + analyticalModel.SetValue(AnalyticalModelParameter.CoolingDesignDays, coolingDesignDays); + } + + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.WeatherLimitation, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("{0} design day(s) imported by name and date only: an EnergyPlus design day is parametric (maximum dry bulb, daily range, humidity indicating type) while a SAM DesignDay is an hourly weather day, so no hourly profile was reconstructed", designDayVector.Count), (string)null); + } + + /// + /// Reports simulation settings that have no SAM equivalent. SAM's analytical model + /// carries no run period, timestep or shadow-calculation configuration — those are + /// conversion options on the way out — so they are named rather than imported. + /// + private static void ToSAM_SimulationSettings(OpenStudioImportContext openStudioImportContext) + { + List settings = new List(); + + try + { + global::OpenStudio.RunPeriod runPeriod = openStudioImportContext.Source.getRunPeriod(); + if (runPeriod != null) + { + settings.Add(string.Format(CultureInfo.InvariantCulture, "run period {0}/{1} - {2}/{3}", runPeriod.getBeginDayOfMonth(), runPeriod.getBeginMonth(), runPeriod.getEndDayOfMonth(), runPeriod.getEndMonth())); + } + } + catch (Exception) + { + // best effort — settings are descriptive only + } + + try + { + global::OpenStudio.Timestep timestep = openStudioImportContext.Source.getTimestep(); + if (timestep != null) + { + settings.Add(string.Format(CultureInfo.InvariantCulture, "{0} timesteps per hour", timestep.numberOfTimestepsPerHour())); + } + } + catch (Exception) + { + // best effort + } + + if (settings.Count == 0) + { + return; + } + + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.SimulationSettingUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, string.Format("Simulation settings ({0}) have no SAM AnalyticalModel equivalent and were not imported; they are set again by the conversion options on export", string.Join(", ", settings)), (string)null); + } + + /// + /// Rebuilds an analytical model with a preserved model-level Guid through a JSON round + /// trip, validating that the reconstruction kept the content. Returns null on any + /// failure, so the caller keeps the original valid instance. + /// + private static AnalyticalModel TryRestoreGuid(AnalyticalModel analyticalModel, Guid guid) + { + if (analyticalModel == null || guid == Guid.Empty) + { + return null; + } + + try + { + System.Text.Json.Nodes.JsonObject jsonObject = analyticalModel.ToJsonObject(); + if (jsonObject == null) + { + return null; + } + + jsonObject["Guid"] = guid.ToString(); + + AnalyticalModel result = new AnalyticalModel(jsonObject); + if (result == null || result.Guid != guid) + { + return null; + } + + AdjacencyCluster original = analyticalModel.AdjacencyCluster; + AdjacencyCluster restored = result.AdjacencyCluster; + if (restored == null) + { + return null; + } + + if ((original?.GetPanels()?.Count ?? 0) != (restored.GetPanels()?.Count ?? 0) + || (original?.GetSpaces()?.Count ?? 0) != (restored.GetSpaces()?.Count ?? 0)) + { + return null; + } + + return result; + } + catch (Exception) + { + return null; + } + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/Panel.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/Panel.cs new file mode 100644 index 0000000..3bf8fb2 --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/Panel.cs @@ -0,0 +1,185 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Convert + { + /// + /// Converts one OpenStudio Surface into a SAM Panel, including its subsurfaces as SAM + /// apertures. + /// + /// Geometry is read in the owning space's coordinate system and transformed with + /// ; the winding OpenStudio stores (outward normal) is + /// preserved, and the SAM panel type is derived from surface type *and* boundary + /// condition together (). + /// + /// + /// One call produces one panel per Surface. The two surfaces of an interzone partition + /// are merged into a single shared panel later, by the topology pass, using the + /// OpenStudio adjacency handles — see Convert/ToSAM/AnalyticalModel.cs. + /// + /// + /// OpenStudio surface; null returns null. + /// Import context. + /// Space → model transformation applied to the vertices. + /// The created SAM panel, or null when the surface could not be converted. + public static Panel ToSAM(this global::OpenStudio.Surface surface, OpenStudioImportContext openStudioImportContext, global::OpenStudio.Transformation transformation = null) + { + if (surface == null || openStudioImportContext == null) + { + return null; + } + + string label = OpenStudioImportContext.OpenStudioObjectLabel(surface); + + string surfaceType = surface.surfaceType(); + string outsideBoundaryCondition = surface.outsideBoundaryCondition(); + + bool adiabatic; + bool supported; + PanelType panelType = Query.SAMPanelType(surfaceType, outsideBoundaryCondition, out adiabatic, out supported); + + if (!supported) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.BoundaryConditionUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Surface type '{0}' with outside boundary condition '{1}' has no exact SAM equivalent; imported as {2}{3}", surfaceType, outsideBoundaryCondition, panelType, adiabatic ? " (adiabatic)" : string.Empty), label); + } + + // An air boundary is a SAM PanelType.Air regardless of its surface type: the + // construction, not the orientation, is what makes it an opening between zones. + if (IsAirBoundary(surface)) + { + panelType = PanelType.Air; + adiabatic = false; + } + + List diagnostics; + Geometry.Spatial.Face3D face3D = Geometry.OpenStudio.Convert.ToSAM(surface, openStudioImportContext.Options.DistanceTolerance, openStudioImportContext.Options.AngleTolerance, openStudioImportContext.Options.MinimumArea, out diagnostics, transformation); + + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in diagnostics) + { + openStudioImportContext.AddDiagnostic(diagnostic.Code, diagnostic.Severity, diagnostic.Message, label); + } + + if (face3D == null) + { + openStudioImportContext.RegisterSkip(); + return null; + } + + Construction construction = ResolveConstruction(surface, panelType, openStudioImportContext); + + Panel result; + try + { + result = Analytical.Create.Panel(construction, panelType, face3D); + } + catch (Exception exception) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.GeometryInvalid, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("The SAM panel could not be created ({0}: {1})", exception.GetType().Name, exception.Message), label); + openStudioImportContext.RegisterSkip(); + return null; + } + + if (result == null) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.GeometryInvalid, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "The SAM panel could not be created from the surface boundary", label); + openStudioImportContext.RegisterSkip(); + return null; + } + + Guid guid = openStudioImportContext.ResolveGuid(surface, typeof(Panel).Name); + result = Analytical.Create.Panel(guid, result); + + // A SAM Panel's Name is structural — it comes from its Construction — so the + // OpenStudio name cannot be written to it. Provenance goes into the parameter set + // instead, together with the handle, which is the only identity that is unique. + Modify.SetOpenStudioSource(result, surface); + + if (adiabatic) + { + result.SetValue(PanelParameter.Adiabatic, true); + } + + ToSAM_Apertures(surface, result, panelType, openStudioImportContext, transformation); + + openStudioImportContext.RegisterCreated(); + return result; + } + + /// + /// True when the surface behaves as an air boundary. Both routes are checked: OpenStudio's + /// own isAirWall(), and an explicitly assigned ConstructionAirBoundary — + /// they do not always agree on models produced by older versions or by measures. + /// + private static bool IsAirBoundary(global::OpenStudio.Surface surface) + { + try + { + if (surface.isAirWall()) + { + return true; + } + } + catch (Exception) + { + // fall through to the construction check + } + + global::OpenStudio.OptionalConstructionBase optionalConstructionBase = surface.construction(); + if (optionalConstructionBase == null || optionalConstructionBase.isNull()) + { + return false; + } + + global::OpenStudio.OptionalConstructionAirBoundary optionalConstructionAirBoundary = global::OpenStudio.OpenStudioModelResources.toConstructionAirBoundary(optionalConstructionBase.get()); + return optionalConstructionAirBoundary != null && !optionalConstructionAirBoundary.isNull(); + } + + /// + /// Resolves the SAM construction for a surface from the constructions already imported + /// into . + /// + /// When the construction is absent — the surface has none, its kind is unsupported, or + /// construction import is switched off — a name-only placeholder is created and cached so + /// every surface sharing that OpenStudio construction still shares one SAM construction. + /// A placeholder is never populated with invented layers: the panel keeps its identity + /// and the missing build-up is visible instead of being quietly replaced by a default. + /// + /// + private static Construction ResolveConstruction(global::OpenStudio.Surface surface, PanelType panelType, OpenStudioImportContext openStudioImportContext) + { + string constructionName = null; + global::OpenStudio.OptionalConstructionBase optionalConstructionBase = surface.construction(); + if (optionalConstructionBase != null && !optionalConstructionBase.isNull()) + { + constructionName = optionalConstructionBase.get().nameString(); + } + + if (string.IsNullOrWhiteSpace(constructionName)) + { + // No construction at all: name the placeholder after the panel type so several + // construction-less surfaces of the same type share one SAM construction rather + // than producing one per surface. + constructionName = string.Format("Unassigned_{0}", panelType); + if (openStudioImportContext.RegisterOnce("SAM-OSI-CON-001:Unassigned:" + constructionName)) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ConstructionUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Surface has no construction; a name-only SAM construction '{0}' was created with no layers (nothing was substituted)", constructionName), OpenStudioImportContext.OpenStudioObjectLabel(surface)); + } + } + + Construction result; + if (openStudioImportContext.ConstructionMap.TryGetValue(constructionName, out result)) + { + return result; + } + + result = new Construction(constructionName); + openStudioImportContext.ConstructionMap[constructionName] = result; + return result; + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/PanelSimulationResults.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/PanelSimulationResults.cs index 3ea03c0..9a3c085 100644 --- a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/PanelSimulationResults.cs +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/PanelSimulationResults.cs @@ -1,4 +1,7 @@ -using System.Collections.Generic; +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Collections.Generic; using System.Data; namespace SAM.Analytical.OpenStudio @@ -57,7 +60,12 @@ public static List ToSAM_SurfaceSimulationResult(this D } SurfaceSimulationResult surfaceSimulationResult = new SurfaceSimulationResult(surfaceName, source, surfaceIndex.ToString()); - + + // The engine-surface identity is kept as a parameter as well: Modify.AddResults + // replaces Reference with the matched SAM Panel Guid so results map back to the + // model, and the SQL SurfaceIndex must survive that. + surfaceSimulationResult.SetValue(SurfaceSimulationResultParameter.SurfaceIndex, surfaceIndex); + if(index_Area != -1 && Core.Query.TryConvert(values[index_Area], out double area)) { surfaceSimulationResult.SetValue(Analytical.SurfaceSimulationResultParameter.Area, area); diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/ProfileLibrary.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/ProfileLibrary.cs new file mode 100644 index 0000000..1416b81 --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/ProfileLibrary.cs @@ -0,0 +1,403 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Convert + { + /// Hours in a non-leap year — the length of every SAM annual profile produced here. + private const int AnnualHourCount = 8760; + + /// + /// Creates the SAM for the import. Profiles are converted + /// lazily, as internal conditions reference them, so a model's unused schedules — and + /// there are usually many — never enter the library in the first place. Anything that + /// slips through is removed by + /// . + /// + /// Import context. + /// An empty profile library, ready to be populated; never null. + public static ProfileLibrary ToSAM_ProfileLibrary(this OpenStudioImportContext openStudioImportContext) + { + return new ProfileLibrary("OpenStudio"); + } + + /// + /// Converts an OpenStudio schedule into a SAM annual of 8760 hourly + /// values, caching it by schedule name and adding it to + /// . + /// + /// Everything is expanded to hourly because that is what SAM profiles are, and because it + /// is the exact inverse of the forward direction, which writes SAM profiles out as + /// 8760-value ScheduleFixedIntervals. A ScheduleRuleset is expanded through OpenStudio's + /// own getDaySchedules, so weekday/weekend rules, seasonal date ranges and rule + /// priority are honoured by the engine that defines them rather than reimplemented here — + /// and the schedule is never flattened to a single constant. + /// + /// + /// OpenStudio schedule; null returns null. + /// SAM profile type (selects the profile's category). + /// Import context. + /// Library receiving the profile; may be null. + /// The SAM profile, or null when the schedule kind cannot be expanded. + public static Profile ToSAM(this global::OpenStudio.Schedule schedule, ProfileType profileType, OpenStudioImportContext openStudioImportContext, ProfileLibrary profileLibrary) + { + if (schedule == null || openStudioImportContext == null) + { + return null; + } + + string name = schedule.nameString(); + string cacheKey = string.Format("{0}:{1}", name, profileType); + + Profile cached; + if (openStudioImportContext.ProfileMap.TryGetValue(cacheKey, out cached)) + { + return cached; + } + + string label = OpenStudioImportContext.OpenStudioObjectLabel(schedule); + + double[] values = AnnualHourlyValues(schedule, openStudioImportContext, label); + if (values == null) + { + return null; + } + + // The profile name carries the type: the same OpenStudio schedule reused as, say, + // both an occupancy and an equipment profile must not collide in the library, and + // the forward direction names its schedules the same way. + string profileName = string.Format("{0}_{1}", name, profileType); + + Profile result = new Profile(profileName, profileType, values); + + Guid guid = openStudioImportContext.ResolveGuid(schedule, typeof(Profile).Name); + result = new Profile(guid, result, profileName, result.Category); + + Modify.SetOpenStudioSource(result, schedule); + + openStudioImportContext.ProfileMap[cacheKey] = result; + profileLibrary?.Add(result); + openStudioImportContext.RegisterCreated(); + + return result; + } + + /// + /// Expands any supported schedule into 8760 hourly values. Unsupported kinds return null + /// with a SAM-OSI-SCH-001 diagnostic — the caller then leaves the load without a profile + /// rather than substituting a constant that would look like real data. + /// + private static double[] AnnualHourlyValues(global::OpenStudio.Schedule schedule, OpenStudioImportContext openStudioImportContext, string label) + { + global::OpenStudio.OptionalScheduleConstant optionalScheduleConstant = global::OpenStudio.OpenStudioModelResources.toScheduleConstant(schedule); + if (optionalScheduleConstant != null && !optionalScheduleConstant.isNull()) + { + double value = optionalScheduleConstant.get().value(); + double[] result = new double[AnnualHourCount]; + for (int i = 0; i < AnnualHourCount; i++) + { + result[i] = value; + } + + return result; + } + + global::OpenStudio.OptionalScheduleRuleset optionalScheduleRuleset = global::OpenStudio.OpenStudioModelCore.toScheduleRuleset(schedule); + if (optionalScheduleRuleset != null && !optionalScheduleRuleset.isNull()) + { + return AnnualHourlyValues(optionalScheduleRuleset.get(), openStudioImportContext, label); + } + + global::OpenStudio.OptionalScheduleInterval optionalScheduleInterval = global::OpenStudio.OpenStudioModelResources.toScheduleInterval(schedule); + if (optionalScheduleInterval != null && !optionalScheduleInterval.isNull()) + { + return AnnualHourlyValues(optionalScheduleInterval.get(), openStudioImportContext, label); + } + + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ScheduleUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Schedule type '{0}' cannot be expanded to hourly values and has no SAM equivalent; the load it drives was imported without a profile (no constant was substituted)", IddTypeName(schedule)), label); + openStudioImportContext.RegisterSkip(); + return null; + } + + /// + /// Expands a ScheduleRuleset day by day using OpenStudio's own rule resolution, then + /// samples each day at the end of every hour — the convention EnergyPlus itself uses for + /// an "Until: HH:MM" day schedule, so a 09:00–17:00 occupancy pattern lands on hours 9–17 + /// rather than being shifted by one. + /// + private static double[] AnnualHourlyValues(global::OpenStudio.ScheduleRuleset scheduleRuleset, OpenStudioImportContext openStudioImportContext, string label) + { + global::OpenStudio.ScheduleDayVector scheduleDayVector; + try + { + global::OpenStudio.Date startDate = new global::OpenStudio.Date(new global::OpenStudio.MonthOfYear(1), 1); + global::OpenStudio.Date endDate = new global::OpenStudio.Date(new global::OpenStudio.MonthOfYear(12), 31); + scheduleDayVector = scheduleRuleset.getDaySchedules(startDate, endDate); + } + catch (Exception exception) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ScheduleUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("The schedule ruleset could not be expanded ({0}: {1}); the load it drives was imported without a profile", exception.GetType().Name, exception.Message), label); + openStudioImportContext.RegisterSkip(); + return null; + } + + if (scheduleDayVector == null || scheduleDayVector.Count == 0) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ScheduleUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "The schedule ruleset expanded to no day schedules; the load it drives was imported without a profile", label); + openStudioImportContext.RegisterSkip(); + return null; + } + + double[] result = new double[AnnualHourCount]; + int hour = 0; + + for (int day = 0; day < scheduleDayVector.Count && hour < AnnualHourCount; day++) + { + global::OpenStudio.ScheduleDay scheduleDay = scheduleDayVector[day]; + for (int h = 1; h <= 24 && hour < AnnualHourCount; h++) + { + result[hour] = scheduleDay == null ? 0 : scheduleDay.getValue(new global::OpenStudio.Time(0, h, 0, 0)); + hour++; + } + } + + if (hour < AnnualHourCount) + { + // A 365-day expansion is expected; a shorter one (a ruleset restricted to part of + // the year) is held at its last value rather than dropping to zero, and reported. + double last = hour > 0 ? result[hour - 1] : 0; + for (int i = hour; i < AnnualHourCount; i++) + { + result[i] = last; + } + + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ApproximationApplied, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format(System.Globalization.CultureInfo.InvariantCulture, "The schedule ruleset covers only {0} of {1} hours; the remaining hours were held at the last defined value ({2:G4})", hour, AnnualHourCount, last), label); + } + + return result; + } + + /// + /// Expands a ScheduleInterval from its time series, resampling onto whole-hour boundaries + /// using the series' own reporting interval rather than guessing the cadence from the + /// value count. + /// + /// A fixed-interval series reports its interval, so the mapping is exact: an hourly series + /// maps value-for-hour; a coarser series (a daily value, say) holds each value across + /// every hour it spans — not spread one value per hour, which would turn 365 + /// daily values into a meaningless 1,2,3… ramp over the first days; a sub-hourly series is + /// averaged into hourly means (averaged, not sampled, so a fractional schedule keeps its + /// daily total). Hours outside a partial series use its configured out-of-range value and + /// are reported; leap day is skipped without shifting March-December, as SAM profiles are + /// always 8760 hours. + /// + /// + /// A variable-interval series has no fixed cadence to resample deterministically and has + /// no SAM equivalent; it is reported unsupported (SAM-OSI-SCH-001) and imported without a + /// profile rather than fabricating one, matching the reverse-coverage manifest. + /// + /// + private static double[] AnnualHourlyValues(global::OpenStudio.ScheduleInterval scheduleInterval, OpenStudioImportContext openStudioImportContext, string label) + { + global::OpenStudio.TimeSeries timeSeries; + try + { + timeSeries = scheduleInterval.timeSeries(); + } + catch (Exception) + { + timeSeries = null; + } + + if (timeSeries == null) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ScheduleUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "The interval schedule carries no time series; the load it drives was imported without a profile", label); + openStudioImportContext.RegisterSkip(); + return null; + } + + global::OpenStudio.Vector vector; + try + { + vector = timeSeries.values(); + } + catch (Exception) + { + vector = null; + } + + if (vector == null || vector.size() == 0) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ScheduleUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "The interval schedule's time series is empty; the load it drives was imported without a profile", label); + openStudioImportContext.RegisterSkip(); + return null; + } + + // The reporting interval is what distinguishes a fixed-interval series (which carries + // a value here) from a variable-interval one (which does not). + long intervalSeconds = 0; + try + { + global::OpenStudio.OptionalTime optionalIntervalLength = timeSeries.intervalLength(); + if (optionalIntervalLength != null && !optionalIntervalLength.isNull()) + { + intervalSeconds = optionalIntervalLength.get().totalSeconds(); + } + } + catch (Exception) + { + intervalSeconds = 0; + } + + if (intervalSeconds <= 0) + { + // Variable interval (or an interval that could not be read): no fixed cadence to + // resample. Unsupported by contract - reported, never guessed. + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ScheduleUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "The interval schedule has no fixed reporting interval (a variable-interval schedule); it has no SAM equivalent and the load it drives was imported without a profile", label); + openStudioImportContext.RegisterSkip(); + return null; + } + + // OpenStudio.Vector is the SWIG numeric vector: size()/__getitem__, not Count/[]. + int count = (int)vector.size(); + double[] result = new double[AnnualHourCount]; + + long seriesStartSeconds; + int sourceYear; + int sourceMonth; + int sourceDayOfMonth; + try + { + global::OpenStudio.DateTime startDateTime = timeSeries.startDateTime(); + seriesStartSeconds = startDateTime.toEpoch(); + global::OpenStudio.Date startDate = startDateTime.date(); + sourceYear = startDate.year(); + sourceMonth = startDate.monthOfYear().value(); + sourceDayOfMonth = (int)startDate.dayOfMonth(); + } + catch (Exception exception) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ScheduleUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("The fixed-interval schedule's start date could not be read ({0}: {1}); the load it drives was imported without a profile", exception.GetType().Name, exception.Message), label); + openStudioImportContext.RegisterSkip(); + return null; + } + + long seriesEndSeconds = seriesStartSeconds + (count * intervalSeconds); + double outOfRangeValue = timeSeries.outOfRangeValue(); + try + { + global::OpenStudio.OptionalScheduleFixedInterval optionalScheduleFixedInterval = global::OpenStudio.OpenStudioModelResources.toScheduleFixedInterval(scheduleInterval); + if (optionalScheduleFixedInterval != null && !optionalScheduleFixedInterval.isNull()) + { + outOfRangeValue = optionalScheduleFixedInterval.get().outOfRangeValue(); + } + } + catch (Exception) + { + // The TimeSeries value above is the same default and remains a safe fallback. + } + + global::OpenStudio.Date januaryFirst = new global::OpenStudio.Date(new global::OpenStudio.MonthOfYear(1), 1, sourceYear); + long sourceYearStartSeconds = new global::OpenStudio.DateTime(januaryFirst).toEpoch(); + long nextYearStartSeconds = sourceYearStartSeconds + (System.DateTime.IsLeapYear(sourceYear) ? 366L : 365L) * 24L * 60L * 60L; + bool inferredLeapSeries = !System.DateTime.IsLeapYear(sourceYear) + && sourceMonth == 1 + && sourceDayOfMonth == 1 + && seriesEndSeconds - seriesStartSeconds >= 366L * 24L * 60L * 60L; + long coveredSeconds = 0; + + // SAM's annual index is a non-leap Jan-Dec calendar. Map every canonical month/day + // back to the TimeSeries calendar instead of copying the first 8760 values: that + // skips 29 February without shifting March-December, honours a non-January start, + // and also handles a series that crosses into the following calendar year. + System.DateTime canonicalDate = new System.DateTime(2001, 1, 1); + int resultHour = 0; + for (int day = 0; day < 365; day++) + { + System.DateTime monthAndDay = canonicalDate.AddDays(day); + int sourceDay = new System.DateTime(sourceYear, monthAndDay.Month, monthAndDay.Day).DayOfYear - 1; + if (inferredLeapSeries && monthAndDay.Month > 2) + { + // ScheduleFixedInterval stores month/day but not the year. OpenStudio therefore + // reconstructs an assumed non-leap year even when 366 days of values were set; + // the duration is the remaining evidence that the source included 29 February. + sourceDay++; + } + int nextSourceDay = new System.DateTime(sourceYear + 1, monthAndDay.Month, monthAndDay.Day).DayOfYear - 1; + + for (int hour = 0; hour < 24; hour++) + { + long sourceHourStart = sourceYearStartSeconds + (((sourceDay * 24L) + hour) * 60L * 60L); + long nextSourceHourStart = nextYearStartSeconds + (((nextSourceDay * 24L) + hour) * 60L * 60L); + + long sourceOverlap = OverlapSeconds(sourceHourStart, sourceHourStart + 3600L, seriesStartSeconds, seriesEndSeconds); + long nextSourceOverlap = OverlapSeconds(nextSourceHourStart, nextSourceHourStart + 3600L, seriesStartSeconds, seriesEndSeconds); + long selectedHourStart = nextSourceOverlap > sourceOverlap ? nextSourceHourStart : sourceHourStart; + + result[resultHour++] = AverageFixedIntervalHour(vector, count, intervalSeconds, seriesStartSeconds, seriesEndSeconds, selectedHourStart, outOfRangeValue); + coveredSeconds += Math.Max(sourceOverlap, nextSourceOverlap); + } + } + + if (coveredSeconds < AnnualHourCount * 3600L) + { + double coveredHours = coveredSeconds / 3600.0; + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ApproximationApplied, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format(System.Globalization.CultureInfo.InvariantCulture, "The interval schedule covers {0:G6} of {1} annual hours; its configured out-of-range value ({2:G4}) was used outside that coverage", coveredHours, AnnualHourCount, outOfRangeValue), label); + } + + if (intervalSeconds < 3600L) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ApproximationApplied, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format(System.Globalization.CultureInfo.InvariantCulture, "The sub-hourly interval schedule ({0:G4} h interval) was averaged into hourly means; SAM profiles are hour-indexed and cannot carry the sub-hourly detail", intervalSeconds / 3600.0), label); + } + + return result; + } + + /// Returns the duration shared by two half-open time ranges, in seconds. + private static long OverlapSeconds(long start_1, long end_1, long start_2, long end_2) + { + return Math.Max(0L, Math.Min(end_1, end_2) - Math.Max(start_1, start_2)); + } + + /// + /// Averages the piecewise-constant OpenStudio reporting intervals over one SAM hour. + /// Weighting by overlap (rather than grouping or sampling values) also handles reporting + /// intervals and start times that do not fall on whole-hour boundaries. + /// + private static double AverageFixedIntervalHour(global::OpenStudio.Vector vector, int count, long intervalSeconds, long seriesStartSeconds, long seriesEndSeconds, long hourStartSeconds, double outOfRangeValue) + { + long hourEndSeconds = hourStartSeconds + 3600L; + long cursor = hourStartSeconds; + double weightedValue = 0; + + while (cursor < hourEndSeconds) + { + double value = outOfRangeValue; + long segmentEnd = hourEndSeconds; + + if (cursor < seriesStartSeconds) + { + segmentEnd = Math.Min(segmentEnd, seriesStartSeconds); + } + else if (cursor < seriesEndSeconds) + { + int index = (int)((cursor - seriesStartSeconds) / intervalSeconds); + if (index >= 0 && index < count) + { + value = vector.__getitem__((uint)index); + segmentEnd = Math.Min(segmentEnd, seriesStartSeconds + ((index + 1L) * intervalSeconds)); + } + } + + weightedValue += value * (segmentEnd - cursor); + cursor = segmentEnd; + } + + return weightedValue / 3600.0; + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/ShadingPanels.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/ShadingPanels.cs new file mode 100644 index 0000000..4162662 --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/ShadingPanels.cs @@ -0,0 +1,200 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Convert + { + /// + /// Converts every shading surface in the model into a SAM shade panel + /// (). + /// + /// All three OpenStudio group types are handled — Site, Building and Space — and the + /// transformation chain differs by type: a Space group is nested inside its space, so its + /// vertices need the group transformation *and* the space's building transformation, + /// while Site and Building groups need only their own. Getting this wrong puts every + /// space-attached shade at the model origin, which is why the chain is composed + /// explicitly rather than assumed. + /// + /// + /// The group type and name are recorded on each panel so the grouping survives the import + /// even though SAM has no shading-group concept. + /// + /// + /// Import context. + /// The created shade panels; never null. + public static List ToSAM_ShadingPanels(this OpenStudioImportContext openStudioImportContext) + { + List result = new List(); + + if (openStudioImportContext == null) + { + return result; + } + + global::OpenStudio.ShadingSurfaceGroupVector shadingSurfaceGroupVector; + try + { + shadingSurfaceGroupVector = openStudioImportContext.Source.getShadingSurfaceGroups(); + } + catch (Exception) + { + return result; + } + + if (shadingSurfaceGroupVector == null) + { + return result; + } + + foreach (global::OpenStudio.ShadingSurfaceGroup shadingSurfaceGroup in shadingSurfaceGroupVector) + { + if (shadingSurfaceGroup == null) + { + continue; + } + + string groupType = shadingSurfaceGroup.shadingSurfaceType(); + string groupName = shadingSurfaceGroup.nameString(); + + global::OpenStudio.Transformation transformation = ShadingTransformation(shadingSurfaceGroup); + + if (shadingSurfaceGroup.shadedSurface() != null && !shadingSurfaceGroup.shadedSurface().isNull() + && openStudioImportContext.RegisterOnce("SAM-OSI-APX-001:ShadedSurface:" + groupName)) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ApproximationApplied, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, string.Format("Shading group '{0}' declares a shaded surface; SAM shade panels are free-standing, so the association is kept as metadata only and has no effect on SAM shading calculations", groupName), OpenStudioImportContext.OpenStudioObjectLabel(shadingSurfaceGroup)); + } + + global::OpenStudio.ShadingSurfaceVector shadingSurfaceVector = shadingSurfaceGroup.shadingSurfaces(); + if (shadingSurfaceVector == null) + { + continue; + } + + foreach (global::OpenStudio.ShadingSurface shadingSurface in shadingSurfaceVector) + { + Panel panel = shadingSurface.ToSAM(groupType, groupName, transformation, openStudioImportContext); + if (panel != null) + { + result.Add(panel); + } + } + } + + return result; + } + + /// + /// Composes the group → model transformation for a shading surface group. A Space group's + /// vertices are relative to the group, which is itself relative to the space, so the + /// space's building transformation must be applied on top; Site and Building groups are + /// already relative to the building. + /// + private static global::OpenStudio.Transformation ShadingTransformation(global::OpenStudio.ShadingSurfaceGroup shadingSurfaceGroup) + { + global::OpenStudio.Transformation transformation = shadingSurfaceGroup.transformation(); + + global::OpenStudio.OptionalSpace optionalSpace = shadingSurfaceGroup.space(); + if (optionalSpace != null && !optionalSpace.isNull()) + { + global::OpenStudio.Transformation spaceTransformation = optionalSpace.get().buildingTransformation(); + if (spaceTransformation != null && transformation != null) + { + return spaceTransformation.Multiply(transformation); + } + } + + return transformation; + } + + /// + /// Converts one OpenStudio ShadingSurface into a SAM shade panel. + /// + /// OpenStudio shading surface; null returns null. + /// Shading group type ("Site", "Building" or "Space"). + /// Shading group name. + /// Composed group → model transformation. + /// Import context. + /// The created shade panel, or null. + public static Panel ToSAM(this global::OpenStudio.ShadingSurface shadingSurface, string groupType, string groupName, global::OpenStudio.Transformation transformation, OpenStudioImportContext openStudioImportContext) + { + if (shadingSurface == null || openStudioImportContext == null) + { + return null; + } + + string label = OpenStudioImportContext.OpenStudioObjectLabel(shadingSurface); + + List diagnostics; + Geometry.Spatial.Face3D face3D = Geometry.OpenStudio.Convert.ToSAM(shadingSurface, openStudioImportContext.Options.DistanceTolerance, openStudioImportContext.Options.AngleTolerance, openStudioImportContext.Options.MinimumArea, out diagnostics, transformation); + + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in diagnostics) + { + openStudioImportContext.AddDiagnostic(diagnostic.Code, diagnostic.Severity, diagnostic.Message, label); + } + + if (face3D == null) + { + openStudioImportContext.RegisterSkip(); + return null; + } + + string constructionName = null; + global::OpenStudio.OptionalConstructionBase optionalConstructionBase = shadingSurface.construction(); + if (optionalConstructionBase != null && !optionalConstructionBase.isNull()) + { + constructionName = optionalConstructionBase.get().nameString(); + } + + if (string.IsNullOrWhiteSpace(constructionName)) + { + constructionName = "Unassigned_Shade"; + } + + Construction construction; + if (!openStudioImportContext.ConstructionMap.TryGetValue(constructionName, out construction)) + { + construction = new Construction(constructionName); + openStudioImportContext.ConstructionMap[constructionName] = construction; + } + + Panel result; + try + { + result = Analytical.Create.Panel(construction, PanelType.Shade, face3D); + } + catch (Exception exception) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.GeometryInvalid, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("The SAM shade panel could not be created ({0}: {1})", exception.GetType().Name, exception.Message), label); + openStudioImportContext.RegisterSkip(); + return null; + } + + if (result == null) + { + return null; + } + + Guid guid = openStudioImportContext.ResolveGuid(shadingSurface, typeof(Panel).Name); + result = Analytical.Create.Panel(guid, result); + + Modify.SetOpenStudioSource(result, shadingSurface); + + if (!string.IsNullOrWhiteSpace(groupType)) + { + result.SetValue(OpenStudioSourceParameter.ShadingGroupType, groupType); + } + + if (!string.IsNullOrWhiteSpace(groupName)) + { + result.SetValue(OpenStudioSourceParameter.ShadingGroupName, groupName); + } + + openStudioImportContext.RegisterCreated(); + return result; + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/SimulationResults.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/SimulationResults.cs new file mode 100644 index 0000000..85b273b --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/SimulationResults.cs @@ -0,0 +1,233 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Collections.Generic; + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Convert + { + /// + /// Maps an engine-neutral result set to a SAM AnalyticalModelSimulationResult (C5): + /// annual heating/cooling consumption [kWh], coincident peak loads [kW] with their + /// hour-of-year, and the model floor area/volume derived from the source model. + /// + /// Extracted result set. + /// Source model (floor area/volume derivation); may be null. + /// The SAM result, or null when the result set is null. + public static AnalyticalModelSimulationResult ToSAM(this OpenStudioSimulationResultSet openStudioSimulationResultSet, AnalyticalModel analyticalModel) + { + if (openStudioSimulationResultSet == null) + { + return null; + } + + AnalyticalModelSimulationResult result = new AnalyticalModelSimulationResult(analyticalModel?.Name, Query.Source(), analyticalModel?.Guid.ToString("N")); + result.SetValue(AnalyticalModelSimulationResultParameter.ConsumptionHeating, openStudioSimulationResultSet.TotalAnnualHeating); + result.SetValue(AnalyticalModelSimulationResultParameter.ConsumptionCooling, openStudioSimulationResultSet.TotalAnnualCooling); + result.SetValue(AnalyticalModelSimulationResultParameter.PeakHeatingLoad, openStudioSimulationResultSet.PeakHeatingLoadTotal); + result.SetValue(AnalyticalModelSimulationResultParameter.PeakHeatingHour, openStudioSimulationResultSet.PeakHeatingHourTotal); + result.SetValue(AnalyticalModelSimulationResultParameter.PeakCoolingLoad, openStudioSimulationResultSet.PeakCoolingLoadTotal); + result.SetValue(AnalyticalModelSimulationResultParameter.PeakCoolingHour, openStudioSimulationResultSet.PeakCoolingHourTotal); + + AdjacencyCluster adjacencyCluster = analyticalModel?.AdjacencyCluster; + if (adjacencyCluster != null) + { + double floorArea = 0; + double volume = 0; + List spaces = adjacencyCluster.GetSpaces(); + if (spaces != null) + { + foreach (Space space in spaces) + { + if (space == null) + { + continue; + } + + if (space.TryGetValue(SpaceParameter.Area, out double area) && !double.IsNaN(area)) + { + floorArea += area; + } + + if (space.TryGetValue(SpaceParameter.Volume, out double spaceVolume) && !double.IsNaN(spaceVolume)) + { + volume += spaceVolume; + } + } + } + + result.SetValue(AnalyticalModelSimulationResultParameter.FloorArea, floorArea); + result.SetValue(AnalyticalModelSimulationResultParameter.Volume, volume); + } + + return result; + } + + /// + /// Maps an engine-neutral result set to per-space SAM SpaceSimulationResults (C5), one + /// per load type (Heating/Cooling, matching the established SAM per-LoadType pattern): + /// peak load [W] with its hour-of-year and the setpoint not-met hours. Energy and peak + /// dictionaries key on the Ideal Loads system name; unmet-hour dictionaries key on the + /// ThermalZone name — both are reconstructed deterministically per SAM space + /// (SAM_<type>_<space>_<guid8>, uppercased by EnergyPlus). A zone that + /// matches no space is reported in the result's source string count, never silently + /// merged. + /// + /// Extracted result set. + /// Source model providing the spaces; may be null (keys then stay unmapped). + /// Per-space results (possibly empty), or null when the result set is null. + public static List ToSAM_SpaceSimulationResults(this OpenStudioSimulationResultSet openStudioSimulationResultSet, AnalyticalModel analyticalModel) + { + if (openStudioSimulationResultSet == null) + { + return null; + } + + return ToSAM_SpaceSimulationResults(openStudioSimulationResultSet, analyticalModel?.AdjacencyCluster?.GetSpaces()); + } + + /// + /// Maps an engine-neutral result set to per-space SAM SpaceSimulationResults, one per + /// load type (Heating/Cooling), for the given spaces. Zones that match no space are + /// reported keyed-but-unmapped only when is null. + /// + /// Extracted result set. + /// Spaces to map zone keys onto; null emits unmapped results per zone key. + /// Per-space results (possibly empty), or null when the result set is null. + public static List ToSAM_SpaceSimulationResults(this OpenStudioSimulationResultSet openStudioSimulationResultSet, IEnumerable spaces) + { + if (openStudioSimulationResultSet == null) + { + return null; + } + + string source = Query.Source(); + List result = new List(); + + if (spaces == null) + { + // No source model: emit keyed-but-unmapped results per energy zone key. + HashSet zoneKeys = new HashSet(openStudioSimulationResultSet.AnnualHeatingEnergy.Keys, System.StringComparer.OrdinalIgnoreCase); + zoneKeys.UnionWith(openStudioSimulationResultSet.AnnualCoolingEnergy.Keys); + foreach (string zoneKey in zoneKeys) + { + AddLoadTypeResult(result, zoneKey, zoneKey, zoneKey, source, LoadType.Heating, openStudioSimulationResultSet.PeakHeatingLoad, openStudioSimulationResultSet.PeakHeatingHour, null); + AddLoadTypeResult(result, zoneKey, zoneKey, zoneKey, source, LoadType.Cooling, openStudioSimulationResultSet.PeakCoolingLoad, openStudioSimulationResultSet.PeakCoolingHour, null); + } + + return result; + } + + foreach (Space space in spaces) + { + if (space == null) + { + continue; + } + + string idealLoadsKey = Core.OpenStudio.Query.OpenStudioName("IdealLoads", space.Name, space.Guid); + if (!ContainsKey(openStudioSimulationResultSet.AnnualHeatingEnergy, idealLoadsKey) && !ContainsKey(openStudioSimulationResultSet.AnnualCoolingEnergy, idealLoadsKey)) + { + continue; + } + + string reference = space.Guid.ToString("N"); + + AddLoadTypeResult(result, idealLoadsKey, space.Name, reference, source, LoadType.Heating, openStudioSimulationResultSet.PeakHeatingLoad, openStudioSimulationResultSet.PeakHeatingHour, UnmetForZone(openStudioSimulationResultSet.UnmetHeatingHours, idealLoadsKey)); + AddLoadTypeResult(result, idealLoadsKey, space.Name, reference, source, LoadType.Cooling, openStudioSimulationResultSet.PeakCoolingLoad, openStudioSimulationResultSet.PeakCoolingHour, UnmetForZone(openStudioSimulationResultSet.UnmetCoolingHours, idealLoadsKey)); + } + + return result; + } + + private static bool ContainsKey(IReadOnlyDictionary dictionary, string key) + { + double value; + return TryGetValue(dictionary, key, out value); + } + + private static bool TryGetValue(IReadOnlyDictionary dictionary, string key, out double value) + { + value = 0; + if (dictionary == null || key == null) + { + return false; + } + + if (dictionary.TryGetValue(key, out value)) + { + return true; + } + + // EnergyPlus uppercases report keys; the deterministic SAM names are mixed case. + foreach (KeyValuePair keyValuePair in dictionary) + { + if (string.Equals(keyValuePair.Key, key, System.StringComparison.OrdinalIgnoreCase)) + { + value = keyValuePair.Value; + return true; + } + } + + return false; + } + + private static bool TryGetValue(IReadOnlyDictionary dictionary, string key, out int value) + { + value = -1; + if (dictionary == null || key == null) + { + return false; + } + + if (dictionary.TryGetValue(key, out value)) + { + return true; + } + + foreach (KeyValuePair keyValuePair in dictionary) + { + if (string.Equals(keyValuePair.Key, key, System.StringComparison.OrdinalIgnoreCase)) + { + value = keyValuePair.Value; + return true; + } + } + + return false; + } + + private static double? UnmetForZone(IReadOnlyDictionary unmetHours, string thermalZoneKey) + { + double unmet; + return TryGetValue(unmetHours, thermalZoneKey, out unmet) ? unmet : (double?)null; + } + + private static void AddLoadTypeResult(List results, string zoneKey, string spaceName, string reference, string source, LoadType loadType, IReadOnlyDictionary peakLoads, IReadOnlyDictionary peakHours, double? unmetHours) + { + double peakLoadKilowatts; + if (!TryGetValue(peakLoads, zoneKey, out peakLoadKilowatts)) + { + return; + } + + SpaceSimulationResult spaceSimulationResult = new SpaceSimulationResult(spaceName, source, reference); + spaceSimulationResult.SetValue(Analytical.SpaceSimulationResultParameter.LoadType, loadType.ToString()); + spaceSimulationResult.SetValue(Analytical.SpaceSimulationResultParameter.Load, peakLoadKilowatts * 1000.0); + + int peakHour; + if (TryGetValue(peakHours, zoneKey, out peakHour)) + { + spaceSimulationResult.SetValue(Analytical.SpaceSimulationResultParameter.LoadIndex, peakHour); + } + + if (unmetHours.HasValue) + { + spaceSimulationResult.SetValue(Analytical.SpaceSimulationResultParameter.UnmetHours, unmetHours.Value); + } + + results.Add(spaceSimulationResult); + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/Space.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/Space.cs new file mode 100644 index 0000000..439b26e --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/Space.cs @@ -0,0 +1,209 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; +using SAM.Geometry.Spatial; + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Convert + { + /// + /// Converts an OpenStudio Space into a SAM Space. + /// + /// One OpenStudio space becomes exactly one SAM space, even when several share a + /// ThermalZone. Collapsing them would merge distinct geometry into a single shell and + /// silently lose rooms; the shared zone is instead recorded on each space + /// () so the controls pass can + /// apply the zone's thermostat to all of them. + /// + /// + /// Area, volume and the internal point are derived from the space's own closed shell, + /// built from the surfaces the caller already converted, rather than from + /// Space.floorArea()/volume(): those are autocalculated by OpenStudio from + /// the same surfaces but include multipliers and autocalculation fallbacks that would not + /// match the SAM geometry actually imported. The OpenStudio values are used only when the + /// shell cannot be built. + /// + /// + /// OpenStudio space; null returns null. + /// Faces of the converted panels bounding this space; may be null. + /// Import context. + /// The created SAM space, or null. + public static Space ToSAM(this global::OpenStudio.Space space, IEnumerable face3Ds, OpenStudioImportContext openStudioImportContext) + { + if (space == null || openStudioImportContext == null) + { + return null; + } + + string label = OpenStudioImportContext.OpenStudioObjectLabel(space); + + string name; + if (!Core.OpenStudio.Query.TryGetSAMName(space, out name) || string.IsNullOrWhiteSpace(name)) + { + name = space.nameString(); + } + + Point3D location = null; + double area = double.NaN; + double volume = double.NaN; + + List faces = face3Ds == null ? null : new List(face3Ds); + if (faces != null && faces.Count >= 4) + { + try + { + Shell shell = new Shell(faces); + if (shell != null) + { + // MacroDistance, not the raw distance tolerance: real exported geometry + // closes at the millimetre, not the micron, so InternalPoint3D at 1e-6 m + // fails on almost every real space (the shell is not watertight there). + // The forward direction uses MacroDistance for the same shell operations. + double tolerance = Core.Tolerance.MacroDistance; + + location = shell.InternalPoint3D(Core.Tolerance.MacroDistance, tolerance); + if (location == null) + { + location = Geometry.Spatial.Query.CalculatedInternalPoint3D(shell, Core.Tolerance.MacroDistance, tolerance); + } + + area = Geometry.Spatial.Query.Area(shell, 0.1); + volume = Geometry.Spatial.Query.Volume(shell); + } + } + catch (Exception exception) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ZoneIncomplete, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("The space shell could not be built from its surfaces ({0}); area, volume and the internal point fall back to the OpenStudio values", exception.GetType().Name), label); + } + } + + if (location == null) + { + // The shell would not close (non-manifold or slightly open exported geometry). + // A space with no location loses its identity point for every downstream + // space-in-point query and label, so the vertex centroid is used instead of + // leaving it null. The centroid is not guaranteed inside a concave space, so it + // is reported as the approximation it is — but an approximate point beats none. + location = VertexCentroid(faces); + if (location != null) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ApproximationApplied, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("The space shell would not close from its {0} bounding face(s); its SAM location was set to the vertex centroid (approximate, may fall outside a concave space) and area/volume come from OpenStudio where available", faces?.Count ?? 0), label); + } + else + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ZoneIncomplete, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("The space has no usable geometry ({0} bounding face(s)); its SAM location is not set and area/volume come from OpenStudio where available", faces?.Count ?? 0), label); + } + } + + if (double.IsNaN(area)) + { + // floorArea is exposed as a property by the SWIG wrapper (volume as a method). + area = TryGetDouble(() => space.floorArea); + } + + if (double.IsNaN(volume)) + { + volume = TryGetDouble(() => space.volume()); + } + + Guid guid = openStudioImportContext.ResolveGuid(space, typeof(Space).Name); + Space result = new Space(guid, name, location); + + if (!double.IsNaN(area) && area > 0) + { + result.SetValue(SpaceParameter.Area, area); + } + + if (!double.IsNaN(volume) && volume > 0) + { + result.SetValue(SpaceParameter.Volume, volume); + } + + global::OpenStudio.OptionalBuildingStory optionalBuildingStory = space.buildingStory(); + if (optionalBuildingStory != null && !optionalBuildingStory.isNull()) + { + result.SetValue(SpaceParameter.LevelName, optionalBuildingStory.get().nameString()); + } + + global::OpenStudio.OptionalThermalZone optionalThermalZone = space.thermalZone(); + if (optionalThermalZone == null || optionalThermalZone.isNull()) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ZoneIncomplete, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "The space belongs to no thermal zone; no setpoints or conditioning state could be imported for it", label, result); + } + else + { + global::OpenStudio.ThermalZone thermalZone = optionalThermalZone.get(); + result.SetValue(OpenStudioSourceParameter.ThermalZoneName, thermalZone.nameString()); + + global::OpenStudio.SpaceVector spaceVector = thermalZone.spaces(); + if (spaceVector != null && spaceVector.Count > 1 && openStudioImportContext.RegisterOnce("SAM-OSI-ZONE-001:" + thermalZone.nameString())) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ZoneMultiSpace, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, string.Format("ThermalZone '{0}' contains {1} spaces; each becomes its own SAM space (geometry is never merged) and they share the zone's setpoints and conditioning state", thermalZone.nameString(), spaceVector.Count), label, result); + } + } + + Modify.SetOpenStudioSource(result, space); + + openStudioImportContext.RegisterCreated(); + return result; + } + + /// + /// Centroid of every vertex of the space's bounding faces — the last-resort space + /// location when no closed shell can be formed. Averaging all boundary vertices gives a + /// point near the space's centre of mass; it is not guaranteed inside a concave space, + /// which is why the caller reports it as approximate. + /// + private static Point3D VertexCentroid(List faces) + { + if (faces == null || faces.Count == 0) + { + return null; + } + + List point3Ds = new List(); + foreach (Face3D face3D in faces) + { + Geometry.Spatial.ISegmentable3D segmentable3D = face3D?.GetExternalEdge3D() as Geometry.Spatial.ISegmentable3D; + List facePoints = segmentable3D?.GetPoints(); + if (facePoints != null) + { + point3Ds.AddRange(facePoints); + } + } + + if (point3Ds.Count == 0) + { + return null; + } + + try + { + return Geometry.Spatial.Query.Centroid(point3Ds); + } + catch (Exception) + { + return null; + } + } + + /// + /// Evaluates a native double accessor, returning NaN when it throws. Used for + /// autocalculated OpenStudio quantities that can fail on an incomplete model. + /// + private static double TryGetDouble(Func accessor) + { + try + { + return accessor(); + } + catch (Exception) + { + return double.NaN; + } + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/SpaceDesignLoadResults.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/SpaceDesignLoadResults.cs new file mode 100644 index 0000000..d70c99c --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/SpaceDesignLoadResults.cs @@ -0,0 +1,188 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Convert + { + /// + /// Maps the run's zone sizing outcomes (, + /// read from the SQL ZoneSizes table) onto SAM s + /// carrying , one per space and + /// load type. These are SIZING results and are deliberately separate from the annual results + /// produced by : + /// this mapping never writes Load or LoadIndex, so an annual simulated peak can + /// never be relabelled as a design load. + /// + /// + /// + /// populates the design load — the + /// unaltered thermal load EnergyPlus calculated from the design-day weather and schedules, as the + /// result contract in docs/SAM_OPENSTUDIO_ANALYTICAL_COVERAGE.md specifies. + /// is deliberately NOT emitted: it is the + /// capacity after sizing factors, so emitting it would fold a user-configured margin into a + /// cross-engine comparison — on the HungaryHouse run a 1.25 heating factor made every UserDesLoad + /// exactly 25% above the calculated load. It stays on the result set, with the design flows, for + /// the sizing-capacity audit, and may later become a metric of its own. + /// + /// + /// Identity: ZoneSizes.ZoneName is the EnergyPlus ThermalZone name, so spaces are matched + /// on Core.OpenStudio.Query.OpenStudioName("ThermalZone", …) — NOT the Ideal Loads key the + /// annual dictionaries use. Heating and cooling are matched independently: a zone sized for + /// heating only yields a heating design load and nothing for cooling. A row with no + /// CalcDesLoad yields no result, so a missing design load stays unavailable and is never + /// reported as a zero — nor does it fall back to UserDesLoad. A genuine sized zero IS + /// emitted as an available zero. + /// + /// + /// Result set carrying the zone sizing rows. + /// Source SAM spaces to map onto; null yields an empty list. + /// Design-load results, ordered by space then load type; never null. + public static List ToSAM_SpaceDesignLoadResults(this OpenStudioSimulationResultSet openStudioSimulationResultSet, IEnumerable spaces) + { + return ToSAM_SpaceDesignLoadResults(openStudioSimulationResultSet, spaces, out List diagnostics); + } + + /// + /// As , + /// additionally reporting what could not be mapped: EnergyPlus sizing rows matching no source + /// space, and duplicate (ZoneName, LoadType) rows. Both are silent data loss otherwise. + /// + /// Result set carrying the zone sizing rows. + /// Source SAM spaces to map onto; null yields an empty list. + /// Unmatched-zone and duplicate-row diagnostics; never null. + public static List ToSAM_SpaceDesignLoadResults(this OpenStudioSimulationResultSet openStudioSimulationResultSet, IEnumerable spaces, out List diagnostics) + { + diagnostics = new List(); + List result = new List(); + if (openStudioSimulationResultSet?.ZoneSizing == null || openStudioSimulationResultSet.ZoneSizing.Count == 0 || spaces == null) + { + return result; + } + + // Index the sizing rows by zone name + load type. A duplicate pair is a contract surprise + // (EnergyPlus writes one row per zone/load type): the FIRST row in the result set's + // deterministic order wins and the collision is named, rather than one being picked + // silently or the pair being dropped. + var byKey = new Dictionary(StringComparer.OrdinalIgnoreCase); + foreach (OpenStudioZoneSizingResult zoneSizingResult in openStudioSimulationResultSet.ZoneSizing) + { + if (zoneSizingResult == null || string.IsNullOrWhiteSpace(zoneSizingResult.ZoneName)) + { + continue; + } + + string key = zoneSizingResult.Key; + if (byKey.TryGetValue(key, out OpenStudioZoneSizingResult existing)) + { + diagnostics.Add(new Core.OpenStudio.OpenStudioDiagnostic( + Core.OpenStudio.OpenStudioDiagnosticCodes.ResultExtractionLimitation, + Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, + string.Format(System.Globalization.CultureInfo.InvariantCulture, "Duplicate zone sizing row for zone '{0}' load type '{1}': the first row (design load {2}) is used and the later one (design load {3}) is ignored", zoneSizingResult.ZoneName, zoneSizingResult.LoadType, Text(existing.CalculatedDesignLoad), Text(zoneSizingResult.CalculatedDesignLoad)), + openStudioObjectName: zoneSizingResult.ZoneName)); + continue; + } + + byKey[key] = zoneSizingResult; + } + + var matchedKeys = new HashSet(StringComparer.OrdinalIgnoreCase); + foreach (Space space in spaces) + { + if (space == null) + { + continue; + } + + string thermalZoneName = Core.OpenStudio.Query.OpenStudioName("ThermalZone", space.Name, space.Guid); + string reference = space.Guid.ToString("N"); + + AddDesignLoadResult(result, matchedKeys, byKey, thermalZoneName, space.Name, reference, LoadType.Heating); + AddDesignLoadResult(result, matchedKeys, byKey, thermalZoneName, space.Name, reference, LoadType.Cooling); + } + + // Sizing rows that belong to no source space: the model and the engine disagree about zone + // identity, which would otherwise silently lose a design load. + foreach (KeyValuePair keyValuePair in byKey) + { + if (matchedKeys.Contains(keyValuePair.Key)) + { + continue; + } + + diagnostics.Add(new Core.OpenStudio.OpenStudioDiagnostic( + Core.OpenStudio.OpenStudioDiagnosticCodes.ResultExtractionLimitation, + Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, + string.Format("EnergyPlus reported a {0} zone sizing result for zone '{1}', which matches no source SAM space; its design load is not mapped", keyValuePair.Value.LoadType, keyValuePair.Value.ZoneName), + openStudioObjectName: keyValuePair.Value.ZoneName)); + } + + return result; + } + + private static void AddDesignLoadResult( + List result, + HashSet matchedKeys, + Dictionary byKey, + string thermalZoneName, + string spaceName, + string reference, + LoadType loadType) + { + string key = thermalZoneName + "|" + loadType.ToString(); + if (!byKey.TryGetValue(key, out OpenStudioZoneSizingResult zoneSizingResult)) + { + return; + } + + matchedKeys.Add(key); + + // No sized load for this zone/load type: leave it unavailable. A sized ZERO is a real + // result and IS emitted (double? distinguishes the two). + if (!zoneSizingResult.CalculatedDesignLoad.HasValue) + { + return; + } + + SpaceSimulationResult spaceSimulationResult = new SpaceSimulationResult(spaceName, Query.Source(), reference); + + // LoadType is written as text, exactly as the annual mapping does, so both result families + // are selected by the same predicate downstream. + spaceSimulationResult.SetValue(Analytical.SpaceSimulationResultParameter.LoadType, loadType.ToString()); + spaceSimulationResult.SetValue(Analytical.SpaceSimulationResultParameter.DesignLoad, zoneSizingResult.CalculatedDesignLoad.Value); + spaceSimulationResult.SetValue(SpaceSimulationResultParameter.ZoneName, zoneSizingResult.ZoneName); + + if (!string.IsNullOrWhiteSpace(zoneSizingResult.DesignDayName)) + { + spaceSimulationResult.SetValue(SpaceSimulationResultParameter.DesignDayName, zoneSizingResult.DesignDayName); + } + + // ZoneSizes.PeakTemp is deliberately NOT written to DesignDayTemperature. Its scope is not + // settled: the EnergyPlus engineering reference describes the zone sizing peak temperature as + // a ZONE value (ZoneTempAtHeatPeak/ZoneTempAtCoolPeak), while on a real run here every row + // carried -3.20000004768372, bit-identical to the design day's OUTDOOR maximum dry bulb. + // Writing an unsettled value into a parameter that names it an outdoor design-day temperature + // would be exactly the silent relabelling this mapping exists to avoid, so the value stays on + // OpenStudioZoneSizingResult verbatim for the design-day audit to interpret. + + if (!string.IsNullOrWhiteSpace(zoneSizingResult.PeakTime)) + { + Core.OpenStudio.ShortDateTime shortDateTime = Core.OpenStudio.Create.ShortDateTime(zoneSizingResult.PeakTime); + if (shortDateTime != null) + { + spaceSimulationResult.SetValue(SpaceSimulationResultParameter.PeakDate, shortDateTime); + } + } + + result.Add(spaceSimulationResult); + } + + private static string Text(double? value) + { + return value.HasValue ? value.Value.ToString(System.Globalization.CultureInfo.InvariantCulture) : "unavailable"; + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/SpaceSimulationResults.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/SpaceSimulationResults.cs index 7ef7975..81deea3 100644 --- a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/SpaceSimulationResults.cs +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/SpaceSimulationResults.cs @@ -1,4 +1,7 @@ -using System.Collections.Generic; +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Collections.Generic; using System.Data; namespace SAM.Analytical.OpenStudio @@ -57,7 +60,13 @@ public static List ToSAM_SpaceSimulationResult(this DataT } SpaceSimulationResult spaceSimulationResult = new SpaceSimulationResult(zoneName, source, zoneIndex.ToString()); - + + // The engine-zone identity is kept as parameters as well: Modify.AddResults + // replaces Reference with the matched SAM Space Guid so results map back to the + // model, and the SQL zone identity must survive that. + spaceSimulationResult.SetValue(SpaceSimulationResultParameter.ZoneIndex, zoneIndex); + spaceSimulationResult.SetValue(SpaceSimulationResultParameter.ZoneName, zoneName); + if(index_FloorArea != -1 && Core.Query.TryConvert(values[index_FloorArea], out double floorArea)) { spaceSimulationResult.SetValue(Analytical.SpaceSimulationResultParameter.Area, floorArea); diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Create/DesignDays.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Create/DesignDays.cs index 2a46fea..633b430 100644 --- a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Create/DesignDays.cs +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Create/DesignDays.cs @@ -1,4 +1,7 @@ -using System; +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; using System.Collections.Generic; using System.Data; using System.Data.SQLite; @@ -9,6 +12,26 @@ public static partial class Create { public static List DesignDays(this string path) { + return DesignDays(path, out _); + } + + /// + /// Reads the design-day environments of an EnergyPlus SQLite output into SAM hourly + /// DesignDay objects. Annual weather-run environments (EnvironmentType 3) are not + /// design days and are skipped when the schema carries the type column. Raw SQL + /// timestamps (hour 0–24, minute 0–60, year 0 on sizing environments) are normalised + /// through the central helper — + /// malformed rows are skipped and reported through , + /// never thrown as unrepresentable-DateTime exceptions. Each day is classified + /// heating/cooling from its environment name (Htg/Clg). + /// + /// EnergyPlus SQLite output path. + /// Structured per-environment/per-row diagnostics; empty when everything read cleanly. + /// The design days (possibly empty), or null when the file does not exist. + public static List DesignDays(this string path, out List diagnostics) + { + diagnostics = new List(); + if (string.IsNullOrWhiteSpace(path) || !System.IO.File.Exists(path)) { return null; @@ -17,16 +40,23 @@ public static List DesignDays(this string path) List result = null; using (SQLiteConnection sQLiteConnection = Core.SQLite.Create.SQLiteConnection(path)) { - DataTable dataTable_EnvironmentPeriods = Core.SQLite.Query.DataTable(sQLiteConnection, "EnvironmentPeriods", "EnvironmentPeriodIndex", "EnvironmentName"); + DataTable dataTable_EnvironmentPeriods = Core.SQLite.Query.DataTable(sQLiteConnection, "EnvironmentPeriods", "EnvironmentPeriodIndex", "EnvironmentName", "EnvironmentType"); DataTable dataTable_ReportDataDictionary = Core.SQLite.Query.DataTable(sQLiteConnection, "ReportDataDictionary", "ReportDataDictionaryIndex", "KeyValue", "Name", "Units"); DataTable dataTable_Time = Core.SQLite.Query.DataTable(sQLiteConnection, "Time", "TimeIndex", "Year", "Month", "Day", "Hour", "Minute", "Dst", "EnvironmentPeriodIndex"); DataTable dataTable_ReportData = Core.SQLite.Query.DataTable(sQLiteConnection, "ReportData", "ReportDataDictionaryIndex", "TimeIndex", "Value"); + if (dataTable_EnvironmentPeriods == null || dataTable_ReportDataDictionary == null || dataTable_Time == null || dataTable_ReportData == null) + { + diagnostics.Add("The SQL output misses one or more required tables (EnvironmentPeriods, ReportDataDictionary, Time, ReportData)"); + return new List(); + } + + int index_EnvironmentType = dataTable_EnvironmentPeriods.Columns.IndexOf("EnvironmentType"); result = new List(); - foreach(DataRow dataRow in dataTable_EnvironmentPeriods.Rows) + foreach (DataRow dataRow in dataTable_EnvironmentPeriods.Rows) { - if(!Core.Query.TryConvert(dataRow["EnvironmentName"], out string environmentName)) + if (!Core.Query.TryConvert(dataRow["EnvironmentName"], out string environmentName)) { continue; } @@ -36,22 +66,54 @@ public static List DesignDays(this string path) continue; } - SortedDictionary timeIndexDictionary = Core.OpenStudio.Query.TimeIndexDictionary(dataTable_Time, environmentPeriodIndex); + if (index_EnvironmentType != -1 && Core.Query.TryConvert(dataRow[index_EnvironmentType], out int environmentType) && environmentType == 3) + { + // A weather-run period is an annual environment, not a design day. + continue; + } + + List diagnostics_Timestamps = new List(); + SortedDictionary timeIndexDictionary = Core.OpenStudio.Query.TimeIndexDictionary(dataTable_Time, environmentPeriodIndex, 2017, diagnostics_Timestamps); + if (diagnostics_Timestamps.Count != 0) + { + diagnostics.Add(string.Format("{0}: {1} malformed Time row(s) skipped, first: {2}", environmentName, diagnostics_Timestamps.Count, diagnostics_Timestamps[0])); + } + List> tuples = new List>(); - foreach(KeyValuePair keyValuePair in timeIndexDictionary) + foreach (KeyValuePair keyValuePair in timeIndexDictionary) { tuples.Add(new Tuple(keyValuePair.Key, keyValuePair.Value)); } - if(tuples.Count == 0) + if (tuples.Count == 0) { + diagnostics.Add(string.Format("{0}: no usable Time rows", environmentName)); continue; } tuples.Sort((x, y) => x.Item2.CompareTo(y.Item2)); - DesignDay designDay = new DesignDay(environmentName, System.Convert.ToInt16(tuples[0].Item2.Year), System.Convert.ToByte(tuples[0].Item2.Month), System.Convert.ToByte(tuples[0].Item2.Day)); + DateTime date = tuples[0].Item2.Date; + DesignDay designDay = new DesignDay(environmentName, (short)date.Year, (byte)date.Month, (byte)date.Day); + + LoadType loadType = LoadType.Undefined; + if (environmentName.IndexOf("htg", StringComparison.OrdinalIgnoreCase) >= 0 || environmentName.IndexOf("heating", StringComparison.OrdinalIgnoreCase) >= 0) + { + loadType = LoadType.Heating; + } + else if (environmentName.IndexOf("clg", StringComparison.OrdinalIgnoreCase) >= 0 || environmentName.IndexOf("cooling", StringComparison.OrdinalIgnoreCase) >= 0) + { + loadType = LoadType.Cooling; + } + + if (loadType != LoadType.Undefined) + { + designDay = new DesignDay(designDay, loadType); + } + // Hourly index of each interval within its day: end-of-interval timestamps + // map onto 0–23 by stepping one tick back into the interval (01:00 → 0, + // 24:00 → 23, sub-hourly rows onto their containing hour). int reportDataDictionaryIndex = -1; List> tuples_WeatherDataType = new List>(); @@ -63,32 +125,60 @@ public static List DesignDays(this string path) tuples_WeatherDataType.Add(new Tuple(Weather.WeatherDataType.RelativeHumidity, "Site Outdoor Air Relative Humidity")); tuples_WeatherDataType.Add(new Tuple(Weather.WeatherDataType.DryBulbTemperature, "Site Outdoor Air Drybulb Temperature")); - foreach(Tuple tuple in tuples_WeatherDataType) + foreach (Tuple tuple in tuples_WeatherDataType) { double factor = 1; - if(tuple.Item1 == Weather.WeatherDataType.CloudCover) + if (tuple.Item1 == Weather.WeatherDataType.CloudCover) { factor = 10; } - + reportDataDictionaryIndex = Core.OpenStudio.Query.ReportDataDictionaryIndex(dataTable_ReportDataDictionary, tuple.Item2, "Environment"); - if (reportDataDictionaryIndex != -1) + if (reportDataDictionaryIndex == -1) + { + continue; + } + + SortedDictionary reportDataDictionary = Core.OpenStudio.Query.ReportDataDictionary(dataTable_ReportData, reportDataDictionaryIndex); + if (reportDataDictionary == null) + { + continue; + } + + foreach (Tuple tuple_Time in tuples) { - SortedDictionary reportDataDictionary = Core.OpenStudio.Query.ReportDataDictionary(dataTable_ReportData, reportDataDictionaryIndex); - for (int j = 0; j < tuples.Count; j++) + // Interval-start semantics: the 24:00 row ends the design day even + // though its interval-end timestamp rolls to the next calendar date. + if (tuple_Time.Item2.AddTicks(-1).Date != date) { - designDay[tuple.Item1, j] = reportDataDictionary[tuples[j].Item1] / factor; + continue; } + + int hourIndex = (int)tuple_Time.Item2.AddTicks(-1).TimeOfDay.TotalHours; + if (hourIndex < 0 || hourIndex > 23) + { + continue; + } + + if (!reportDataDictionary.TryGetValue(tuple_Time.Item1, out double value)) + { + continue; + } + + designDay[tuple.Item1, hourIndex] = value / factor; } } result.Add(designDay); } + } - + if (result.Count == 0) + { + diagnostics.Add("No design-day environments found in the SQL output (annual weather-run environments are not design days)"); } return result; } } -} \ No newline at end of file +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Create/PanelSimulationResults.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Create/PanelSimulationResults.cs index 41734e1..d934baf 100644 --- a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Create/PanelSimulationResults.cs +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Create/PanelSimulationResults.cs @@ -1,4 +1,7 @@ -using System.Collections.Generic; +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Collections.Generic; using System.Data; using System.Data.SQLite; @@ -39,6 +42,8 @@ public static List SurfaceSimulationResults(this SQLite result = dataTable.ToSAM_SurfaceSimulationResult(); } + SetHostSurfaceNames(sQLiteConnection, result); + dataTable = Core.SQLite.Query.DataTable(sQLiteConnection, "Zones", "ZoneIndex", "ZoneName"); if (dataTable != null) { @@ -93,7 +98,7 @@ public static List SurfaceSimulationResults(this SQLite } } - if(spaceSimulationResults != null) + if (spaceSimulationResults != null && result != null) { DataTable dataTable_ReportDataDictionary = Core.SQLite.Query.DataTable(sQLiteConnection, "ReportDataDictionary", "ReportDataDictionaryIndex", "KeyValue", "Name", "Units"); DataTable dataTable_ReportData = Core.SQLite.Query.DataTable(sQLiteConnection, "ReportData", "ReportDataDictionaryIndex", "TimeIndex", "Value"); @@ -164,11 +169,96 @@ public static List SurfaceSimulationResults(this SQLite } } - result = result_Temp; + // Only the peak-enriched copies replace the base list — when no space result + // carries a load time index (an annual-only SQL, no sizing periods) the + // per-surface base results must survive: area, zone identity, panel linkage. + if (result_Temp.Count != 0) + { + result = result_Temp; + } } return result; } + + /// + /// Stamps every subsurface result with the EnergyPlus name of the base surface hosting + /// it, read from the Surfaces.BaseSurfaceIndex self-reference. This is the + /// authoritative host link: a SAM_SubSurface name carries the Aperture Guid, but the + /// base surface it points at carries the PANEL Guid, so a window resolves to its panel + /// even when the aperture itself cannot be found in the cluster. The column is optional + /// (older schemas and synthetic fixtures may omit it) - its absence simply leaves the + /// host unknown and the aperture-Guid route in charge. + /// + private static void SetHostSurfaceNames(SQLiteConnection sQLiteConnection, List surfaceSimulationResults) + { + if (sQLiteConnection == null || surfaceSimulationResults == null || surfaceSimulationResults.Count == 0) + { + return; + } + + DataTable dataTable; + try + { + dataTable = Core.SQLite.Query.DataTable(sQLiteConnection, "Surfaces", "SurfaceIndex", "SurfaceName", "BaseSurfaceIndex"); + } + catch (System.Exception) + { + return; + } + + if (dataTable == null) + { + return; + } + + int index_SurfaceIndex = dataTable.Columns.IndexOf("SurfaceIndex"); + int index_SurfaceName = dataTable.Columns.IndexOf("SurfaceName"); + int index_BaseSurfaceIndex = dataTable.Columns.IndexOf("BaseSurfaceIndex"); + if (index_SurfaceIndex == -1 || index_SurfaceName == -1 || index_BaseSurfaceIndex == -1) + { + return; + } + + Dictionary names = new Dictionary(); + Dictionary baseIndexes = new Dictionary(); + foreach (DataRow dataRow in dataTable.Rows) + { + if (dataRow == null || !Core.Query.TryConvert(dataRow[index_SurfaceIndex], out int surfaceIndex)) + { + continue; + } + + if (Core.Query.TryConvert(dataRow[index_SurfaceName], out string surfaceName)) + { + names[surfaceIndex] = surfaceName; + } + + if (Core.Query.TryConvert(dataRow[index_BaseSurfaceIndex], out int baseSurfaceIndex)) + { + baseIndexes[surfaceIndex] = baseSurfaceIndex; + } + } + + foreach (SurfaceSimulationResult surfaceSimulationResult in surfaceSimulationResults) + { + if (surfaceSimulationResult == null || !surfaceSimulationResult.TryGetValue(SurfaceSimulationResultParameter.SurfaceIndex, out int surfaceIndex)) + { + continue; + } + + // A base surface points at itself; only a genuine subsurface gets a host. + if (!baseIndexes.TryGetValue(surfaceIndex, out int baseSurfaceIndex) || baseSurfaceIndex == surfaceIndex) + { + continue; + } + + if (names.TryGetValue(baseSurfaceIndex, out string hostSurfaceName) && !string.IsNullOrWhiteSpace(hostSurfaceName)) + { + surfaceSimulationResult.SetValue(SurfaceSimulationResultParameter.HostSurfaceName, hostSurfaceName); + } + } + } } } diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Create/SpaceSimulationResults.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Create/SpaceSimulationResults.cs index a0b2936..56676dc 100644 --- a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Create/SpaceSimulationResults.cs +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Create/SpaceSimulationResults.cs @@ -1,4 +1,7 @@ -using System; +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; using System.Collections.Generic; using System.Data; using System.Data.SQLite; @@ -54,7 +57,12 @@ public static List SpaceSimulationResults(this SQLiteConn int index_LoadType = dataTable.Columns.IndexOf("LoadType"); if (index_ZoneName != -1 && index_LoadType != -1) { - int index_CalcDesLoad = dataTable.Columns.IndexOf("CalcDesLoad"); + // ONE design-load definition across every consumer of a run: CalcDesLoad, the + // unaltered calculated zone load, matching both the documented result contract and + // Convert.ToSAM_SpaceDesignLoadResults. UserDesLoad (post-sizing-factor capacity) is + // deliberately not used here either, so this path — which feeds Modify.AddResults + // and the Grasshopper SQL component — cannot disagree with the benchmark. + int index_DesignLoad = dataTable.Columns.IndexOf("CalcDesLoad"); int index_PeakHrMin = dataTable.Columns.IndexOf("PeakHrMin"); int index_DesDayName = dataTable.Columns.IndexOf("DesDayName"); @@ -71,9 +79,11 @@ public static List SpaceSimulationResults(this SQLiteConn SpaceSimulationResult spaceSimulationResult_LoadType = new SpaceSimulationResult(Guid.NewGuid(), spaceSimulationResult); spaceSimulationResult_LoadType.SetValue(Analytical.SpaceSimulationResultParameter.LoadType, dataRow[index_LoadType]); - if (index_CalcDesLoad != -1) + // A null design load stays absent rather than being written as a value: + // an unsized zone/load type must remain unavailable, never a zero. + if (index_DesignLoad != -1 && dataRow[index_DesignLoad] != DBNull.Value) { - spaceSimulationResult_LoadType.SetValue(Analytical.SpaceSimulationResultParameter.DesignLoad, dataRow[index_CalcDesLoad]); + spaceSimulationResult_LoadType.SetValue(Analytical.SpaceSimulationResultParameter.DesignLoad, dataRow[index_DesignLoad]); } if (index_DesDayName != -1) @@ -427,7 +437,7 @@ public static List SpaceSimulationResults(this SQLiteConn DateTime? dateTime_Max = Core.OpenStudio.Query.DateTime(dataTable_Time, timeIndex_Max); if (dateTime_Max != null && dateTime_Max.HasValue) { - spaceSimulationResult.SetValue(Analytical.SpaceSimulationResultParameter.MaxDryBulbTemperatureIndex, Core.Query.HourOfYear(dateTime_Max.Value)); + spaceSimulationResult.SetValue(Analytical.SpaceSimulationResultParameter.MaxDryBulbTemperatureIndex, Core.Query.IntervalHourOfYear(dateTime_Max.Value)); } // Min Dry Bulb Temperture @@ -438,7 +448,7 @@ public static List SpaceSimulationResults(this SQLiteConn DateTime? dateTime_Min = Core.OpenStudio.Query.DateTime(dataTable_Time, timeIndex_Min); if (dateTime_Min != null && dateTime_Min.HasValue) { - spaceSimulationResult.SetValue(Analytical.SpaceSimulationResultParameter.MinDryBulbTemperatureIndex, Core.Query.HourOfYear(dateTime_Min.Value)); + spaceSimulationResult.SetValue(Analytical.SpaceSimulationResultParameter.MinDryBulbTemperatureIndex, Core.Query.IntervalHourOfYear(dateTime_Min.Value)); } } } @@ -463,7 +473,7 @@ public static List SpaceSimulationResults(this SQLiteConn DateTime? dateTime = Core.OpenStudio.Query.DateTime(dataTable_Time, timeIndex_Load); if (dateTime != null && dateTime.HasValue) { - spaceSimulationResult.SetValue(Analytical.SpaceSimulationResultParameter.LoadIndex, Core.Query.HourOfYear(dateTime.Value)); + spaceSimulationResult.SetValue(Analytical.SpaceSimulationResultParameter.LoadIndex, Core.Query.IntervalHourOfYear(dateTime.Value)); } //if (sortedDictionary_TimeIndex != null && sortedDictionary_TimeIndex.ContainsKey(timeIndex_Temp)) diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Enums/OpenStudioMaterialUsage.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Enums/OpenStudioMaterialUsage.cs new file mode 100644 index 0000000..1c7e2bb --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Enums/OpenStudioMaterialUsage.cs @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +namespace SAM.Analytical.OpenStudio +{ + /// + /// Explicit construction-usage context for material conversion (review P1-06). A SAM + /// GasMaterial in an opaque construction is an air cavity (OpenStudio AirGap / + /// OS:Material:AirGap); in a fenestration pane construction it is a window gas + /// (OpenStudio.Gas / OS:WindowMaterial:Gas). Usage is never inferred from material names. + /// + public enum OpenStudioMaterialUsage + { + /// Layer of an opaque Construction (wall, floor, roof). + OpaqueConstruction, + + /// Pane layer of an ApertureConstruction (window, door, glass door). + FenestrationConstruction, + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Enums/Parameter/OpenStudioSourceParameter.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Enums/Parameter/OpenStudioSourceParameter.cs new file mode 100644 index 0000000..33c9c24 --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Enums/Parameter/OpenStudioSourceParameter.cs @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.ComponentModel; +using SAM.Core.Attributes; + +namespace SAM.Analytical.OpenStudio +{ + /// + /// Provenance recorded on every SAM object produced by an OpenStudio → SAM import. + /// + /// SAM object names are structural (a Panel's name comes from its Construction, for example) + /// and cannot carry the OpenStudio name, while the OpenStudio handle has no SAM counterpart + /// at all. Both are kept here so an imported model can always be traced back to the object it + /// came from — for adjacency debugging, for diagnostics, and for a second import that has to + /// recognise objects it produced earlier. + /// + /// + [AssociatedTypes(typeof(Panel), typeof(Aperture), typeof(Space), typeof(Construction), typeof(ApertureConstruction), typeof(InternalCondition), typeof(Profile), typeof(AnalyticalModel)), Description("OpenStudio Source Parameter")] + public enum OpenStudioSourceParameter + { + /// Name of the OpenStudio object this SAM object was imported from. + [ParameterProperties("OpenStudio Source Name", "Name of the OpenStudio object this SAM object was imported from"), ParameterValue(Core.ParameterType.String)] SourceName, + + /// OpenStudio handle (UUID) of the source object — unique where names are not. + [ParameterProperties("OpenStudio Source Handle", "OpenStudio handle (UUID) of the source object"), ParameterValue(Core.ParameterType.String)] SourceHandle, + + /// OpenStudio IDD object type of the source object (for example "OS:Surface"). + [ParameterProperties("OpenStudio Source Type", "OpenStudio object type the SAM object was imported from"), ParameterValue(Core.ParameterType.String)] SourceType, + + /// Name of the OpenStudio ThermalZone the source space belonged to. + [ParameterProperties("OpenStudio Thermal Zone Name", "Name of the OpenStudio ThermalZone the source space belonged to"), ParameterValue(Core.ParameterType.String)] ThermalZoneName, + + /// Shading surface group type ("Site", "Building" or "Space") for imported shade panels. + [ParameterProperties("OpenStudio Shading Group Type", "Shading surface group type (Site, Building or Space) of an imported shade panel"), ParameterValue(Core.ParameterType.String)] ShadingGroupType, + + /// Name of the shading surface group an imported shade panel belonged to. + [ParameterProperties("OpenStudio Shading Group Name", "Name of the shading surface group an imported shade panel belonged to"), ParameterValue(Core.ParameterType.String)] ShadingGroupName, + + /// Weather file referenced by the source model (a reference, not embedded weather data). + [ParameterProperties("OpenStudio Weather File Path", "Weather file referenced by the source OpenStudio model - a reference only, never embedded hourly weather"), ParameterValue(Core.ParameterType.String)] WeatherFilePath, + + /// OSM version recorded in the source file before version translation. + [ParameterProperties("OpenStudio Version", "OSM version recorded in the source file before version translation"), ParameterValue(Core.ParameterType.String)] OpenStudioVersion, + + /// Path of the OSM actually converted. + [ParameterProperties("OpenStudio Source Path", "Path of the OSM actually converted"), ParameterValue(Core.ParameterType.String)] SourcePath, + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Enums/Parameter/PanelSimulationResultParameter.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Enums/Parameter/PanelSimulationResultParameter.cs index 1dae654..a4a2b03 100644 --- a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Enums/Parameter/PanelSimulationResultParameter.cs +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Enums/Parameter/PanelSimulationResultParameter.cs @@ -1,4 +1,7 @@ -using System.ComponentModel; +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.ComponentModel; using SAM.Core.Attributes; namespace SAM.Analytical.OpenStudio @@ -8,5 +11,7 @@ public enum SurfaceSimulationResultParameter { [ParameterProperties("Zone Index", "Zone Index"), ParameterValue(Core.ParameterType.Integer)] ZoneIndex, [ParameterProperties("Zone Name", "Zone Name"), ParameterValue(Core.ParameterType.String)] ZoneName, + [ParameterProperties("Surface Index", "EnergyPlus SQL SurfaceIndex - the identity of the engine surface this result was read from"), ParameterValue(Core.ParameterType.Integer)] SurfaceIndex, + [ParameterProperties("Host Surface Name", "EnergyPlus name of the base surface hosting this subsurface (windows/doors); empty for a base surface"), ParameterValue(Core.ParameterType.String)] HostSurfaceName, } } \ No newline at end of file diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Enums/Parameter/SpaceSimulationResultParameter.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Enums/Parameter/SpaceSimulationResultParameter.cs index d944626..9080f64 100644 --- a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Enums/Parameter/SpaceSimulationResultParameter.cs +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Enums/Parameter/SpaceSimulationResultParameter.cs @@ -1,4 +1,7 @@ -using System.ComponentModel; +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.ComponentModel; using SAM.Core.Attributes; namespace SAM.Analytical.OpenStudio @@ -6,6 +9,9 @@ namespace SAM.Analytical.OpenStudio [AssociatedTypes(typeof(SpaceSimulationResult)), Description("SpaceSimulationResult Parameter")] public enum SpaceSimulationResultParameter { + [ParameterProperties("Zone Index", "EnergyPlus SQL ZoneIndex - the identity of the engine zone this result was read from"), ParameterValue(Core.ParameterType.Integer)] ZoneIndex, + [ParameterProperties("Zone Name", "EnergyPlus name of the zone this result was read from"), ParameterValue(Core.ParameterType.String)] ZoneName, + [ParameterProperties("Design Day Name", "Design Day Name"), ParameterValue(Core.ParameterType.String)] DesignDayName, [ParameterProperties("Design Day Index", "Design Day Index"), ParameterValue(Core.ParameterType.Integer)] DesignDayIndex, [ParameterProperties("Peak Date", "Peak Date"), SAMObjectParameterValue(typeof(Core.OpenStudio.ShortDateTime))] PeakDate, diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Modify/AddResults.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Modify/AddResults.cs index 0c760fa..6ccfea5 100644 --- a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Modify/AddResults.cs +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Modify/AddResults.cs @@ -1,190 +1,440 @@ -using System.Collections.Generic; +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Collections.Generic; using System.Data.SQLite; namespace SAM.Analytical.OpenStudio { public static partial class Modify { - public static List AddResults(this AdjacencyCluster adjacencyCluster, string path) + /// + /// Reads the EnergyPlus SQLite output and attaches simulation results to the matching + /// SAM spaces and panels of the given AdjacencyCluster. Two space-result families are + /// read: the annual Ideal Loads family through the C5 engine-neutral reader + /// (OpenStudioSimulationRunner -> OpenStudioSimulationResultSet -> per-LoadType + /// SpaceSimulationResults with peak load [W], peak hour-of-year and unmet hours), and + /// the design-day ZoneSizes family (design loads) when sizing periods ran. Surface + /// results keep one SurfaceSimulationResult per engine surface (identity preserved - + /// an internal panel represented by two engine surfaces receives two results related + /// to the same panel; values are never summed across surfaces). EnergyPlus/OpenStudio + /// names are resolved back to SAM objects by their deterministic Guid suffix + /// (SAM_<type>_<name>_<guid8>), never by display name alone; a zone or + /// surface that matches nothing is reported. A genuine zero value stays a valid + /// result - only a zone absent from the SQL counts as missing and is diagnosed. + /// Rerunning never duplicates: an identical result (type, name, reference, load type) + /// already present from the same source is skipped, its relation ensured. + /// + /// Cluster receiving the results (results and relations are added in place). + /// EnergyPlus SQLite output path. + /// Structured diagnostics: unmatched SQL names, spaces/panels without results. + /// All results added (or already present), or null on invalid input. + public static List AddResults(this AdjacencyCluster adjacencyCluster, string path, out List diagnostics) { - if(string.IsNullOrWhiteSpace(path) || !System.IO.File.Exists(path) || adjacencyCluster == null) + diagnostics = new List(); + + if (string.IsNullOrWhiteSpace(path) || !System.IO.File.Exists(path) || adjacencyCluster == null) { return null; } - List spaceSimulationResults = null; + List spaceSimulationResults = new List(); + + // Annual family (C5 engine-neutral reader - the one authoritative SQL extraction). + OpenStudioLoadSummary openStudioLoadSummary = OpenStudioSimulationRunner.ExtractLoads(path, out string failureDetail); + if (openStudioLoadSummary == null) + { + diagnostics.Add(string.Format("Annual Ideal Loads could not be read ({0}); only design-day results (when present) are attached", failureDetail)); + } + else + { + OpenStudioSimulationResultSet openStudioSimulationResultSet = OpenStudioSimulationRunner.ExtractResultSet(path, openStudioLoadSummary, false, 0, 0, 0, 0); + List annualResults = openStudioSimulationResultSet?.ToSAM_SpaceSimulationResults(adjacencyCluster.GetSpaces()); + if (annualResults != null) + { + spaceSimulationResults.AddRange(annualResults); + } + + // Never silently merged: a reported zone that matches no SAM space is named. + List spaces_ForZoneKeys = adjacencyCluster.GetSpaces(); + HashSet zoneKeys = new HashSet(openStudioLoadSummary.ZoneHeating.Keys, System.StringComparer.OrdinalIgnoreCase); + zoneKeys.UnionWith(openStudioLoadSummary.ZoneCooling.Keys); + foreach (string zoneKey in zoneKeys) + { + if (LookupSpace(zoneKey, null, spaces_ForZoneKeys) == null) + { + diagnostics.Add(string.Format("SQL zone '{0}' matched no SAM space; its annual results were not attached", zoneKey)); + } + } + } + + // Design-day family (ZoneSizes design loads) + surface results. List surfaceSimulationResults = null; using (SQLiteConnection sQLiteConnection = Core.SQLite.Create.SQLiteConnection(path)) { - spaceSimulationResults = Create.SpaceSimulationResults(sQLiteConnection); - surfaceSimulationResults = Create.SurfaceSimulationResults(sQLiteConnection, spaceSimulationResults); + List designDayResults = Create.SpaceSimulationResults(sQLiteConnection); + if (designDayResults != null) + { + designDayResults.RemoveAll(x => !x.TryGetValue(Analytical.SpaceSimulationResultParameter.LoadType, out string loadType) || string.IsNullOrWhiteSpace(loadType)); + spaceSimulationResults.AddRange(designDayResults); + } + + surfaceSimulationResults = Create.SurfaceSimulationResults(sQLiteConnection, designDayResults); } List result = new List(); List spaces = adjacencyCluster.GetSpaces(); - Dictionary dictionary_Space = null; + List panels = adjacencyCluster.GetPanels(); - if (spaces != null) + string source = Query.Source(); + HashSet existingIdentities = ExistingResultIdentities(adjacencyCluster, source); + + HashSet matchedSpaces = new HashSet(); + if (spaceSimulationResults != null) { - dictionary_Space = new Dictionary(); - foreach (Space space in spaces) + foreach (SpaceSimulationResult spaceSimulationResult_SQL in spaceSimulationResults) { - if (space == null) + if (spaceSimulationResult_SQL == null) { continue; } - string reference = space.Guid.ToString("N").ToUpper(); - if (string.IsNullOrWhiteSpace(reference)) + Space space = LookupSpace(spaceSimulationResult_SQL, spaces); + if (space == null) { - continue; + diagnostics.Add(string.Format("SQL zone result '{0}' matched no SAM space; left unattached", spaceSimulationResult_SQL.Name)); } - - dictionary_Space[reference] = space; - } - } - - if (spaceSimulationResults != null && dictionary_Space != null) - { - foreach (SpaceSimulationResult spaceSimulationResult in spaceSimulationResults) - { - string reference = spaceSimulationResult.Name; - Space space = null; - if (reference != null && dictionary_Space != null && dictionary_Space.Count != 0) + else { - if (!dictionary_Space.TryGetValue(reference, out space)) - { - space = null; - } + matchedSpaces.Add(space); } - adjacencyCluster.AddObject(spaceSimulationResult); - if (space != null) - { - adjacencyCluster.AddRelation(space, spaceSimulationResult); - } + SpaceSimulationResult spaceSimulationResult = Referenced(spaceSimulationResult_SQL, space); + AddResult(adjacencyCluster, spaceSimulationResult, space, existingIdentities); result.Add(spaceSimulationResult); } } - List panels = adjacencyCluster.GetPanels(); - Dictionary dictionary_Panel = null; - - if(panels != null) + if (spaces != null) { - dictionary_Panel = new Dictionary(); - foreach (Panel panel in panels) + foreach (Space space in spaces) { - if (panel == null) - { - continue; - } - - string reference = panel.Guid.ToString("N").ToUpper(); - if (string.IsNullOrWhiteSpace(reference)) + if (space != null && !matchedSpaces.Contains(space)) { - continue; + diagnostics.Add(string.Format("No simulation result found for space '{0}' ({1}) - the zone is missing from the SQL output or not conditioned (a reported zero would have been kept as a result)", space.Name, Query.GuidSuffix(space))); } - - dictionary_Panel[reference] = panel; } } - if (surfaceSimulationResults != null && dictionary_Panel != null) + HashSet matchedPanels = new HashSet(); + if (surfaceSimulationResults != null) { - foreach (SurfaceSimulationResult surfaceSimulationResult in surfaceSimulationResults) + foreach (SurfaceSimulationResult surfaceSimulationResult_SQL in surfaceSimulationResults) { - string reference = surfaceSimulationResult.Name; - string[] values = reference.Split(new string[] { "__" }, System.StringSplitOptions.None); - if(values.Length > 1) + if (surfaceSimulationResult_SQL == null) { - reference = values[1]; + continue; } - Panel panel = null; - if (reference != null && dictionary_Panel != null && dictionary_Panel.Count != 0) + Panel panel = LookupPanel(surfaceSimulationResult_SQL, panels); + if (panel == null) { - if (!dictionary_Panel.TryGetValue(reference, out panel)) - { - panel = null; - } + diagnostics.Add(string.Format("SQL surface result '{0}' matched no SAM panel; left unattached", surfaceSimulationResult_SQL.Name)); } - - adjacencyCluster.AddObject(surfaceSimulationResult); - if (panel != null) + else { - adjacencyCluster.AddRelation(panel, surfaceSimulationResult); + matchedPanels.Add(panel); } + SurfaceSimulationResult surfaceSimulationResult = Referenced(surfaceSimulationResult_SQL, panel); + + AddResult(adjacencyCluster, surfaceSimulationResult, panel, existingIdentities); result.Add(surfaceSimulationResult); - if(surfaceSimulationResult.TryGetValue(SurfaceSimulationResultParameter.ZoneName, out string reference_Space)) + if (surfaceSimulationResult.TryGetValue(SurfaceSimulationResultParameter.ZoneName, out string zoneName)) { - if (reference != null && dictionary_Space != null && dictionary_Space.Count != 0) + Space space = LookupSpace(zoneName, null, spaces); + if (space != null) { - if (dictionary_Space.TryGetValue(reference_Space, out Space space) && space != null) - { - adjacencyCluster.AddRelation(space, surfaceSimulationResult); - } + adjacencyCluster.AddRelation(space, surfaceSimulationResult); + matchedSpaces.Add(space); } } } } + if (panels != null) + { + foreach (Panel panel in panels) + { + if (panel != null && panel.PanelType != PanelType.Shade && !matchedPanels.Contains(panel)) + { + diagnostics.Add(string.Format("No surface result found for panel '{0}' ({1}) - the surface is missing from the SQL output (a reported zero would have been kept as a result)", panel.Name, Query.GuidSuffix(panel))); + } + } + } + return result; } - public static List AddResults(this BuildingModel buildingModel, string path) + public static List AddResults(this AdjacencyCluster adjacencyCluster, string path) { - if (string.IsNullOrWhiteSpace(path) || !System.IO.File.Exists(path) || buildingModel == null) + return AddResults(adjacencyCluster, path, out _); + } + + /// + /// Returns the result carrying the matched SAM object's Guid in Reference, so a + /// consumer holding only the result list (Grasshopper, an export, a later rerun) can map + /// it back to its Space or Panel without re-parsing EnergyPlus names. The engine identity + /// it replaces is not lost: the SQL ZoneIndex/ZoneName and SurfaceIndex are kept as + /// parameters. Core.Result.Reference is immutable, so the result is rebuilt through + /// its JSON form - Guid, name, source, timestamp and every parameter carry over. An + /// unmatched result (null SAM object) keeps the raw SQL reference untouched. + /// + private static SpaceSimulationResult Referenced(SpaceSimulationResult spaceSimulationResult, Space space) + { + System.Text.Json.Nodes.JsonObject jsonObject = ReferencedJsonObject(spaceSimulationResult, space); + return jsonObject == null ? spaceSimulationResult : new SpaceSimulationResult(jsonObject); + } + + /// See ; a subsurface result references the panel hosting its aperture. + private static SurfaceSimulationResult Referenced(SurfaceSimulationResult surfaceSimulationResult, Panel panel) + { + System.Text.Json.Nodes.JsonObject jsonObject = ReferencedJsonObject(surfaceSimulationResult, panel); + return jsonObject == null ? surfaceSimulationResult : new SurfaceSimulationResult(jsonObject); + } + + /// The result's JSON form with Reference replaced, or null when nothing needs rebuilding. + private static System.Text.Json.Nodes.JsonObject ReferencedJsonObject(Core.Result result, Core.SAMObject sAMObject) + { + if (result == null || sAMObject == null) { return null; } - List spaceSimulationResults = Create.SpaceSimulationResults(path); - if (spaceSimulationResults == null) + string reference = sAMObject.Guid.ToString("N"); + if (string.Equals(result.Reference, reference, System.StringComparison.OrdinalIgnoreCase)) + { + return null; + } + + System.Text.Json.Nodes.JsonObject jsonObject = result.ToJsonObject(); + if (jsonObject == null) { return null; } - Dictionary dictionary = null; + jsonObject["Reference"] = reference; + return jsonObject; + } - List spaces = buildingModel.GetSpaces(); - if (spaces != null) + /// Adds the result unless an identical one (type, name, reference, load type) already exists from the same source; the space/panel relation is ensured either way. + private static void AddResult(AdjacencyCluster adjacencyCluster, Core.Result result, Core.IJSAMObject relatedObject, HashSet existingIdentities) + { + if (existingIdentities.Add(ResultIdentity(result))) { - dictionary = new Dictionary(); - foreach (Space space in spaces) + adjacencyCluster.AddObject(result); + } + + if (relatedObject != null) + { + adjacencyCluster.AddRelation(relatedObject, result); + } + } + + private static string ResultIdentity(Core.Result result) + { + string loadType = null; + if (result is SpaceSimulationResult spaceSimulationResult) + { + spaceSimulationResult.TryGetValue(Analytical.SpaceSimulationResultParameter.LoadType, out loadType); + } + else if (result is SurfaceSimulationResult surfaceSimulationResult) + { + surfaceSimulationResult.TryGetValue(Analytical.SurfaceSimulationResultParameter.LoadType, out loadType); + } + + return string.Format("{0}|{1}|{2}|{3}", result.GetType().Name, result.Name, result.Reference, loadType); + } + + private static HashSet ExistingResultIdentities(AdjacencyCluster adjacencyCluster, string source) + { + HashSet result = new HashSet(); + + List spaceSimulationResults = adjacencyCluster.GetResults(source); + if (spaceSimulationResults != null) + { + foreach (SpaceSimulationResult spaceSimulationResult in spaceSimulationResults) { - if (space == null) + if (spaceSimulationResult != null) { - continue; + result.Add(ResultIdentity(spaceSimulationResult)); } + } + } - string reference = space.Guid.ToString("N").ToUpper(); - if (string.IsNullOrWhiteSpace(reference)) + List surfaceSimulationResults = adjacencyCluster.GetResults(source); + if (surfaceSimulationResults != null) + { + foreach (SurfaceSimulationResult surfaceSimulationResult in surfaceSimulationResults) + { + if (surfaceSimulationResult != null) { - continue; + result.Add(ResultIdentity(surfaceSimulationResult)); } + } + } + + return result; + } + + private static Space LookupSpace(SpaceSimulationResult spaceSimulationResult, List spaces) + { + if (spaceSimulationResult == null) + { + return null; + } - dictionary[reference] = space; + // The C5 annual family references the space Guid directly. + if (System.Guid.TryParse(spaceSimulationResult.Reference, out System.Guid guid) && guid != System.Guid.Empty) + { + Space space = spaces?.Find(x => x != null && x.Guid == guid); + if (space != null) + { + return space; } } - List result = new List(); - foreach (SpaceSimulationResult spaceSimulationResult in spaceSimulationResults) + return LookupSpace(spaceSimulationResult.Name, spaceSimulationResult.Reference, spaces); + } + + /// Resolves an EnergyPlus zone name / SQL zone index to a SAM space: Guid suffix -> full-Guid reference -> sanitized name (never display-name-only when a Guid is available). + private static Space LookupSpace(string zoneName, string zoneIndex, List spaces) + { + if (spaces == null || spaces.Count == 0) + { + return null; + } + + if (Query.TryGetGuidSuffix(zoneName, out string suffix)) + { + Space space = spaces.Find(x => x != null && Query.GuidSuffix(x) == suffix); + if (space != null) + { + return space; + } + } + + if (System.Guid.TryParse(zoneName, out System.Guid guid)) + { + Space space = spaces.Find(x => x != null && x.Guid == guid); + if (space != null) + { + return space; + } + } + + if (!string.IsNullOrWhiteSpace(zoneName)) + { + string sanitized = Core.OpenStudio.Query.SanitizeName(zoneName); + Space space = spaces.Find(x => x != null && string.Equals(Core.OpenStudio.Query.SanitizeName(x.Name), sanitized, System.StringComparison.OrdinalIgnoreCase)); + if (space != null) + { + return space; + } + } + + return null; + } + + private static Panel LookupPanel(SurfaceSimulationResult surfaceSimulationResult, List panels) + { + if (surfaceSimulationResult == null || panels == null || panels.Count == 0) { - string reference = spaceSimulationResult.Name; - Space space = null; - if (reference != null && dictionary != null && dictionary.Count != 0) + return null; + } + + string surfaceName = surfaceSimulationResult.Name; + + if (Query.TryGetGuidSuffix(surfaceName, out string suffix)) + { + Panel panel = panels.Find(x => x != null && Query.GuidSuffix(x) == suffix); + if (panel != null) + { + return panel; + } + + // EnergyPlus lists subsurfaces in the same Surfaces table as the base surfaces, + // and a SAM_SubSurface name carries the APERTURE Guid (never a panel Guid) - the + // window result belongs to the panel hosting that aperture. Apertures are not + // standalone AdjacencyCluster objects, so the host panel is the only valid + // relation target; the result keeps its own SQL name and surface index. + Panel panel_Aperture = panels.Find(x => x != null && x.HasApertures && x.Apertures.Find(y => y != null && Query.GuidSuffix(y) == suffix) != null); + if (panel_Aperture != null) { - if (!dictionary.TryGetValue(reference, out space)) + return panel_Aperture; + } + } + + // Authoritative host link when the aperture cannot be found in the cluster (it was + // trimmed, merged or re-created after the conversion, so its Guid no longer exists): + // EnergyPlus records the base surface each subsurface sits in, and THAT name carries + // the panel Guid. A window can only fail to resolve here if its own wall did too. + if (surfaceSimulationResult.TryGetValue(SurfaceSimulationResultParameter.HostSurfaceName, out string hostSurfaceName) && Query.TryGetGuidSuffix(hostSurfaceName, out string suffix_Host)) + { + Panel panel_Host = panels.Find(x => x != null && Query.GuidSuffix(x) == suffix_Host); + if (panel_Host != null) + { + return panel_Host; + } + } + + // Legacy naming: "__". + if (!string.IsNullOrWhiteSpace(surfaceName)) + { + string[] values = surfaceName.Split(new string[] { "__" }, System.StringSplitOptions.None); + if (values.Length > 1 && System.Guid.TryParse(values[values.Length - 1], out System.Guid guid)) + { + Panel panel = panels.Find(x => x != null && x.Guid == guid); + if (panel != null) { - space = null; + return panel; } } + string sanitized = Core.OpenStudio.Query.SanitizeName(surfaceName); + Panel panel_Name = panels.Find(x => x != null && string.Equals(Core.OpenStudio.Query.SanitizeName(x.Name), sanitized, System.StringComparison.OrdinalIgnoreCase)); + if (panel_Name != null) + { + return panel_Name; + } + } + + return null; + } + + public static List AddResults(this BuildingModel buildingModel, string path) + { + if (string.IsNullOrWhiteSpace(path) || !System.IO.File.Exists(path) || buildingModel == null) + { + return null; + } + + List spaceSimulationResults = Create.SpaceSimulationResults(path); + if (spaceSimulationResults == null) + { + return null; + } + + List spaces = buildingModel.GetSpaces(); + + List result = new List(); + foreach (SpaceSimulationResult spaceSimulationResult in spaceSimulationResults) + { + Space space = LookupSpace(spaceSimulationResult, spaces); + buildingModel.Add(spaceSimulationResult, space); result.Add(spaceSimulationResult); diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Modify/RemoveUnreferenced.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Modify/RemoveUnreferenced.cs new file mode 100644 index 0000000..c8d25f5 --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Modify/RemoveUnreferenced.cs @@ -0,0 +1,168 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Collections.Generic; +using SAM.Core; + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Modify + { + /// + /// Removes materials no construction in the imported model actually references. + /// + /// An OpenStudio model routinely carries a full library of materials from measures, + /// template construction sets and default construction sets, most of which no surface + /// uses. Importing all of them would hand the user a SAM material library where the + /// handful of materials in the building are indistinguishable from hundreds that are not. + /// Same principle as the SAM_LadybugTools reverse converter. + /// + /// + /// Library to prune; null is a no-op. + /// Imported topology whose constructions define what is referenced. + public static void RemoveUnreferencedMaterials(MaterialLibrary materialLibrary, AdjacencyCluster adjacencyCluster) + { + if (materialLibrary == null || adjacencyCluster == null) + { + return; + } + + HashSet materialNames = new HashSet(); + + List constructions = adjacencyCluster.GetConstructions(); + if (constructions != null) + { + foreach (Construction construction in constructions) + { + AddLayerNames(materialNames, construction?.ConstructionLayers); + } + } + + List apertureConstructions = adjacencyCluster.GetApertureConstructions(); + if (apertureConstructions != null) + { + foreach (ApertureConstruction apertureConstruction in apertureConstructions) + { + AddLayerNames(materialNames, apertureConstruction?.PaneConstructionLayers); + AddLayerNames(materialNames, apertureConstruction?.FrameConstructionLayers); + } + } + + List materials = materialLibrary.GetMaterials(); + if (materials == null) + { + return; + } + + foreach (IMaterial material in materials) + { + if (material == null || string.IsNullOrWhiteSpace(material.Name)) + { + continue; + } + + if (!materialNames.Contains(material.Name)) + { + materialLibrary.Remove(material); + } + } + } + + private static void AddLayerNames(HashSet materialNames, IEnumerable constructionLayers) + { + if (constructionLayers == null) + { + return; + } + + foreach (ConstructionLayer constructionLayer in constructionLayers) + { + if (constructionLayer != null && !string.IsNullOrWhiteSpace(constructionLayer.Name)) + { + materialNames.Add(constructionLayer.Name); + } + } + } + + /// + /// Removes profiles that no imported references. + /// + /// Every schedule in the OpenStudio model is converted, including the ones attached to + /// unused space types, HVAC objects that were not imported, and availability managers. + /// Only those an assigned internal condition names — through a "… Profile Name" + /// parameter — belong in the SAM profile library. + /// + /// + /// Library to prune; null is a no-op. + /// Imported topology whose spaces carry the internal conditions. + public static void RemoveUnreferencedProfiles(ProfileLibrary profileLibrary, AdjacencyCluster adjacencyCluster) + { + if (profileLibrary == null || adjacencyCluster == null) + { + return; + } + + HashSet profileNames = new HashSet(); + + List spaces = adjacencyCluster.GetSpaces(); + if (spaces != null) + { + foreach (Space space in spaces) + { + InternalCondition internalCondition = space?.InternalCondition; + if (internalCondition == null) + { + continue; + } + + List parameterSets = internalCondition.GetParameterSets(); + if (parameterSets == null) + { + continue; + } + + foreach (ParameterSet parameterSet in parameterSets) + { + if (parameterSet?.Names == null) + { + continue; + } + + foreach (string parameterName in parameterSet.Names) + { + if (parameterName == null || !parameterName.EndsWith("Profile Name")) + { + continue; + } + + string profileName = parameterSet.ToObject(parameterName) as string; + if (!string.IsNullOrWhiteSpace(profileName)) + { + profileNames.Add(profileName); + } + } + } + } + } + + List profiles = profileLibrary.GetProfiles(); + if (profiles == null) + { + return; + } + + foreach (Profile profile in profiles) + { + if (profile == null || string.IsNullOrWhiteSpace(profile.Name)) + { + continue; + } + + if (!profileNames.Contains(profile.Name)) + { + profileLibrary.Remove(profile); + } + } + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Modify/SetOpenStudioSource.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Modify/SetOpenStudioSource.cs new file mode 100644 index 0000000..0182d32 --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Modify/SetOpenStudioSource.cs @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Modify + { + /// + /// Records on an imported SAM object which OpenStudio object it came from: name, handle + /// and IDD type (). + /// + /// The handle matters more than the name. Names are unique only per object type in an + /// OSM, and a measure may rewrite them; the handle is the stable identity, and it is the + /// only way to explain later which of two identically named surfaces a diagnostic refers + /// to. + /// + /// + /// Imported SAM object; null is a no-op. + /// OpenStudio source object; null is a no-op. + /// True when provenance was recorded. + public static bool SetOpenStudioSource(this Core.ParameterizedSAMObject parameterizedSAMObject, global::OpenStudio.ModelObject modelObject) + { + if (parameterizedSAMObject == null || modelObject == null) + { + return false; + } + + try + { + parameterizedSAMObject.SetValue(OpenStudioSourceParameter.SourceName, modelObject.nameString()); + } + catch (System.Exception) + { + // an unnamed object still gets its handle and type recorded + } + + try + { + global::OpenStudio.UUID uuid = modelObject.handle(); + if (uuid != null) + { + // __str__ is the SWIG string conversion; UUID does not override ToString. + parameterizedSAMObject.SetValue(OpenStudioSourceParameter.SourceHandle, uuid.__str__()); + } + } + catch (System.Exception) + { + // best effort + } + + try + { + global::OpenStudio.IddObjectType iddObjectType = modelObject.iddObjectType(); + if (iddObjectType != null) + { + parameterizedSAMObject.SetValue(OpenStudioSourceParameter.SourceType, iddObjectType.valueName()); + } + } + catch (System.Exception) + { + // best effort + } + + return true; + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Properties/AssemblyInfo.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Properties/AssemblyInfo.cs index 117ee76..d7eeb2e 100644 --- a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Properties/AssemblyInfo.cs +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Properties/AssemblyInfo.cs @@ -24,9 +24,11 @@ */ using System.Reflection; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] +[assembly: InternalsVisibleTo("SAM.Analytical.OpenStudio.Tests")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Query/DesignDays.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Query/DesignDays.cs index d66296c..c78d597 100644 --- a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Query/DesignDays.cs +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Query/DesignDays.cs @@ -1,31 +1,51 @@ -using System.Collections.Generic; -using System.Reflection; +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Collections.Generic; +using System.IO; namespace SAM.Analytical.OpenStudio { public static partial class Query { /// + /// Loads the SizingPeriod:DesignDay objects of a DDY file through the EnergyPlus + /// reverse translator (deterministic import — the primary design-day path). /// Source: https://github.com/NREL/OpenStudio-resources/blob/538b3c7df3f6ed4513f354cff7d96f7c556c267e/model/simulationtests/lib/baseline_model.rb#L612:L655 /// - /// - /// - public static List DesignDays(string path_DDY) + /// DDY file path. + /// The design days (owned by an internal temporary model; clone them into a target model), or null when the file cannot be read. + public static List DesignDays(string path_DDY) { + if (string.IsNullOrWhiteSpace(path_DDY) || !File.Exists(path_DDY)) + { + return null; + } global::OpenStudio.Path openStudioPath = global::OpenStudio.OpenStudioUtilitiesCore.toPath(path_DDY); if (openStudioPath == null) + { return null; + } global::OpenStudio.OptionalIdfFile optionalIdfFile = global::OpenStudio.IdfFile.load(openStudioPath, new global::OpenStudio.IddFileType("EnergyPlus")); + if (optionalIdfFile == null || optionalIdfFile.isNull()) + { + return null; + } + global::OpenStudio.Workspace workspace = new global::OpenStudio.Workspace(optionalIdfFile.get()); global::OpenStudio.EnergyPlusReverseTranslator energyPlusReverseTranslator = new global::OpenStudio.EnergyPlusReverseTranslator(); global::OpenStudio.Model model = energyPlusReverseTranslator.translateWorkspace(workspace); - global::OpenStudio.OptionalDesignDay optionalDesignDay = model.getDesignDayByName("AAA"); - throw new System.NotImplementedException(); + List result = new List(); + foreach (global::OpenStudio.DesignDay designDay in model.getDesignDays()) + { + result.Add(designDay); + } + return result; } } -} \ No newline at end of file +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Query/EmbeddedAnnualWeatherPath.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Query/EmbeddedAnnualWeatherPath.cs new file mode 100644 index 0000000..9835889 --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Query/EmbeddedAnnualWeatherPath.cs @@ -0,0 +1,92 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.IO; +using System.Linq; +using System.Security.Cryptography; +using System.Text; + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Query + { + /// + /// Resolves an annual EPW path from the WeatherData embedded in the AnalyticalModel + /// (AnalyticalModelParameter.WeatherData). SAM WeatherData does not retain its source + /// EPW path, but it can be exported through the existing SAM.Weather API + /// (Weather.Convert.ToEPW) when it carries hourly weather years; the export is written + /// to a deterministic temp file (content-hash name, reused across runs). Returns null + /// when no WeatherData is embedded or it holds no weather years — the caller then + /// applies the documented metadata-only fallback (location, ground temperatures). + /// + /// Source SAM analytical model. + /// Path of the exported EPW file, or null when the embedded WeatherData cannot provide an annual EPW. + public static string EmbeddedAnnualWeatherPath(this AnalyticalModel analyticalModel) + { + if (analyticalModel == null) + { + return null; + } + + Weather.WeatherData weatherData = null; + if (!analyticalModel.TryGetValue(AnalyticalModelParameter.WeatherData, out weatherData) || weatherData == null) + { + return null; + } + + System.Collections.Generic.IEnumerable years = weatherData.Years; + if (years == null || !years.Any()) + { + return null; + } + + string epw; + try + { + epw = Weather.Convert.ToEPW(weatherData); + } + catch (System.Exception) + { + return null; + } + + if (string.IsNullOrWhiteSpace(epw)) + { + return null; + } + + try + { + string directory = Path.Combine(Path.GetTempPath(), "SAM_OpenStudio"); + Directory.CreateDirectory(directory); + + string path = Path.Combine(directory, "SAM_WeatherData_" + Hash(epw) + ".epw"); + if (!File.Exists(path) || File.ReadAllText(path) != epw) + { + File.WriteAllText(path, epw); + } + + return path; + } + catch (System.Exception) + { + return null; + } + } + + private static string Hash(string value) + { + using (SHA256 sHA256 = SHA256.Create()) + { + byte[] bytes = sHA256.ComputeHash(Encoding.UTF8.GetBytes(value)); + StringBuilder stringBuilder = new StringBuilder(); + for (int i = 0; i < 8; i++) + { + stringBuilder.Append(bytes[i].ToString("x2")); + } + + return stringBuilder.ToString(); + } + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Query/EmbeddedWeatherFingerprint.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Query/EmbeddedWeatherFingerprint.cs new file mode 100644 index 0000000..af0c22b --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Query/EmbeddedWeatherFingerprint.cs @@ -0,0 +1,132 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Security.Cryptography; +using System.Text; +using System.Text.Json.Nodes; + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Query + { + /// + /// Deterministic fingerprint of the weather data embedded in an AnalyticalModel + /// (AnalyticalModelParameter.WeatherData / HeatingDesignDays / CoolingDesignDays), + /// computed from the SAM JSON of those parameter values with volatile identity fields + /// (Guid) stripped, so re-imported identical content yields the same fingerprint. Two + /// models sharing a Guid but carrying different embedded weather or design-day content + /// produce different fingerprints — asynchronous callers (Grasshopper) must key on + /// this, never on the model Guid alone. Returns an empty string when nothing is + /// embedded; null when the model is null. + /// + /// Source SAM analytical model. + /// 16-hex-character content fingerprint, empty when nothing is embedded, or null. + public static string EmbeddedWeatherFingerprint(this AnalyticalModel analyticalModel) + { + if (analyticalModel == null) + { + return null; + } + + StringBuilder stringBuilder = new StringBuilder(); + + Weather.WeatherData weatherData = null; + if (analyticalModel.TryGetValue(AnalyticalModelParameter.WeatherData, out weatherData) && weatherData != null) + { + stringBuilder.Append(Core.Convert.ToString(weatherData, Core.Formatting.None)); + } + + stringBuilder.Append('|'); + + Core.SAMCollection heatingDesignDays = null; + if (analyticalModel.TryGetValue(AnalyticalModelParameter.HeatingDesignDays, out heatingDesignDays) && heatingDesignDays != null) + { + stringBuilder.Append(Core.Convert.ToString((Core.IJSAMObject)heatingDesignDays, Core.Formatting.None)); + } + + stringBuilder.Append('|'); + + Core.SAMCollection coolingDesignDays = null; + if (analyticalModel.TryGetValue(AnalyticalModelParameter.CoolingDesignDays, out coolingDesignDays) && coolingDesignDays != null) + { + stringBuilder.Append(Core.Convert.ToString((Core.IJSAMObject)coolingDesignDays, Core.Formatting.None)); + } + + string content = Canonical(stringBuilder.ToString()); + if (content == "||") + { + return string.Empty; + } + + using (SHA256 sHA256 = SHA256.Create()) + { + byte[] bytes = sHA256.ComputeHash(Encoding.UTF8.GetBytes(content)); + StringBuilder result = new StringBuilder(); + for (int i = 0; i < 8; i++) + { + result.Append(bytes[i].ToString("x2")); + } + + return result.ToString(); + } + } + + /// Removes volatile identity fields (Guid) so identical content hashes identically. + private static string Canonical(string value) + { + if (string.IsNullOrWhiteSpace(value)) + { + return value; + } + + StringBuilder result = new StringBuilder(); + string[] segments = value.Split('|'); + for (int i = 0; i < segments.Length; i++) + { + if (i > 0) + { + result.Append('|'); + } + + if (string.IsNullOrWhiteSpace(segments[i])) + { + continue; + } + + JsonNode jsonNode = null; + try + { + jsonNode = JsonNode.Parse(segments[i]); + RemoveGuids(jsonNode); + } + catch (System.Exception) + { + jsonNode = null; + } + + result.Append(jsonNode == null ? segments[i] : jsonNode.ToJsonString()); + } + + return result.ToString(); + } + + private static void RemoveGuids(JsonNode jsonNode) + { + if (jsonNode is JsonObject jsonObject) + { + jsonObject.Remove("Guid"); + foreach (System.Collections.Generic.KeyValuePair keyValuePair in jsonObject) + { + RemoveGuids(keyValuePair.Value); + } + } + else if (jsonNode is JsonArray jsonArray) + { + foreach (JsonNode item in jsonArray) + { + RemoveGuids(item); + } + } + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Query/GuidSuffix.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Query/GuidSuffix.cs new file mode 100644 index 0000000..6b735bd --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Query/GuidSuffix.cs @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Collections.Generic; + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Query + { + /// + /// The trailing deterministic SAM Guid suffix of an OpenStudio object name produced by + /// Core.OpenStudio.Query.OpenStudioName (SAM_<type>_<name>_<guid8>, + /// uppercased by EnergyPlus): the last underscore-separated segment when it is exactly + /// 8 hexadecimal characters. Used to resolve SQL zone/surface names back to SAM object + /// Guids (prefix match — never a display-name-only match when a Guid is available). + /// + /// OpenStudio/EnergyPlus object name. + /// Uppercased 8-hex Guid prefix when found. + /// True when a Guid suffix was found. + public static bool TryGetGuidSuffix(string openStudioName, out string suffix) + { + suffix = null; + if (string.IsNullOrWhiteSpace(openStudioName)) + { + return false; + } + + int index = openStudioName.LastIndexOf('_'); + if (index == -1 || index == openStudioName.Length - 1) + { + return false; + } + + string candidate = openStudioName.Substring(index + 1); + if (candidate.Length != 8) + { + return false; + } + + foreach (char c in candidate) + { + bool hex = (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'); + if (!hex) + { + return false; + } + } + + suffix = candidate.ToUpperInvariant(); + return true; + } + + /// + /// Guid-prefix (first 8 hex, uppercased) used in deterministic OpenStudio names. + /// + public static string GuidSuffix(this Core.SAMObject sAMObject) + { + return sAMObject == null ? null : sAMObject.Guid.ToString("N").Substring(0, 8).ToUpperInvariant(); + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Query/IsConditioned.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Query/IsConditioned.cs new file mode 100644 index 0000000..4afa3c5 --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Query/IsConditioned.cs @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Query + { + /// + /// Central conditioned-space decision (plan §12): a space is conditioned when it has an + /// InternalCondition whose name does not contain "unconditioned" or "external" + /// (culture-independent, ordinal case-insensitive — never culture-sensitive ToLower, + /// which misclassifies under e.g. the Turkish casing rules) — matching the established + /// SAM_LadybugTools behaviour. Conditioned + /// spaces receive a dual-setpoint thermostat and an Ideal Loads air system; unconditioned + /// spaces keep their geometry and internal gains only. + /// + /// SAM space. + /// True when the space is conditioned. + public static bool IsConditioned(this Space space) + { + InternalCondition internalCondition = space?.InternalCondition; + if (internalCondition == null) + { + return false; + } + + string name = internalCondition.Name; + if (name == null) + { + return true; + } + + return name.IndexOf("unconditioned", System.StringComparison.OrdinalIgnoreCase) < 0 + && name.IndexOf("external", System.StringComparison.OrdinalIgnoreCase) < 0; + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Query/OutsideBoundaryCondition.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Query/OutsideBoundaryCondition.cs new file mode 100644 index 0000000..e79596e --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Query/OutsideBoundaryCondition.cs @@ -0,0 +1,78 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Query + { + /// + /// Resolves the OpenStudio surface outside boundary condition for a SAM panel, mirroring + /// the established SAM_LadybugTools mapping (New/BoundaryCondition.cs): a panel flagged + /// adiabatic (PanelParameter.Adiabatic, or a zero-thickness construction — see + /// Analytical.Query.Adiabatic) always maps to "Adiabatic", regardless of its PanelType; + /// otherwise the PanelType mapping applies. Air and Shade panels are never adiabatic. + /// Returns null for null panels and unmapped panel types — callers must raise a + /// diagnostic and choose an explicit fallback. + /// + /// SAM panel. + /// "Ground", "Outdoors", "Adiabatic", "Surface" or null. + public static string OutsideBoundaryCondition(this Panel panel) + { + if (panel == null) + { + return null; + } + + if (panel.Adiabatic()) + { + return "Adiabatic"; + } + + return OutsideBoundaryCondition(panel.PanelType); + } + + /// + /// Maps a SAM PanelType to the OpenStudio surface outside boundary condition, mirroring + /// the established SAM_LadybugTools mapping (BoundaryCondition.cs): underground and + /// ground-bearing panels → "Ground"; external panels → "Outdoors"; Undefined → "Adiabatic"; + /// internal panel types → "Surface" (resolved by explicit adjacency pairing, never by + /// geometric matching). Returns null for unmapped panel types — callers must raise a + /// diagnostic and choose an explicit fallback. + /// + /// SAM panel type. + /// "Ground", "Outdoors", "Adiabatic", "Surface" or null. + public static string OutsideBoundaryCondition(this PanelType panelType) + { + switch (panelType) + { + case PanelType.UndergroundWall: + case PanelType.SlabOnGrade: + case PanelType.UndergroundSlab: + case PanelType.UndergroundCeiling: + case PanelType.Floor: + return "Ground"; + + case PanelType.Wall: + case PanelType.CurtainWall: + case PanelType.WallExternal: + case PanelType.Roof: + case PanelType.SolarPanel: + case PanelType.Shade: + case PanelType.FloorExposed: + case PanelType.FloorRaised: + return "Outdoors"; + + case PanelType.Undefined: + return "Adiabatic"; + + case PanelType.FloorInternal: + case PanelType.WallInternal: + case PanelType.Ceiling: + case PanelType.Air: + return "Surface"; + } + + return null; + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Query/SAMApertureType.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Query/SAMApertureType.cs new file mode 100644 index 0000000..b3e5a4a --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Query/SAMApertureType.cs @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Query + { + /// + /// Maps an OpenStudio subsurface type to a SAM , per + /// docs/openstudio-to-sam-import-audit.md §4.4. + /// + /// SAM has exactly two aperture types, so several OpenStudio types collapse onto one. + /// Where the collapse loses behaviour — an operable window's openability, a tubular + /// daylighting device's light path — is set so the caller + /// reports SAM-OSI-APX-001 rather than presenting the mapping as exact. + /// + /// + /// This is the counterpart of , + /// which resolves Door versus GlassDoor from the pane material rather than from the SAM + /// aperture type — so a GlassDoor correctly returns to + /// here and the round trip is stable. + /// + /// + /// OpenStudio subsurface type. + /// True when the mapping discards behaviour SAM cannot carry. + /// The SAM aperture type; when unsupported. + public static ApertureType SAMApertureType(string subSurfaceType, out bool approximated) + { + approximated = false; + + if (string.IsNullOrWhiteSpace(subSurfaceType)) + { + return ApertureType.Undefined; + } + + if (string.Equals(subSurfaceType, "FixedWindow", StringComparison.OrdinalIgnoreCase) + || string.Equals(subSurfaceType, "Skylight", StringComparison.OrdinalIgnoreCase)) + { + return ApertureType.Window; + } + + if (string.Equals(subSurfaceType, "OperableWindow", StringComparison.OrdinalIgnoreCase)) + { + // SAM has no openable-window flag; the opening behaviour is lost, the geometry + // and construction are not. + approximated = true; + return ApertureType.Window; + } + + if (string.Equals(subSurfaceType, "TubularDaylightDome", StringComparison.OrdinalIgnoreCase) + || string.Equals(subSurfaceType, "TubularDaylightDiffuser", StringComparison.OrdinalIgnoreCase)) + { + // Representable only as the glazed opening itself: SAM has no light pipe, so the + // dome/diffuser pair imports as two independent windows. + approximated = true; + return ApertureType.Window; + } + + if (string.Equals(subSurfaceType, "Door", StringComparison.OrdinalIgnoreCase) + || string.Equals(subSurfaceType, "GlassDoor", StringComparison.OrdinalIgnoreCase)) + { + return ApertureType.Door; + } + + if (string.Equals(subSurfaceType, "OverheadDoor", StringComparison.OrdinalIgnoreCase)) + { + approximated = true; + return ApertureType.Door; + } + + return ApertureType.Undefined; + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Query/SAMPanelType.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Query/SAMPanelType.cs new file mode 100644 index 0000000..ae41e9d --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Query/SAMPanelType.cs @@ -0,0 +1,208 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Query + { + /// + /// Derives the SAM from an OpenStudio surface type and outside + /// boundary condition, per docs/openstudio-to-sam-import-audit.md §4.3. + /// + /// Both inputs are required: neither alone determines the SAM type. A "Wall" is + /// outdoors, + /// against another surface and against ground — + /// the same surface type in three different SAM roles. + /// + /// + /// This is the inverse of and + /// and must stay consistent with them: the round-trip + /// tests assert that a SAM panel type survives export and re-import. + /// + /// + /// OpenStudio surface type ("Wall", "Floor", "RoofCeiling"). + /// OpenStudio outside boundary condition. + /// True when the boundary condition is Adiabatic and the panel must carry . + /// False when the boundary condition has no SAM equivalent and a documented fallback was applied. + /// The SAM panel type; when the surface type itself is unrecognised. + public static PanelType SAMPanelType(string surfaceType, string outsideBoundaryCondition, out bool adiabatic, out bool supported) + { + adiabatic = false; + supported = true; + + SurfaceGroup surfaceGroup = SurfaceGroup.Undefined; + if (string.Equals(surfaceType, "Wall", StringComparison.OrdinalIgnoreCase)) + { + surfaceGroup = SurfaceGroup.Wall; + } + else if (string.Equals(surfaceType, "Floor", StringComparison.OrdinalIgnoreCase)) + { + surfaceGroup = SurfaceGroup.Floor; + } + else if (string.Equals(surfaceType, "RoofCeiling", StringComparison.OrdinalIgnoreCase)) + { + surfaceGroup = SurfaceGroup.RoofCeiling; + } + + if (surfaceGroup == SurfaceGroup.Undefined) + { + supported = false; + return PanelType.Undefined; + } + + BoundaryGroup boundaryGroup = SAMBoundaryGroup(outsideBoundaryCondition, out supported); + + switch (boundaryGroup) + { + case BoundaryGroup.Outdoors: + switch (surfaceGroup) + { + case SurfaceGroup.Wall: + return PanelType.WallExternal; + + case SurfaceGroup.Floor: + return PanelType.FloorExposed; + + case SurfaceGroup.RoofCeiling: + return PanelType.Roof; + } + + break; + + case BoundaryGroup.Ground: + switch (surfaceGroup) + { + case SurfaceGroup.Wall: + return PanelType.UndergroundWall; + + case SurfaceGroup.Floor: + return PanelType.SlabOnGrade; + + case SurfaceGroup.RoofCeiling: + return PanelType.UndergroundCeiling; + } + + break; + + case BoundaryGroup.Adiabatic: + // Adiabatic keeps the INTERNAL panel type and records adiabatic separately, + // exactly as the forward direction reads it back + // (Analytical.Query.Adiabatic → "Adiabatic" regardless of PanelType). Mapping + // it to a dedicated "adiabatic type" would lose the wall/floor/ceiling role. + adiabatic = true; + switch (surfaceGroup) + { + case SurfaceGroup.Wall: + return PanelType.WallInternal; + + case SurfaceGroup.Floor: + return PanelType.FloorInternal; + + case SurfaceGroup.RoofCeiling: + return PanelType.Ceiling; + } + + break; + + case BoundaryGroup.Surface: + switch (surfaceGroup) + { + case SurfaceGroup.Wall: + return PanelType.WallInternal; + + case SurfaceGroup.Floor: + return PanelType.FloorInternal; + + case SurfaceGroup.RoofCeiling: + return PanelType.Ceiling; + } + + break; + } + + supported = false; + return PanelType.Undefined; + } + + /// + /// Classifies an OpenStudio outside boundary condition string into the four groups SAM + /// can represent. The unsupported "other side" conditions (OtherSideCoefficients, + /// OtherSideConditionsModel) fall back to Adiabatic — the only safe choice, since SAM has + /// no way to carry an externally specified surface temperature — and set + /// false so the caller reports SAM-OSI-BC-001. + /// + /// OpenStudio outside boundary condition. + /// False when a documented fallback was applied. + internal static BoundaryGroup SAMBoundaryGroup(string outsideBoundaryCondition, out bool supported) + { + supported = true; + + if (string.IsNullOrWhiteSpace(outsideBoundaryCondition)) + { + supported = false; + return BoundaryGroup.Adiabatic; + } + + if (string.Equals(outsideBoundaryCondition, "Outdoors", StringComparison.OrdinalIgnoreCase)) + { + return BoundaryGroup.Outdoors; + } + + if (string.Equals(outsideBoundaryCondition, "Surface", StringComparison.OrdinalIgnoreCase)) + { + return BoundaryGroup.Surface; + } + + if (string.Equals(outsideBoundaryCondition, "Adiabatic", StringComparison.OrdinalIgnoreCase)) + { + return BoundaryGroup.Adiabatic; + } + + // "Ground", "Foundation", "GroundFCfactorMethod", "GroundSlabPreprocessorAverage", + // "GroundBasementPreprocessorAverageWall" and the rest of the preprocessor family all + // mean "in contact with ground" for SAM's purposes. + if (outsideBoundaryCondition.StartsWith("Ground", StringComparison.OrdinalIgnoreCase) + || string.Equals(outsideBoundaryCondition, "Foundation", StringComparison.OrdinalIgnoreCase)) + { + return BoundaryGroup.Ground; + } + + supported = false; + return BoundaryGroup.Adiabatic; + } + + /// OpenStudio surface-type groups recognised by the importer. + internal enum SurfaceGroup + { + /// Unrecognised surface type. + Undefined, + + /// OpenStudio "Wall". + Wall, + + /// OpenStudio "Floor". + Floor, + + /// OpenStudio "RoofCeiling". + RoofCeiling, + } + + /// Outside-boundary-condition groups SAM can represent. + internal enum BoundaryGroup + { + /// Exposed to the outdoor environment. + Outdoors, + + /// In contact with ground (any of the Ground/Foundation family). + Ground, + + /// No heat transfer across the boundary. + Adiabatic, + + /// Paired with another surface (interzone). + Surface, + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Query/SubSurfaceType.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Query/SubSurfaceType.cs new file mode 100644 index 0000000..7b07ef7 --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Query/SubSurfaceType.cs @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using SAM.Core; + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Query + { + /// + /// Maps a SAM aperture to the OpenStudio SubSurface type. Mirrors SAM_LadybugTools + /// semantics: windows with an opaque pane build-up become doors, doors with a transparent + /// pane build-up become glass doors. SAM has no explicit operable-window flag, so windows + /// map to "FixedWindow" (documented MVP assumption). + /// + /// SAM aperture. + /// Material library used to resolve the pane material type; may be null. + /// "FixedWindow", "Door" or "GlassDoor"; null when the aperture is null. + public static string SubSurfaceType(this Aperture aperture, MaterialLibrary materialLibrary) + { + if (aperture == null) + { + return null; + } + + MaterialType materialType = MaterialType.Undefined; + ApertureConstruction apertureConstruction = aperture.ApertureConstruction; + if (apertureConstruction != null) + { + materialType = apertureConstruction.PaneConstructionLayers.MaterialType(materialLibrary); + } + + if (aperture.ApertureType == ApertureType.Door) + { + return materialType == MaterialType.Transparent ? "GlassDoor" : "Door"; + } + + return materialType == MaterialType.Opaque ? "Door" : "FixedWindow"; + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Query/SurfaceType.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Query/SurfaceType.cs new file mode 100644 index 0000000..b4cbe72 --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Query/SurfaceType.cs @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +namespace SAM.Analytical.OpenStudio +{ + public static partial class Query + { + /// + /// Maps a SAM panel to the OpenStudio surface type ("Wall", "Floor" or "RoofCeiling"). + /// Mirrors SAM_LadybugTools Face.cs: a floor-group panel whose (space-oriented) normal + /// points upward acts as the ceiling of the space below and becomes "RoofCeiling". + /// Panels outside the Wall/Floor/Roof groups (for example Air) are classified from the + /// panel normal. + /// + /// SAM panel with its normal oriented out of the owning space. + /// "Wall", "Floor" or "RoofCeiling"; null when the panel is null. + public static string SurfaceType(this Panel panel) + { + if (panel == null) + { + return null; + } + + PanelType panelType = panel.PanelType; + PanelGroup panelGroup = panelType.PanelGroup(); + + if (panelGroup == PanelGroup.Floor && Analytical.Query.PanelType(panel.Normal) == PanelType.Roof) + { + return "RoofCeiling"; + } + + switch (panelGroup) + { + case PanelGroup.Wall: + return "Wall"; + + case PanelGroup.Floor: + return "Floor"; + + case PanelGroup.Roof: + return "RoofCeiling"; + } + + switch (Analytical.Query.PanelType(panel.Normal)) + { + case PanelType.Roof: + return "RoofCeiling"; + + case PanelType.Floor: + return "Floor"; + + default: + return "Wall"; + } + } + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/SAM.Analytical.OpenStudio.csproj b/SAM_OpenStudio/SAM.Analytical.OpenStudio/SAM.Analytical.OpenStudio.csproj index aa68f35..84ba613 100644 --- a/SAM_OpenStudio/SAM.Analytical.OpenStudio/SAM.Analytical.OpenStudio.csproj +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/SAM.Analytical.OpenStudio.csproj @@ -39,6 +39,9 @@ ..\..\..\SAM\build\SAM.Analytical.dll + + ..\..\..\SAM\build\SAM.Architectural.dll + ..\..\..\SAM\build\SAM.Core.dll @@ -58,7 +61,7 @@ - 3.8.0 + 3.10.0 1.0.119 @@ -66,5 +69,39 @@ + + + + + <_SAMSQLiteManaged Include="@(RuntimeCopyLocalItems)" Condition="'%(RuntimeCopyLocalItems.NuGetPackageId)' == 'Stub.System.Data.SQLite.Core.NetStandard'" /> + <_SAMSQLiteNative Include="@(RuntimeTargetsCopyLocalItems)" Condition="'%(RuntimeTargetsCopyLocalItems.NuGetPackageId)' == 'Stub.System.Data.SQLite.Core.NetStandard' AND '%(RuntimeTargetsCopyLocalItems.RuntimeIdentifier)' == 'win-x64'" /> + + + + + + + \ No newline at end of file diff --git a/SAM_OpenStudio/SAM.Core.OpenStudio/Classes/OpenStudioConversionOptions.cs b/SAM_OpenStudio/SAM.Core.OpenStudio/Classes/OpenStudioConversionOptions.cs new file mode 100644 index 0000000..47c63d7 --- /dev/null +++ b/SAM_OpenStudio/SAM.Core.OpenStudio/Classes/OpenStudioConversionOptions.cs @@ -0,0 +1,187 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +namespace SAM.Core.OpenStudio +{ + /// + /// Options controlling SAM → OpenStudio model conversion. All geometry tolerances used by the + /// converters come from this class; converters must not hard-code tolerances. Missing SAM data + /// (materials, constructions, profiles, internal-condition values) is never silently + /// substituted regardless of options — converters raise + /// entries instead. + /// + public sealed class OpenStudioConversionOptions + { + /// + /// Distance tolerance [m] for vertex equality and duplicate-vertex removal. + /// Default: (1e-6 m). + /// + public double DistanceTolerance { get; set; } = Core.Tolerance.Distance; + + /// + /// Angle tolerance [rad] for collinearity and planarity checks. + /// Default: . + /// + public double AngleTolerance { get; set; } = Core.Tolerance.Angle; + + /// + /// Elevation tolerance [m] used to group SAM spaces into OpenStudio BuildingStories. + /// Default: (1e-3 m). + /// + public double ElevationTolerance { get; set; } = Core.Tolerance.MacroDistance; + + /// + /// Minimum polygon area [m²] below which a boundary is rejected as degenerate. + /// Default: 1e-4 m² (1 cm²). + /// + public double MinimumArea { get; set; } = 0.0001; + + /// + /// When true (default) conditioned thermal zones receive a ZoneHVACIdealLoadsAirSystem + /// and a dual-setpoint thermostat. + /// + public bool AssignIdealLoads { get; set; } = true; + + /// + /// When true (default) SAM shading panels are converted to OpenStudio shading surfaces. + /// + public bool IncludeShading { get; set; } = true; + + /// + /// First day of week of the run calendar (1 Jan), used to align day-composed (weekly) + /// profiles with the simulated weekdays. When null (default) the full-pipeline overload + /// derives it from the EPW weather file; the geometry-only overload falls back to Monday. + /// + public System.DayOfWeek? FirstDayOfWeek { get; set; } + + /// + /// Directory where the OSM/OSW and simulation run directories are written. + /// When null the caller must provide paths explicitly at save/run time. + /// + public string OutputDirectory { get; set; } + + /// + /// Building rotation [degrees clockwise from true North, the TAS/EnergyPlus convention] + /// applied to OS:Building North Axis. When null (default) the SAM model's + /// AnalyticalModelParameter.NorthAngle (stored in radians) is used; when neither exists + /// the North Axis is left at the OpenStudio default (0). + /// + public double? NorthAngleDegrees { get; set; } + + /// Run-period begin month (default 1). + public int? RunPeriodBeginMonth { get; set; } + + /// Run-period begin day of month (default 1). + public int? RunPeriodBeginDay { get; set; } + + /// Run-period end month (default 12). + public int? RunPeriodEndMonth { get; set; } + + /// Run-period end day of month (default 31). + public int? RunPeriodEndDay { get; set; } + + /// Timesteps per hour (default null → 6, the documented MVP value). + public int? TimestepsPerHour { get; set; } + + /// + /// OS:Building Solar Distribution value (e.g. "FullExterior", "FullInteriorAndExterior"). + /// Null (default) leaves the OpenStudio default untouched. + /// + public string SolarDistribution { get; set; } + + /// + /// OS:ShadowCalculation Calculation Frequency [days]. Null (default) leaves the + /// OpenStudio default untouched. + /// + public int? ShadowCalculationFrequencyDays { get; set; } + + /// + /// OS:ShadowCalculation Shading Calculation Method: "PixelCounting" (default) or + /// "PolygonClipping". PixelCounting (the GPU-based method) has no limitations related + /// to zone or shading-surface concavity — PolygonClipping reports every non-convex + /// casting surface as a severe DetermineShadowingCombinations error — and scales + /// better with high shading-surface counts; its per-timestep cost only pays off from + /// roughly a few hundred shading surfaces. Set to "PolygonClipping" to restore the + /// EnergyPlus default; null/empty leaves the OpenStudio default untouched. + /// + public string ShadingCalculationMethod { get; set; } = "PixelCounting"; + + /// + /// Paths to OpenStudio measure directories (each containing measure.xml and measure.rb) + /// applied to the generated OSW as workflow steps, in order, with caller arguments at + /// their measure defaults. Null/empty (default) writes an empty steps array. Directories + /// that do not exist or contain no measure.xml are skipped with a warning — never + /// silently. + /// + public System.Collections.Generic.IList MeasurePaths { get; set; } + + /// + /// Advanced use only: complete EnergyPlus objects in IDF format injected into the + /// workspace after translation through a generated EnergyPlus measure + /// (sam_additional_idf_objects) appended to the OSW steps. Each entry is one or more + /// complete IDF objects; an entry that does not parse fails the workflow step, which + /// fails the run — invalid objects are never silently dropped. Null/empty (default) + /// generates no measure. + /// + public System.Collections.Generic.IList AdditionalIdfStrings { get; set; } + + /// OS:YearDescription Calendar Year. Null (default) leaves it unset. + public int? CalendarYear { get; set; } + + /// + /// When true the run calendar is a leap year: OS:YearDescription Is Leap Year is set and + /// schedules are generated with 8784 values (explicit ≥8784 profile stores pass through; + /// 8760 stores repeat 31 Dec; day-composed profiles tile 366 days). Null/false (default) + /// keeps the documented 365-day policy. + /// + public bool? IsLeapYear { get; set; } + + /// + /// Daylight saving time. Default false (energy-model convention; SAM carries no DST + /// data): any RunPeriodControlDaylightSavingTime object is removed. When true the object + /// is ensured (EnergyPlus default dates). + /// + public bool DaylightSavingsTime { get; set; } = false; + + /// + /// DDY design-day file imported into the model (heating 99.6% / cooling 0.4% by name + /// convention unless ). An explicit + /// OpenStudioRunOptions.DdyPath takes precedence over this value. When design days are + /// imported, sizing-period runs are enabled (see ). + /// + public string DdyPath { get; set; } + + /// When true every design day in the DDY is imported; default false imports only the 99.6% heating / 0.4% cooling pair (by name convention). + public bool ImportAllDesignDays { get; set; } = false; + + /// + /// Sizing-period execution: null (default) runs sizing periods when design days were + /// imported; explicit true/false overrides. Annual results always exclude sizing periods + /// (environment-period filter in the runner). + /// + public bool? RunSizingPeriods { get; set; } + + /// Reporting frequency for the requested output variables. Default "Hourly". + public string OutputVariableFrequency { get; set; } = "Hourly"; + + /// + /// Inter-zone air exchange across SAM Air panels (OS:Construction:AirBoundary), in air + /// changes per hour of the smaller of the two zones — the EnergyPlus basis. + /// + /// Default NaN keeps the EnergyPlus default Air Exchange Method = None: the two + /// zones are still grouped for solar, daylighting and radiant exchange (that is inherent + /// to an air boundary), but no air moves between them, so their air temperatures are + /// coupled only by radiation. A finite positive value switches the method to + /// SimpleMixing at that rate. + /// + /// + /// This is deliberately opt-in and never inferred: SAM carries no per-panel airflow data + /// (PanelParameter has no airflow member), so any rate is an assumption by the caller and + /// is named in a diagnostic when applied. EnergyPlus's own documented default for the + /// field is 0.5 ACH. Ignored when an AirflowNetwork simulation is active (EnergyPlus + /// rule), which is outside the Ideal Loads scope of this converter. + /// + /// + public double AirBoundaryAirChangesPerHour { get; set; } = double.NaN; + } +} diff --git a/SAM_OpenStudio/SAM.Core.OpenStudio/Classes/OpenStudioConversionStatistics.cs b/SAM_OpenStudio/SAM.Core.OpenStudio/Classes/OpenStudioConversionStatistics.cs new file mode 100644 index 0000000..6c99a6d --- /dev/null +++ b/SAM_OpenStudio/SAM.Core.OpenStudio/Classes/OpenStudioConversionStatistics.cs @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +namespace SAM.Core.OpenStudio +{ + /// + /// Translation statistics for one SAM → OpenStudio conversion: how many source objects were + /// considered, how many OpenStudio objects were created, how many source objects or loads + /// were explicitly skipped (always with a diagnostic), how many unsupported parameters were + /// met, and the diagnostic counts by severity. Mutable during conversion; the result takes + /// an immutable snapshot via . + /// + public sealed class OpenStudioConversionStatistics + { + /// Source SAM objects considered for conversion (spaces, panels, apertures). + public int SourceObjects { get; set; } + + /// SAM objects successfully registered with an OpenStudio counterpart. + public int CreatedObjects { get; set; } + + /// Source objects or loads explicitly skipped (each skip carries a diagnostic). + public int SkippedObjects { get; set; } + + /// Parameters/data with no OpenStudio representation (each carries a SAM-OS-IC-001 diagnostic). + public int UnsupportedObjects { get; set; } + + /// Diagnostics raised with Information severity. + public int InformationCount { get; set; } + + /// Diagnostics raised with Warning severity. + public int WarningCount { get; set; } + + /// Diagnostics raised with Error severity. + public int ErrorCount { get; set; } + + /// Creates an empty statistics instance. + public OpenStudioConversionStatistics() + { + } + + private OpenStudioConversionStatistics(OpenStudioConversionStatistics other) + { + SourceObjects = other.SourceObjects; + CreatedObjects = other.CreatedObjects; + SkippedObjects = other.SkippedObjects; + UnsupportedObjects = other.UnsupportedObjects; + InformationCount = other.InformationCount; + WarningCount = other.WarningCount; + ErrorCount = other.ErrorCount; + } + + /// Immutable copy of the current counters. + public OpenStudioConversionStatistics Snapshot() + { + return new OpenStudioConversionStatistics(this); + } + } +} diff --git a/SAM_OpenStudio/SAM.Core.OpenStudio/Classes/OpenStudioDesignDaySource.cs b/SAM_OpenStudio/SAM.Core.OpenStudio/Classes/OpenStudioDesignDaySource.cs new file mode 100644 index 0000000..aa2ba80 --- /dev/null +++ b/SAM_OpenStudio/SAM.Core.OpenStudio/Classes/OpenStudioDesignDaySource.cs @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +namespace SAM.Core.OpenStudio +{ + /// + /// Where the design days in a converted OpenStudio model actually came from. Mirrors the + /// documented design-day precedence of the SAM → OpenStudio route (explicit DDY file, then + /// the design days embedded in the AnalyticalModel, then none — never merged) and records the + /// outcome rather than the intent: a source that supplied no usable design day reports + /// . Consumed by provenance reporting (the B1b benchmark producer's + /// provenance.designDaySource) so the recorded basis is what the route did. + /// + public enum OpenStudioDesignDaySource + { + /// No design day reached the model; sizing periods stay disabled unless overridden. + None = 0, + + /// Design days were imported from an explicit DDY file. + Ddy = 1, + + /// Design days were translated from the AnalyticalModel HeatingDesignDays/CoolingDesignDays. + EmbeddedModel = 2, + } +} diff --git a/SAM_OpenStudio/SAM.Core.OpenStudio/Classes/OpenStudioDiagnostic.cs b/SAM_OpenStudio/SAM.Core.OpenStudio/Classes/OpenStudioDiagnostic.cs new file mode 100644 index 0000000..0d05631 --- /dev/null +++ b/SAM_OpenStudio/SAM.Core.OpenStudio/Classes/OpenStudioDiagnostic.cs @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; + +namespace SAM.Core.OpenStudio +{ + /// + /// Structured message describing an event, approximation or failure during SAM → OpenStudio + /// conversion or simulation. Diagnostics replace silent substitution: converters must raise a + /// diagnostic instead of guessing missing data. Immutable. + /// + public sealed class OpenStudioDiagnostic + { + /// Stable machine-readable code, see . + public string Code { get; } + + /// Severity of the diagnostic. + public OpenStudioDiagnosticSeverity Severity { get; } + + /// Human-readable description of what happened and which value was affected. + public string Message { get; } + + /// Guid of the SAM object the diagnostic refers to, when applicable. + public Guid? SamGuid { get; } + + /// SAM type name of the object the diagnostic refers to, when applicable. + public string SamObjectType { get; } + + /// Name of the related OpenStudio object, when one was created. + public string OpenStudioObjectName { get; } + + /// Creates an immutable diagnostic. + /// Stable machine-readable code, see . + /// Severity of the diagnostic. + /// Human-readable description. + /// Guid of the related SAM object, when applicable. + /// SAM type name of the related object, when applicable. + /// Name of the related OpenStudio object, when applicable. + public OpenStudioDiagnostic(string code, OpenStudioDiagnosticSeverity severity, string message, Guid? samGuid = null, string samObjectType = null, string openStudioObjectName = null) + { + Code = code; + Severity = severity; + Message = message; + SamGuid = samGuid; + SamObjectType = samObjectType; + OpenStudioObjectName = openStudioObjectName; + } + + /// Formats the diagnostic as a single log line. + public override string ToString() + { + string result = string.Format("[{0}] {1}: {2}", Code, Severity, Message); + if (SamGuid.HasValue || !string.IsNullOrWhiteSpace(SamObjectType)) + { + result += string.Format(" (SAM {0} {1})", SamObjectType, SamGuid); + } + + if (!string.IsNullOrWhiteSpace(OpenStudioObjectName)) + { + result += string.Format(" → {0}", OpenStudioObjectName); + } + + return result; + } + } +} diff --git a/SAM_OpenStudio/SAM.Core.OpenStudio/Classes/OpenStudioDiagnosticSeverity.cs b/SAM_OpenStudio/SAM.Core.OpenStudio/Classes/OpenStudioDiagnosticSeverity.cs new file mode 100644 index 0000000..75b2535 --- /dev/null +++ b/SAM_OpenStudio/SAM.Core.OpenStudio/Classes/OpenStudioDiagnosticSeverity.cs @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +namespace SAM.Core.OpenStudio +{ + /// + /// Severity of a raised during SAM → OpenStudio + /// conversion or simulation. + /// + public enum OpenStudioDiagnosticSeverity + { + /// Informational message; no action required. + Information = 0, + + /// The conversion continued but the output may differ from the SAM source. + Warning = 1, + + /// The affected object could not be converted; the result is not valid. + Error = 2, + } +} diff --git a/SAM_OpenStudio/SAM.Core.OpenStudio/Classes/OpenStudioImportOptions.cs b/SAM_OpenStudio/SAM.Core.OpenStudio/Classes/OpenStudioImportOptions.cs new file mode 100644 index 0000000..ced29dc --- /dev/null +++ b/SAM_OpenStudio/SAM.Core.OpenStudio/Classes/OpenStudioImportOptions.cs @@ -0,0 +1,95 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +namespace SAM.Core.OpenStudio +{ + /// + /// Options controlling OpenStudio → SAM import. Deliberately separate from + /// : the two directions share tolerances but not + /// intent, and coupling them would make every forward option appear on the import component. + /// + /// As in the forward direction, missing OpenStudio data is never silently substituted + /// regardless of options — the converters raise entries. + /// + /// + public sealed class OpenStudioImportOptions + { + /// + /// Distance tolerance [m] for vertex equality, duplicate-vertex removal and geometric + /// adjacency fallback. Default: . + /// + public double DistanceTolerance { get; set; } = Core.Tolerance.Distance; + + /// + /// Angle tolerance [rad] for collinearity and planarity checks. + /// Default: . + /// + public double AngleTolerance { get; set; } = Core.Tolerance.Angle; + + /// + /// Minimum polygon area [m²] below which an imported boundary is rejected as degenerate. + /// Default: 1e-4 m² (1 cm²). + /// + public double MinimumArea { get; set; } = 0.0001; + + /// + /// When true (default) shading surfaces are imported as SAM shade panels. + /// + public bool IncludeShading { get; set; } = true; + + /// + /// When true (default) space types, loads, controls and schedules are imported into SAM + /// InternalConditions and a ProfileLibrary. False imports geometry and constructions only. + /// + public bool IncludeInternalConditions { get; set; } = true; + + /// + /// When true (default) constructions and materials are imported into a SAM + /// MaterialLibrary. False leaves panels with name-only placeholder constructions. + /// + public bool IncludeConstructions { get; set; } = true; + + /// + /// When true (default) an interzone pair whose OpenStudio adjacency handles are missing + /// may still be paired by validated geometric matching (coincident, opposite-facing, + /// equal-area boundaries), reported as SAM-OSI-ADJ-001. False leaves such surfaces + /// unpaired and reports SAM-OSI-ADJ-002. + /// + public bool AllowGeometricAdjacencyFallback { get; set; } = true; + + /// + /// When true (default) a full SAM Guid found in the OpenStudio AdditionalProperties + /// () is restored onto the imported SAM object. + /// False always issues fresh Guids — useful when importing the same OSM twice into one + /// SAM session. + /// + public bool RestoreSAMIdentity { get; set; } = true; + + /// + /// When true the OSW workflow is executed through the OpenStudio CLI before import, so + /// model measures are applied. Default false: an OSW is imported from its seed model and + /// SAM-OSI-OSW-004 states that measures were not applied. + /// + public bool ExecuteWorkflow { get; set; } + + /// + /// Directory used for OSW execution (run folder and artifacts). When null the OSW's own + /// directory is used. + /// + public string OutputDirectory { get; set; } + + /// + /// Unreferenced materials, constructions and profiles are pruned from the produced + /// libraries when true (default), mirroring the SAM_LadybugTools reverse converter. + /// + public bool PruneUnreferencedLibraryEntries { get; set; } = true; + + /// + /// When true (default) and the model's referenced EPW weather file exists on disk, its + /// hourly weather is loaded into SAM WeatherData and embedded in the imported + /// AnalyticalModel. When false, or when the file cannot be found, only the weather-file + /// path is recorded as metadata — a reference is never presented as embedded weather. + /// + public bool ImportWeatherData { get; set; } = true; + } +} diff --git a/SAM_OpenStudio/SAM.Core.OpenStudio/Classes/OpenStudioObjectMap.cs b/SAM_OpenStudio/SAM.Core.OpenStudio/Classes/OpenStudioObjectMap.cs new file mode 100644 index 0000000..700b3c5 --- /dev/null +++ b/SAM_OpenStudio/SAM.Core.OpenStudio/Classes/OpenStudioObjectMap.cs @@ -0,0 +1,92 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; + +namespace SAM.Core.OpenStudio +{ + /// + /// Guid-keyed registry of entries created during a + /// conversion. Prevents duplicate conversion of the same SAM object: an existing entry is + /// never overwritten. + /// + public sealed class OpenStudioObjectMap + { + private readonly Dictionary dictionary = new Dictionary(); + + /// Number of registered references. + public int Count + { + get + { + return dictionary.Count; + } + } + + /// All registered references. + public IEnumerable References + { + get + { + return dictionary.Values; + } + } + + /// True when a reference for the given SAM Guid is registered. + /// Guid of the SAM object. + public bool Contains(Guid samGuid) + { + return dictionary.ContainsKey(samGuid); + } + + /// + /// Registers a reference. Returns false (and changes nothing) when the reference is null, + /// its name is empty, or a reference for the same SAM Guid already exists. + /// + /// Reference to register. + public bool TryAdd(OpenStudioObjectReference openStudioObjectReference) + { + if (openStudioObjectReference == null || string.IsNullOrWhiteSpace(openStudioObjectReference.OpenStudioObjectName)) + { + return false; + } + + if (dictionary.ContainsKey(openStudioObjectReference.SamGuid)) + { + return false; + } + + dictionary[openStudioObjectReference.SamGuid] = openStudioObjectReference; + return true; + } + + /// Gets the registered reference for a SAM Guid. + /// Guid of the SAM object. + /// The registered reference, when present. + public bool TryGetReference(Guid samGuid, out OpenStudioObjectReference openStudioObjectReference) + { + return dictionary.TryGetValue(samGuid, out openStudioObjectReference); + } + + /// Name of the OpenStudio object created for the SAM Guid, or null. + /// Guid of the SAM object. + public string OpenStudioObjectName(Guid samGuid) + { + OpenStudioObjectReference openStudioObjectReference; + return dictionary.TryGetValue(samGuid, out openStudioObjectReference) ? openStudioObjectReference.OpenStudioObjectName : null; + } + + /// Snapshot of the map as SAM Guid → OpenStudio object name. + public IReadOnlyDictionary ToNameDictionary() + { + Dictionary result = new Dictionary(); + foreach (KeyValuePair keyValuePair in dictionary) + { + result[keyValuePair.Key] = keyValuePair.Value.OpenStudioObjectName; + } + + return result; + } + } +} diff --git a/SAM_OpenStudio/SAM.Core.OpenStudio/Classes/OpenStudioObjectReference.cs b/SAM_OpenStudio/SAM.Core.OpenStudio/Classes/OpenStudioObjectReference.cs new file mode 100644 index 0000000..01a2333 --- /dev/null +++ b/SAM_OpenStudio/SAM.Core.OpenStudio/Classes/OpenStudioObjectReference.cs @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; + +namespace SAM.Core.OpenStudio +{ + /// + /// Traceability record linking one SAM object (by Guid and type) to the OpenStudio object + /// created from it (by deterministic name — never by OpenStudio handle, which changes between + /// sessions). Immutable. + /// + public sealed class OpenStudioObjectReference + { + /// Guid of the source SAM object. + public Guid SamGuid { get; } + + /// SAM type name of the source object (for example "Space" or "Panel"). + public string SamObjectType { get; } + + /// Deterministic name of the created OpenStudio object. + public string OpenStudioObjectName { get; } + + /// Creates an immutable reference. + /// Guid of the source SAM object. + /// SAM type name of the source object. + /// Deterministic name of the created OpenStudio object. + public OpenStudioObjectReference(Guid samGuid, string samObjectType, string openStudioObjectName) + { + SamGuid = samGuid; + SamObjectType = samObjectType; + OpenStudioObjectName = openStudioObjectName; + } + } +} diff --git a/SAM_OpenStudio/SAM.Core.OpenStudio/Classes/OpenStudioRunOptions.cs b/SAM_OpenStudio/SAM.Core.OpenStudio/Classes/OpenStudioRunOptions.cs new file mode 100644 index 0000000..2e4d4d5 --- /dev/null +++ b/SAM_OpenStudio/SAM.Core.OpenStudio/Classes/OpenStudioRunOptions.cs @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +namespace SAM.Core.OpenStudio +{ + /// + /// Options controlling execution of the OpenStudio CLI for a generated model. + /// + public sealed class OpenStudioRunOptions + { + /// + /// Explicit path to openstudio.exe (or its installation directory). When null the CLI is + /// discovered via (PATH, direct + /// installations, Ladybug Tools bundle). + /// + public string CliPath { get; set; } + + /// + /// Isolated directory in which the simulation runs and output files are written. + /// When null a directory next to the OSW file is used. + /// + public string RunDirectory { get; set; } + + /// EPW weather file applied to the run. Required for simulation. + public string EpwPath { get; set; } + + /// Optional DDY file; when present design days are imported. + public string DdyPath { get; set; } + + /// Maximum wall-clock time for the CLI process in seconds. Default 3600. + public int TimeoutSeconds { get; set; } = 3600; + + /// + /// When true (default) the run executes in a unique GUID subdirectory of the output + /// directory, so concurrent and repeated runs never collide. When false the given + /// directory is used directly and an in-progress lock file guards against concurrent + /// runs in the same directory (the previous run folder is cleaned before a new run). + /// + public bool UseUniqueRunDirectory { get; set; } = true; + + /// + /// When true the extraction also loads the hourly zone temperature/operative/humidity + /// series into the result set. Default false (annual scalars, peaks and unmet hours + /// only) — series are 8760 values per zone per variable. + /// + public bool ExtractTimeSeries { get; set; } = false; + } +} diff --git a/SAM_OpenStudio/SAM.Core.OpenStudio/Classes/OpenStudioRunResult.cs b/SAM_OpenStudio/SAM.Core.OpenStudio/Classes/OpenStudioRunResult.cs new file mode 100644 index 0000000..f4486f9 --- /dev/null +++ b/SAM_OpenStudio/SAM.Core.OpenStudio/Classes/OpenStudioRunResult.cs @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Collections.Generic; + +namespace SAM.Core.OpenStudio +{ + /// + /// Outcome of one OpenStudio CLI simulation run. Immutable. Zone load results are not part of + /// this class to keep SAM.Core.OpenStudio free of analytical types — they are carried by the + /// analytical-level conversion result (see SAM.Analytical.OpenStudio). + /// + public sealed class OpenStudioRunResult + { + /// True when the CLI exited with code 0 and EnergyPlus reported no fatal errors. + public bool Success { get; } + + /// Exit code of the OpenStudio CLI process (-1 when the process timed out). + public int ExitCode { get; } + + /// Path of the OSM that was run. + public string OsmPath { get; } + + /// Path of the OSW workflow file that was run. + public string OswPath { get; } + + /// Path of the EnergyPlus SQLite results file, when produced. + public string SqlPath { get; } + + /// Path of the EnergyPlus error file (eplusout.err), when produced. + public string ErrorFilePath { get; } + + /// Severe error lines parsed from eplusout.err. + public IReadOnlyList SevereErrors { get; } + + /// Fatal error lines parsed from eplusout.err. + public IReadOnlyList FatalErrors { get; } + + /// Creates an immutable run result. + /// True when the run completed without fatal errors. + /// CLI process exit code (-1 for timeout). + /// Path of the OSM that was run. + /// Path of the OSW workflow file. + /// Path of the SQLite results file, when produced. + /// Path of eplusout.err, when produced. + /// Severe error lines parsed from eplusout.err. + /// Fatal error lines parsed from eplusout.err. + public OpenStudioRunResult(bool success, int exitCode, string osmPath, string oswPath, string sqlPath, string errorFilePath, IEnumerable severeErrors, IEnumerable fatalErrors) + { + Success = success; + ExitCode = exitCode; + OsmPath = osmPath; + OswPath = oswPath; + SqlPath = sqlPath; + ErrorFilePath = errorFilePath; + SevereErrors = severeErrors == null ? new List() : new List(severeErrors); + FatalErrors = fatalErrors == null ? new List() : new List(fatalErrors); + } + } +} diff --git a/SAM_OpenStudio/SAM.Core.OpenStudio/Classes/OpenStudioSimulationProgress.cs b/SAM_OpenStudio/SAM.Core.OpenStudio/Classes/OpenStudioSimulationProgress.cs new file mode 100644 index 0000000..5ed7784 --- /dev/null +++ b/SAM_OpenStudio/SAM.Core.OpenStudio/Classes/OpenStudioSimulationProgress.cs @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +namespace SAM.Core.OpenStudio +{ + /// Stages of one OpenStudio save → run → extract pipeline execution. + public enum OpenStudioSimulationStage + { + /// Writing the OSM file. + SavingOsm = 0, + + /// Writing the OSW workflow file. + WritingOsw = 1, + + /// The OpenStudio CLI (EnergyPlus) is executing. + RunningCli = 2, + + /// Reading and mapping the SQLite results. + ReadingResults = 3, + + /// Pipeline finished (successfully, cancelled or failed). + Complete = 4, + } + + /// + /// Progress report of one pipeline execution, delivered through + /// . + /// + public sealed class OpenStudioSimulationProgress + { + /// Current stage. + public OpenStudioSimulationStage Stage { get; } + + /// Human-readable detail (paths, exit codes). + public string Message { get; } + + /// Creates a progress report. + public OpenStudioSimulationProgress(OpenStudioSimulationStage stage, string message) + { + Stage = stage; + Message = message; + } + + /// Formats the report. + public override string ToString() + { + return string.Format("[{0}] {1}", Stage, Message); + } + } +} diff --git a/SAM_OpenStudio/SAM.Core.OpenStudio/Create/Model.cs b/SAM_OpenStudio/SAM.Core.OpenStudio/Create/Model.cs index 27414bc..1e6aef8 100644 --- a/SAM_OpenStudio/SAM.Core.OpenStudio/Create/Model.cs +++ b/SAM_OpenStudio/SAM.Core.OpenStudio/Create/Model.cs @@ -1,28 +1,139 @@ -namespace SAM.Core.OpenStudio +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +namespace SAM.Core.OpenStudio { public static partial class Create { /// - /// Reads model from give path (*.osm) + /// Reads model from give path (*.osm). The OpenStudio VersionTranslator is used so OSM + /// files written by older OpenStudio versions are upgraded on load instead of being + /// rejected. /// /// OSM file path example: C:\MyModels\model.osm /// Model public static global::OpenStudio.Model Model(string path) { - if (string.IsNullOrWhiteSpace(path) || !System.IO.File.Exists(path)) + string originalVersion; + string failureReason; + System.Collections.Generic.List translationMessages; + return Model(path, out originalVersion, out translationMessages, out failureReason); + } + + /// + /// Reads a model from the given path (*.osm) through the OpenStudio VersionTranslator and + /// reports what happened. The plain overload collapses every + /// failure mode — missing file, unreadable path, unsupported version, corrupt content — + /// into a bare null, which the reverse importer cannot turn into an actionable + /// diagnostic; this overload keeps that information. + /// + /// OSM file path, for example C:\MyModels\model.osm. + /// OSM version recorded in the file before translation, when the translator reached it; null otherwise. + /// VersionTranslator errors and warnings, formatted one per entry; never null. + /// Single-line description of why the load failed; null on success. + /// The loaded model, or null when it could not be loaded. + public static global::OpenStudio.Model Model(string path, out string originalVersion, out System.Collections.Generic.List translationMessages, out string failureReason) + { + originalVersion = null; + translationMessages = new System.Collections.Generic.List(); + failureReason = null; + + if (string.IsNullOrWhiteSpace(path)) + { + failureReason = "no path was supplied"; + return null; + } + + if (!System.IO.File.Exists(path)) + { + failureReason = string.Format("the file does not exist: {0}", path); return null; + } global::OpenStudio.Path openStudioPath = global::OpenStudio.OpenStudioUtilitiesCore.toPath(path); if (openStudioPath == null) + { + failureReason = string.Format("the path could not be converted to an OpenStudio path: {0}", path); + return null; + } + + global::OpenStudio.VersionTranslator versionTranslator = new global::OpenStudio.VersionTranslator(); + global::OpenStudio.OptionalModel optionalModel; + try + { + optionalModel = versionTranslator.loadModel(openStudioPath); + } + catch (System.Exception exception) + { + failureReason = string.Format("the VersionTranslator threw {0}: {1}", exception.GetType().Name, exception.Message); return null; + } - global::OpenStudio.OptionalModel optionalModel = global::OpenStudio.Model.load(openStudioPath); - if(optionalModel == null || optionalModel.isNull()) + CollectTranslatorMessages(versionTranslator, translationMessages, out originalVersion); + + if (optionalModel == null || optionalModel.isNull()) { + failureReason = translationMessages.Count == 0 + ? "the VersionTranslator returned no model (unsupported version or corrupt file)" + : string.Format("the VersionTranslator returned no model: {0}", string.Join("; ", translationMessages)); return null; } return optionalModel.get(); } + + /// + /// Collects the translator's original-version string and its error/warning messages. + /// Best effort throughout: a diagnostic accessor that throws must never turn a + /// successfully translated model into a load failure. + /// + private static void CollectTranslatorMessages(global::OpenStudio.VersionTranslator versionTranslator, System.Collections.Generic.List translationMessages, out string originalVersion) + { + originalVersion = null; + + try + { + global::OpenStudio.VersionString versionString = versionTranslator.originalVersion(); + if (versionString != null) + { + originalVersion = versionString.str(); + } + } + catch (System.Exception) + { + // best effort — the version is reported when available, never required + } + + AppendLogMessages(translationMessages, () => versionTranslator.errors(), "error"); + AppendLogMessages(translationMessages, () => versionTranslator.warnings(), "warning"); + } + + private static void AppendLogMessages(System.Collections.Generic.List translationMessages, System.Func accessor, string kind) + { + global::OpenStudio.LogMessageVector logMessageVector; + try + { + logMessageVector = accessor(); + } + catch (System.Exception) + { + return; + } + + if (logMessageVector == null) + { + return; + } + + foreach (global::OpenStudio.LogMessage logMessage in logMessageVector) + { + if (logMessage == null) + { + continue; + } + + translationMessages.Add(string.Format("{0}: {1}", kind, logMessage.logMessage())); + } + } } } \ No newline at end of file diff --git a/SAM_OpenStudio/SAM.Core.OpenStudio/Modify/SetSAMIdentity.cs b/SAM_OpenStudio/SAM.Core.OpenStudio/Modify/SetSAMIdentity.cs new file mode 100644 index 0000000..854c0de --- /dev/null +++ b/SAM_OpenStudio/SAM.Core.OpenStudio/Modify/SetSAMIdentity.cs @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; + +namespace SAM.Core.OpenStudio +{ + public static partial class Modify + { + /// + /// Stamps the SAM identity of onto an OpenStudio object's + /// AdditionalProperties using the namespaced keys in + /// . This is the only lossless identity channel + /// through an OSM: the deterministic object name carries just the first 8 hex characters + /// of the Guid, which cannot be inverted. + /// + /// Purely additive — OS:AdditionalProperties is a separate object attached to the + /// owner, so no existing field, object name or EnergyPlus input is affected. + /// + /// + /// Target OpenStudio object; null is a no-op. + /// Source SAM object; null is a no-op. + /// True when the identity was written. + public static bool SetSAMIdentity(this global::OpenStudio.ModelObject modelObject, SAMObject sAMObject) + { + if (modelObject == null || sAMObject == null) + { + return false; + } + + return SetSAMIdentity(modelObject, sAMObject.Guid, sAMObject.GetType().Name, sAMObject.Name); + } + + /// + /// Stamps an explicit SAM identity onto an OpenStudio object's + /// AdditionalProperties. See . + /// + /// Target OpenStudio object; null is a no-op. + /// Full SAM Guid; is a no-op. + /// SAM runtime type name; written when non-empty. + /// Original, unsanitised SAM name; written when non-empty. + /// True when the Guid feature was written. + public static bool SetSAMIdentity(this global::OpenStudio.ModelObject modelObject, Guid guid, string type, string name) + { + if (modelObject == null || guid == Guid.Empty) + { + return false; + } + + global::OpenStudio.AdditionalProperties additionalProperties = modelObject.additionalProperties(); + if (additionalProperties == null) + { + return false; + } + + // A failed setFeature is never fatal to the conversion: identity is metadata, and an + // OSM without it still simulates. It is reported by the caller when it matters. + bool result = additionalProperties.setFeature(OpenStudioIdentityKeys.Guid, guid.ToString("D")); + + if (!string.IsNullOrWhiteSpace(type)) + { + additionalProperties.setFeature(OpenStudioIdentityKeys.Type, type); + } + + if (!string.IsNullOrWhiteSpace(name)) + { + additionalProperties.setFeature(OpenStudioIdentityKeys.Name, name); + } + + return result; + } + } +} diff --git a/SAM_OpenStudio/SAM.Core.OpenStudio/Query/ConvertUnit.cs b/SAM_OpenStudio/SAM.Core.OpenStudio/Query/ConvertUnit.cs index 3736b7e..7741552 100644 --- a/SAM_OpenStudio/SAM.Core.OpenStudio/Query/ConvertUnit.cs +++ b/SAM_OpenStudio/SAM.Core.OpenStudio/Query/ConvertUnit.cs @@ -1,9 +1,41 @@ -using System.Data; +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Data; namespace SAM.Core.OpenStudio { public static partial class Query { + /// + /// The single energy-conversion authority (C5): J → kWh. Every annual-energy path + /// (runner extraction, result sets) must use this — never a local divisor. + /// + /// Energy [J]. + /// Energy [kWh]. + public static double JoulesToKilowattHours(double joules) + { + return joules / 3600000.0; + } + + /// + /// Per-interval energy [J] → average power over the interval [W]: J ÷ interval seconds. + /// At hourly reporting this is numerically J ÷ 3600 — the hour-average watts used for + /// at-peak gain values in the SpaceSimulationResult path. + /// + /// Energy over the reporting interval [J]. + /// Interval length [s] (3600 for hourly reporting). + /// Average power [W]. + public static double JoulesPerIntervalToWatts(double joules, double intervalSeconds = 3600) + { + return joules / intervalSeconds; + } + + /// + /// Converts a raw ReportData value using the ReportDataDictionary Units as the + /// authority: "J" becomes hour-average watts (, + /// hourly reporting); all other units pass through unchanged. + /// public static double ConvertUnit(this DataTable dataTable, string name, string keyValue, double value) { string units = Units(dataTable, name, keyValue); @@ -12,7 +44,7 @@ public static double ConvertUnit(this DataTable dataTable, string name, string k switch (units.Trim()) { case "J": - value = value / 3600; + value = JoulesPerIntervalToWatts(value); break; } } @@ -20,4 +52,4 @@ public static double ConvertUnit(this DataTable dataTable, string name, string k return value; } } -} \ No newline at end of file +} diff --git a/SAM_OpenStudio/SAM.Core.OpenStudio/Query/DateTime.cs b/SAM_OpenStudio/SAM.Core.OpenStudio/Query/DateTime.cs index 79514e1..0098329 100644 --- a/SAM_OpenStudio/SAM.Core.OpenStudio/Query/DateTime.cs +++ b/SAM_OpenStudio/SAM.Core.OpenStudio/Query/DateTime.cs @@ -1,4 +1,7 @@ -using System; +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; using System.Collections.Generic; using System.Data; @@ -116,7 +119,12 @@ public static partial class Query } - return new DateTime(year_Temp, month_Temp, day_Temp, hour_Temp, minute_Temp, second_Temp); + // Raw EnergyPlus fields (hour 0–24, minute 0–60, end-of-interval) are + // normalised centrally; unrepresentable rows return null, never throw. + if (Core.Query.TryGetDateTime(year_Temp, month_Temp, day_Temp, hour_Temp, minute_Temp, second_Temp, deafultYear, out DateTime dateTime, out string _)) + { + return dateTime; + } } return null; diff --git a/SAM_OpenStudio/SAM.Core.OpenStudio/Query/EnergyPlusVersion.cs b/SAM_OpenStudio/SAM.Core.OpenStudio/Query/EnergyPlusVersion.cs new file mode 100644 index 0000000..18c67c2 --- /dev/null +++ b/SAM_OpenStudio/SAM.Core.OpenStudio/Query/EnergyPlusVersion.cs @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +namespace SAM.Core.OpenStudio +{ + public static partial class Query + { + /// + /// Version of the EnergyPlus engine the loaded OpenStudio SDK targets (for example "24.2.0"). + /// The simulation runner must verify output variable names against this version. + /// + /// EnergyPlus semantic version string. + public static string EnergyPlusVersion() + { + return global::OpenStudio.OpenStudioUtilitiesCore.energyPlusVersion(); + } + } +} diff --git a/SAM_OpenStudio/SAM.Core.OpenStudio/Query/OpenStudioCliPath.cs b/SAM_OpenStudio/SAM.Core.OpenStudio/Query/OpenStudioCliPath.cs new file mode 100644 index 0000000..9182bb9 --- /dev/null +++ b/SAM_OpenStudio/SAM.Core.OpenStudio/Query/OpenStudioCliPath.cs @@ -0,0 +1,131 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; +using System.IO; + +namespace SAM.Core.OpenStudio +{ + public static partial class Query + { + /// + /// Locates the OpenStudio CLI executable (openstudio.exe) used to run simulations. + /// Discovery order: + /// 1. explicit path (either the executable itself or an installation directory; a bin subdirectory is honoured); + /// 2. directories on the PATH environment variable; + /// 3. conventional direct installations (system drive root openstudio-* and %ProgramFiles%\OpenStudio*), newest first; + /// 4. Ladybug Tools bundled installation (%ProgramFiles%\ladybug_tools\openstudio). + /// + /// Optional explicit executable or installation directory path. + /// Full path to openstudio.exe or null when not found. + public static string OpenStudioCliPath(string path = null) + { + const string executableName = "openstudio.exe"; + + if (!string.IsNullOrWhiteSpace(path)) + { + if (File.Exists(path)) + { + return string.Equals(Path.GetFileName(path), executableName, StringComparison.OrdinalIgnoreCase) ? path : null; + } + + if (Directory.Exists(path)) + { + string candidate = Path.Combine(path, executableName); + if (File.Exists(candidate)) + { + return candidate; + } + + candidate = Path.Combine(path, "bin", executableName); + if (File.Exists(candidate)) + { + return candidate; + } + } + + return null; + } + + string pathVariable = Environment.GetEnvironmentVariable("PATH"); + if (!string.IsNullOrWhiteSpace(pathVariable)) + { + foreach (string directory in pathVariable.Split(Path.PathSeparator)) + { + if (string.IsNullOrWhiteSpace(directory)) + { + continue; + } + + string candidate; + try + { + candidate = Path.Combine(directory.Trim(), executableName); + } + catch (ArgumentException) + { + continue; + } + + if (File.Exists(candidate)) + { + return candidate; + } + } + } + + List installationDirectories = new List(); + + string systemRoot; + try + { + systemRoot = Path.GetPathRoot(Environment.GetFolderPath(Environment.SpecialFolder.System)); + } + catch (Exception) + { + systemRoot = null; + } + + if (!string.IsNullOrWhiteSpace(systemRoot) && Directory.Exists(systemRoot)) + { + installationDirectories.AddRange(InstallationDirectories(systemRoot, "openstudio*")); + } + + string programFiles = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles); + if (!string.IsNullOrWhiteSpace(programFiles) && Directory.Exists(programFiles)) + { + installationDirectories.AddRange(InstallationDirectories(programFiles, "OpenStudio*")); + installationDirectories.Add(Path.Combine(programFiles, "ladybug_tools", "openstudio")); + } + + foreach (string installationDirectory in installationDirectories) + { + string candidate = Path.Combine(installationDirectory, "bin", executableName); + if (File.Exists(candidate)) + { + return candidate; + } + } + + return null; + } + + private static IEnumerable InstallationDirectories(string directory, string searchPattern) + { + List result = new List(); + try + { + result.AddRange(Directory.GetDirectories(directory, searchPattern)); + } + catch (Exception) + { + return result; + } + + result.Sort(StringComparer.OrdinalIgnoreCase); + result.Reverse(); + return result; + } + } +} diff --git a/SAM_OpenStudio/SAM.Core.OpenStudio/Query/OpenStudioName.cs b/SAM_OpenStudio/SAM.Core.OpenStudio/Query/OpenStudioName.cs new file mode 100644 index 0000000..beda712 --- /dev/null +++ b/SAM_OpenStudio/SAM.Core.OpenStudio/Query/OpenStudioName.cs @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; + +namespace SAM.Core.OpenStudio +{ + public static partial class Query + { + /// + /// Builds the deterministic OpenStudio object name for a SAM object: + /// SAM_<ObjectType>_<SanitizedName>_<GuidFirst8> + /// (for example SAM_Space_Office_04_72a6f932). Cross-references and tests must use these + /// names, never OpenStudio-generated handles. + /// + /// SAM type name (for example "Space"). + /// SAM object name; empty or null names are omitted from the result. + /// SAM object Guid; its first 8 hex digits suffix the name. + /// Deterministic OpenStudio object name. + public static string OpenStudioName(string objectType, string name, Guid guid) + { + string sanitizedObjectType = SanitizeName(objectType); + if (string.IsNullOrWhiteSpace(sanitizedObjectType)) + { + sanitizedObjectType = "Object"; + } + + string sanitizedName = SanitizeName(name); + + string result = "SAM_" + sanitizedObjectType; + if (!string.IsNullOrWhiteSpace(sanitizedName)) + { + result += "_" + sanitizedName; + } + + return result + "_" + guid.ToString("N").Substring(0, 8); + } + + /// + /// Builds the deterministic OpenStudio object name for a SAM object from its runtime type, + /// name and Guid. See . + /// + /// SAM object; null returns null. + /// Deterministic OpenStudio object name, or null. + public static string OpenStudioName(this SAMObject sAMObject) + { + if (sAMObject == null) + { + return null; + } + + return OpenStudioName(sAMObject.GetType().Name, sAMObject.Name, sAMObject.Guid); + } + } +} diff --git a/SAM_OpenStudio/SAM.Core.OpenStudio/Query/OpenStudioVersion.cs b/SAM_OpenStudio/SAM.Core.OpenStudio/Query/OpenStudioVersion.cs new file mode 100644 index 0000000..f3525c4 --- /dev/null +++ b/SAM_OpenStudio/SAM.Core.OpenStudio/Query/OpenStudioVersion.cs @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +namespace SAM.Core.OpenStudio +{ + public static partial class Query + { + /// + /// Version of the loaded OpenStudio SDK (for example "3.10.0"). + /// + /// OpenStudio SDK semantic version string. + public static string OpenStudioVersion() + { + return global::OpenStudio.OpenStudioUtilitiesCore.openStudioVersion(); + } + } +} diff --git a/SAM_OpenStudio/SAM.Core.OpenStudio/Query/SAMIdentity.cs b/SAM_OpenStudio/SAM.Core.OpenStudio/Query/SAMIdentity.cs new file mode 100644 index 0000000..263cf2d --- /dev/null +++ b/SAM_OpenStudio/SAM.Core.OpenStudio/Query/SAMIdentity.cs @@ -0,0 +1,96 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; + +namespace SAM.Core.OpenStudio +{ + public static partial class Query + { + /// + /// Reads the full SAM Guid previously stamped on an OpenStudio object by + /// . + /// + /// Only a syntactically valid, non-empty Guid is accepted. A third-party OSM carries no + /// such feature and returns false — that is the normal case, not an error. + /// + /// + /// OpenStudio object; null returns false. + /// The restored SAM Guid when present and valid. + /// True when a valid full SAM Guid was found. + public static bool TryGetSAMGuid(global::OpenStudio.ModelObject modelObject, out Guid guid) + { + guid = Guid.Empty; + + string value; + if (!TryGetSAMFeature(modelObject, OpenStudioIdentityKeys.Guid, out value)) + { + return false; + } + + return Guid.TryParse(value, out guid) && guid != Guid.Empty; + } + + /// + /// Reads the original (unsanitised) SAM name stamped on an OpenStudio object. Falls back + /// to nothing — the caller decides whether to use the OpenStudio object name instead. + /// + /// OpenStudio object; null returns false. + /// The restored SAM name when present and non-empty. + public static bool TryGetSAMName(global::OpenStudio.ModelObject modelObject, out string name) + { + return TryGetSAMFeature(modelObject, OpenStudioIdentityKeys.Name, out name); + } + + /// + /// Reads the SAM runtime type name stamped on an OpenStudio object. Used to reject + /// identity metadata that belongs to a different SAM object kind rather than restoring a + /// Guid onto the wrong type. + /// + /// OpenStudio object; null returns false. + /// The restored SAM type name when present and non-empty. + public static bool TryGetSAMType(global::OpenStudio.ModelObject modelObject, out string type) + { + return TryGetSAMFeature(modelObject, OpenStudioIdentityKeys.Type, out type); + } + + /// + /// Reads a namespaced SAM feature from an OpenStudio object's AdditionalProperties. + /// Returns false when the object has no AdditionalProperties at all — checked with + /// hasAdditionalProperties() first, so reading identity never materialises an + /// empty AdditionalProperties object on a third-party model. + /// + /// OpenStudio object; null returns false. + /// Feature name, see . + /// The feature value when present and non-empty. + public static bool TryGetSAMFeature(global::OpenStudio.ModelObject modelObject, string key, out string value) + { + value = null; + + if (modelObject == null || string.IsNullOrWhiteSpace(key)) + { + return false; + } + + if (!modelObject.hasAdditionalProperties()) + { + return false; + } + + global::OpenStudio.AdditionalProperties additionalProperties = modelObject.additionalProperties(); + if (additionalProperties == null || !additionalProperties.hasFeature(key)) + { + return false; + } + + global::OpenStudio.OptionalString optionalString = additionalProperties.getFeatureAsString(key); + if (optionalString == null || optionalString.isNull()) + { + return false; + } + + value = optionalString.get(); + return !string.IsNullOrWhiteSpace(value); + } + } +} diff --git a/SAM_OpenStudio/SAM.Core.OpenStudio/Query/SanitizeName.cs b/SAM_OpenStudio/SAM.Core.OpenStudio/Query/SanitizeName.cs new file mode 100644 index 0000000..9180a46 --- /dev/null +++ b/SAM_OpenStudio/SAM.Core.OpenStudio/Query/SanitizeName.cs @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Text; + +namespace SAM.Core.OpenStudio +{ + public static partial class Query + { + /// + /// Sanitizes a name for use in OpenStudio/EnergyPlus object names: characters that break + /// IDF parsing (comma, semicolon, exclamation mark), whitespace and control characters are + /// replaced with underscores, as are single and double quotes (they flow into EnergyPlus + /// report keys and would break SQL literal quoting downstream); runs of underscores are + /// collapsed, and leading/trailing underscores are trimmed. Deterministic: equal inputs + /// always produce equal outputs. + /// + /// Name to sanitize; null returns null. + /// Sanitized name (possibly empty), or null when input is null. + public static string SanitizeName(string name) + { + if (name == null) + { + return null; + } + + StringBuilder stringBuilder = new StringBuilder(name.Length); + bool previousUnderscore = false; + foreach (char @char in name) + { + bool invalid = @char == ',' || @char == ';' || @char == '!' || @char == '\'' || @char == '"' || char.IsWhiteSpace(@char) || char.IsControl(@char) || @char == '_'; + if (invalid) + { + if (!previousUnderscore) + { + stringBuilder.Append('_'); + previousUnderscore = true; + } + + continue; + } + + stringBuilder.Append(@char); + previousUnderscore = false; + } + + return stringBuilder.ToString().Trim('_'); + } + } +} diff --git a/SAM_OpenStudio/SAM.Core.OpenStudio/Query/TimeIndexDictionary.cs b/SAM_OpenStudio/SAM.Core.OpenStudio/Query/TimeIndexDictionary.cs index 18f21b6..48dc655 100644 --- a/SAM_OpenStudio/SAM.Core.OpenStudio/Query/TimeIndexDictionary.cs +++ b/SAM_OpenStudio/SAM.Core.OpenStudio/Query/TimeIndexDictionary.cs @@ -1,4 +1,7 @@ -using System; +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; using System.Collections.Generic; using System.Data; @@ -7,6 +10,18 @@ namespace SAM.Core.OpenStudio public static partial class Query { public static SortedDictionary TimeIndexDictionary(this DataTable dataTable, int environemntPeriodIndex, short year = 2017) + { + return TimeIndexDictionary(dataTable, environemntPeriodIndex, year, null); + } + + /// + /// Maps TimeIndex values to normalised interval-end timestamps for one environment. + /// Raw EnergyPlus rows (hour 0–24, minute 0–60, year 0 on sizing environments) are + /// normalised through ; rows that cannot form a valid + /// calendar date are skipped and reported through + /// instead of throwing. + /// + public static SortedDictionary TimeIndexDictionary(this DataTable dataTable, int environemntPeriodIndex, short year, IList diagnostics) { if (dataTable == null || environemntPeriodIndex == -1) { @@ -82,22 +97,17 @@ public static SortedDictionary TimeIndexDictionary(this DataTable continue; } - if (year == 0) - { - year_Temp = year; - } - - if (!Core.Query.TryConvert(dataRow[index_Month], out byte month)) + if (!Core.Query.TryConvert(dataRow[index_Month], out int month)) { continue; } - if (!Core.Query.TryConvert(dataRow[index_Day], out byte day)) + if (!Core.Query.TryConvert(dataRow[index_Day], out int day)) { continue; } - if (!Core.Query.TryConvert(dataRow[index_Hour], out byte hour)) + if (!Core.Query.TryConvert(dataRow[index_Hour], out int hour)) { continue; } @@ -107,7 +117,7 @@ public static SortedDictionary TimeIndexDictionary(this DataTable continue; } - byte minute = 0; + int minute = 0; if (index_Minute != -1) { if (!Core.Query.TryConvert(dataRow[index_Minute], out minute)) @@ -116,7 +126,7 @@ public static SortedDictionary TimeIndexDictionary(this DataTable } } - byte second = 0; + int second = 0; if (index_Second != -1) { if (!Core.Query.TryConvert(dataRow[index_Second], out second)) @@ -125,7 +135,13 @@ public static SortedDictionary TimeIndexDictionary(this DataTable } } - result[timeIndex] = new DateTime(year, month, day, hour - 1, minute, second); + if (!Core.Query.TryGetDateTime(year_Temp, month, day, hour, minute, second, year, out DateTime dateTime, out string diagnostic)) + { + diagnostics?.Add(string.Format("TimeIndex {0} (environment {1}): {2}", timeIndex, environemntPeriodIndex, diagnostic)); + continue; + } + + result[timeIndex] = dateTime; } return result; diff --git a/SAM_OpenStudio/SAM.Core.OpenStudio/SAM.Core.OpenStudio.csproj b/SAM_OpenStudio/SAM.Core.OpenStudio/SAM.Core.OpenStudio.csproj index 5ad7dc7..4bf5873 100644 --- a/SAM_OpenStudio/SAM.Core.OpenStudio/SAM.Core.OpenStudio.csproj +++ b/SAM_OpenStudio/SAM.Core.OpenStudio/SAM.Core.OpenStudio.csproj @@ -46,7 +46,7 @@ - 3.8.0 + 3.10.0 diff --git a/SAM_OpenStudio/SAM.Core.OpenStudio/Variables/OpenStudioDiagnosticCodes.cs b/SAM_OpenStudio/SAM.Core.OpenStudio/Variables/OpenStudioDiagnosticCodes.cs new file mode 100644 index 0000000..2db2a1b --- /dev/null +++ b/SAM_OpenStudio/SAM.Core.OpenStudio/Variables/OpenStudioDiagnosticCodes.cs @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +namespace SAM.Core.OpenStudio +{ + /// + /// Stable diagnostic codes used across the SAM → OpenStudio conversion, defined by the + /// MVP implementation plan (docs/SAM_OpenStudio_MVP_Implementation_Plan.md, section 6). + /// + public static class OpenStudioDiagnosticCodes + { + /// Invalid or non-planar boundary. + public const string GeometryInvalidBoundary = "SAM-OS-GEO-001"; + + /// Duplicate or collinear vertices removed. + public const string GeometryVerticesCleaned = "SAM-OS-GEO-002"; + + /// Non-convex shadow-casting surface: PolygonClipping raises an EnergyPlus severe DetermineShadowingCombinations error; split the panel or use PixelCounting with a GPU. + public const string GeometryNonConvexCasting = "SAM-OS-GEO-003"; + + /// Missing adjacent surface. + public const string AdjacencyMissingSurface = "SAM-OS-ADJ-001"; + + /// Unsupported material. + public const string MaterialUnsupported = "SAM-OS-MAT-001"; + + /// Unsupported material parameter (e.g. blind flag without slat geometry). + public const string MaterialUnsupportedParameter = "SAM-OS-MAT-002"; + + /// Missing construction layer. + public const string ConstructionMissingLayer = "SAM-OS-CON-001"; + + /// Unsupported construction/aperture parameter (frame, shade, opening data). + public const string ConstructionUnsupportedParameter = "SAM-OS-CON-002"; + + /// Missing profile. + public const string ScheduleMissingProfile = "SAM-OS-SCH-001"; + + /// Unsupported internal-condition parameter. + public const string InternalConditionUnsupportedParameter = "SAM-OS-IC-001"; + + /// Conditioned zone missing setpoints, or HVAC-dependent data (emitter characteristics, exhaust flows) deferred to the detailed-HVAC programme. + public const string HvacMissingSetpoints = "SAM-OS-HVAC-001"; + + /// OpenStudio CLI failed. + public const string RunCliFailed = "SAM-OS-RUN-001"; + + /// Weather/design-day data issue or documented fallback (ground temperatures, design days). + public const string WeatherDataIssue = "SAM-OS-RUN-002"; + + /// Result-extraction limitation (e.g. peaks/series assume hourly reporting under a non-hourly OutputVariableFrequency). + public const string ResultExtractionLimitation = "SAM-OS-RUN-003"; + + /// Unsupported or rejected simulation-setting value (e.g. shading calculation method); workflow issues such as unusable measure directories. + public const string SimulationSettingsUnsupported = "SAM-OS-SET-001"; + + /// EnergyPlus severe error. + public const string EnergyPlusSevereError = "SAM-OS-EPLUS-001"; + } +} diff --git a/SAM_OpenStudio/SAM.Core.OpenStudio/Variables/OpenStudioIdentityKeys.cs b/SAM_OpenStudio/SAM.Core.OpenStudio/Variables/OpenStudioIdentityKeys.cs new file mode 100644 index 0000000..c3116ef --- /dev/null +++ b/SAM_OpenStudio/SAM.Core.OpenStudio/Variables/OpenStudioIdentityKeys.cs @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +namespace SAM.Core.OpenStudio +{ + /// + /// Namespaced OS:AdditionalProperties feature names carrying SAM object identity + /// through an OSM round trip. + /// + /// The deterministic object name SAM_<Type>_<Name>_<GuidFirst8> + /// () is a stable *display and + /// matching* key, not an identity: 8 hex characters are 32 bits of a 128-bit Guid and cannot + /// reconstruct it. These features are therefore the only lossless identity channel, and the + /// reverse importer restores a SAM Guid from alone. + /// + /// + /// Writing them is additive: AdditionalProperties is a separate OSM object attached to + /// the owner, so no existing field, object name or EnergyPlus input changes. Third-party OSM + /// files simply carry none of them, and their absence is never a diagnostic. + /// + /// + public static class OpenStudioIdentityKeys + { + /// Full SAM Guid, Guid.ToString("D"). + public const string Guid = "SAM.Guid"; + + /// SAM runtime type name (for example "Space", "Panel", "Construction"). + public const string Type = "SAM.Type"; + + /// Original, unsanitised SAM object name. + public const string Name = "SAM.Name"; + } +} diff --git a/SAM_OpenStudio/SAM.Core.OpenStudio/Variables/OpenStudioImportDiagnosticCodes.cs b/SAM_OpenStudio/SAM.Core.OpenStudio/Variables/OpenStudioImportDiagnosticCodes.cs new file mode 100644 index 0000000..885ec04 --- /dev/null +++ b/SAM_OpenStudio/SAM.Core.OpenStudio/Variables/OpenStudioImportDiagnosticCodes.cs @@ -0,0 +1,124 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +namespace SAM.Core.OpenStudio +{ + /// + /// Stable diagnostic codes used by the reverse OpenStudio → SAM import, defined by + /// docs/openstudio-to-sam-import-audit.md §5. The SAM-OSI-* prefix ("OpenStudio + /// import") keeps them disjoint from the forward SAM-OS-* codes in + /// , so a consumer can tell which direction produced a + /// diagnostic from the code alone and neither list has to be renumbered when the other grows. + /// + public static class OpenStudioImportDiagnosticCodes + { + /// Input path is null, empty or does not exist. + public const string InputPathInvalid = "SAM-OSI-IN-001"; + + /// Input file extension is neither .osm nor .osw. + public const string InputExtensionUnsupported = "SAM-OSI-IN-002"; + + /// The OSM could not be loaded. + public const string OsmLoadFailed = "SAM-OSI-OSM-001"; + + /// OSM version translation failed, or the VersionTranslator reported errors/warnings. + public const string OsmVersionTranslationFailed = "SAM-OSI-OSM-002"; + + /// The OSW JSON could not be parsed. + public const string OswParseFailed = "SAM-OSI-OSW-001"; + + /// The OSW declares no seed_file. + public const string OswSeedMissing = "SAM-OSI-OSW-002"; + + /// The OSW seed_file could not be resolved on disk. + public const string OswSeedNotFound = "SAM-OSI-OSW-003"; + + /// The workflow was not executed, so its measures were not applied to the imported model. + public const string OswWorkflowNotExecuted = "SAM-OSI-OSW-004"; + + /// Workflow execution failed. + public const string OswExecutionFailed = "SAM-OSI-OSW-005"; + + /// The final post-model-measure OSM could not be located after the run. + public const string OswFinalOsmNotFound = "SAM-OSI-OSW-006"; + + /// The workflow contains EnergyPlus measures whose changes exist only in the generated IDF and cannot be represented in the OSM. + public const string OswEnergyPlusMeasureNotRepresentable = "SAM-OSI-OSW-007"; + + /// + /// The workflow was executed and its final post-model-measure OSM was located and + /// imported. The counterpart of , which states the + /// opposite — the two must never share a code, or a reader cannot tell from the code + /// whether the measures were applied. + /// + public const string OswWorkflowExecuted = "SAM-OSI-OSW-008"; + + /// + /// The workflow ran successfully but produced no EnergyPlus simulation results. Relevant + /// only to a simulation; an import needs the final OpenStudio model, not the results, so + /// this is informational and never invalidates the imported model. + /// + public const string OswNoSimulationResults = "SAM-OSI-OSW-009"; + + /// Geometry could not be converted (degenerate, non-planar, too few vertices, below minimum area, aperture not contained by its host). + public const string GeometryInvalid = "SAM-OSI-GEO-001"; + + /// + /// Duplicate or collinear vertices were removed while normalising a boundary. Purely + /// cosmetic — a collinear vertex lies on the edge it splits, so removing it leaves the + /// polygon's shape, area and normal identical. Kept distinct from + /// (and reported at Information severity) so routine + /// normalisation of geometry OpenStudio happens to store with redundant points is not + /// mistaken for a defect. Mirrors the forward SAM-OS-GEO-002. + /// + public const string GeometryVerticesCleaned = "SAM-OSI-GEO-002"; + + /// Adjacency was resolved by validated geometric matching because no OpenStudio adjacency handle was available. + public const string AdjacencyGeometricFallback = "SAM-OSI-ADJ-001"; + + /// Adjacency pairing failed; the surface was not merged with a partner. + public const string AdjacencyPairingFailed = "SAM-OSI-ADJ-002"; + + /// Unsupported outside boundary condition. + public const string BoundaryConditionUnsupported = "SAM-OSI-BC-001"; + + /// Unsupported subsurface type. + public const string SubSurfaceUnsupported = "SAM-OSI-SUB-001"; + + /// Unsupported material family. + public const string MaterialUnsupported = "SAM-OSI-MAT-001"; + + /// Unsupported construction kind. + public const string ConstructionUnsupported = "SAM-OSI-CON-001"; + + /// Unsupported schedule kind, or a schedule that could not be expanded to hourly values. + public const string ScheduleUnsupported = "SAM-OSI-SCH-001"; + + /// Unsupported load or control object. + public const string LoadUnsupported = "SAM-OSI-LOAD-001"; + + /// Conflicting space-type and space-level load assignment. + public const string LoadAssignmentConflict = "SAM-OSI-LOAD-002"; + + /// Detailed HVAC object encountered and deliberately not imported. + public const string HvacUnsupported = "SAM-OSI-HVAC-001"; + + /// A thermal zone contains more than one OpenStudio space. + public const string ZoneMultiSpace = "SAM-OSI-ZONE-001"; + + /// Orphaned space, or a space/zone with incomplete geometry. + public const string ZoneIncomplete = "SAM-OSI-ZONE-002"; + + /// Invalid or duplicate SAM identity metadata; a new SAM Guid was issued. + public const string IdentityCollision = "SAM-OSI-ID-001"; + + /// Weather, site or design-day limitation. + public const string WeatherLimitation = "SAM-OSI-WEA-001"; + + /// Simulation setting with no SAM equivalent. + public const string SimulationSettingUnsupported = "SAM-OSI-SET-001"; + + /// A documented approximation was applied. + public const string ApproximationApplied = "SAM-OSI-APX-001"; + } +} diff --git a/SAM_OpenStudio/SAM.Geometry.OpenStudio/Classes/Test.cs b/SAM_OpenStudio/SAM.Geometry.OpenStudio/Classes/Test.cs deleted file mode 100644 index a330302..0000000 --- a/SAM_OpenStudio/SAM.Geometry.OpenStudio/Classes/Test.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace SAM.Geometry.OpenStudio -{ - internal class Test - { - } -} diff --git a/SAM_OpenStudio/SAM.Geometry.OpenStudio/Convert/ToOpenStudio/Point3d.cs b/SAM_OpenStudio/SAM.Geometry.OpenStudio/Convert/ToOpenStudio/Point3d.cs new file mode 100644 index 0000000..4aafaf1 --- /dev/null +++ b/SAM_OpenStudio/SAM.Geometry.OpenStudio/Convert/ToOpenStudio/Point3d.cs @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +namespace SAM.Geometry.OpenStudio +{ + public static partial class Convert + { + /// + /// Converts a SAM Point3D to an OpenStudio Point3d. Coordinates are copied unchanged: + /// SAM global coordinates in metres are retained (no local transformations, plan §8). + /// + /// SAM point; null returns null. + /// OpenStudio point, or null. + public static global::OpenStudio.Point3d ToOpenStudio(this Spatial.Point3D point3D) + { + if (point3D == null) + { + return null; + } + + return new global::OpenStudio.Point3d(point3D.X, point3D.Y, point3D.Z); + } + } +} diff --git a/SAM_OpenStudio/SAM.Geometry.OpenStudio/Convert/ToOpenStudio/Point3dVector.cs b/SAM_OpenStudio/SAM.Geometry.OpenStudio/Convert/ToOpenStudio/Point3dVector.cs new file mode 100644 index 0000000..645205b --- /dev/null +++ b/SAM_OpenStudio/SAM.Geometry.OpenStudio/Convert/ToOpenStudio/Point3dVector.cs @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Collections.Generic; + +namespace SAM.Geometry.OpenStudio +{ + public static partial class Convert + { + /// + /// Converts an ordered SAM point collection to an OpenStudio Point3dVector, preserving + /// order. No cleaning is performed here — see Query.CleanVertices and the Face3D overload. + /// + /// Ordered SAM points; null returns null; null entries are skipped. + /// OpenStudio point vector, or null. + public static global::OpenStudio.Point3dVector ToOpenStudio(this IEnumerable point3Ds) + { + if (point3Ds == null) + { + return null; + } + + global::OpenStudio.Point3dVector result = new global::OpenStudio.Point3dVector(); + foreach (Spatial.Point3D point3D in point3Ds) + { + global::OpenStudio.Point3d point3d = point3D.ToOpenStudio(); + if (point3d == null) + { + continue; + } + + result.Add(point3d); + } + + return result; + } + } +} diff --git a/SAM_OpenStudio/SAM.Geometry.OpenStudio/Convert/ToOpenStudio/Polygon.cs b/SAM_OpenStudio/SAM.Geometry.OpenStudio/Convert/ToOpenStudio/Polygon.cs new file mode 100644 index 0000000..af8392e --- /dev/null +++ b/SAM_OpenStudio/SAM.Geometry.OpenStudio/Convert/ToOpenStudio/Polygon.cs @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Collections.Generic; +using SAM.Geometry.Spatial; + +namespace SAM.Geometry.OpenStudio +{ + public static partial class Convert + { + /// + /// Converts the external edge of a SAM Face3D to an OpenStudio polygon (Point3dVector) + /// after vertex cleaning (duplicate closing vertex, consecutive duplicates, collinear + /// vertices). Internal edges (holes) are NOT converted here — apertures are converted as + /// SubSurfaces; a Face3D with other internal edges must be handled by the caller. + /// Returns null when fewer than three vertices remain after cleaning. + /// + /// SAM face; null returns null. + /// Distance tolerance [m] for duplicate-vertex removal. + /// Angle tolerance [rad] for collinear-vertex removal. + /// Cleaned OpenStudio point vector, or null. + public static global::OpenStudio.Point3dVector ToOpenStudio(this Face3D face3D, double distanceTolerance, double angleTolerance) + { + if (face3D == null) + { + return null; + } + + ISegmentable3D segmentable3D = face3D.GetExternalEdge3D() as ISegmentable3D; + if (segmentable3D == null) + { + return null; + } + + List point3Ds = Query.CleanVertices(segmentable3D.GetPoints(), distanceTolerance, angleTolerance); + if (point3Ds == null || point3Ds.Count < 3) + { + return null; + } + + return point3Ds.ToOpenStudio(); + } + } +} diff --git a/SAM_OpenStudio/SAM.Geometry.OpenStudio/Convert/ToSAM/Face3D.cs b/SAM_OpenStudio/SAM.Geometry.OpenStudio/Convert/ToSAM/Face3D.cs new file mode 100644 index 0000000..b2297ad --- /dev/null +++ b/SAM_OpenStudio/SAM.Geometry.OpenStudio/Convert/ToSAM/Face3D.cs @@ -0,0 +1,165 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Collections.Generic; +using SAM.Geometry.Spatial; + +namespace SAM.Geometry.OpenStudio +{ + public static partial class Convert + { + /// + /// Converts an OpenStudio PlanarSurface (Surface, SubSurface or ShadingSurface) into a + /// SAM Face3D, applying to reach the target coordinate + /// system and running the same validation the forward direction applies + /// () before anything is built. + /// + /// Nothing is repaired: a boundary that fails validation returns null with the reasons in + /// , so the caller can name the offending OpenStudio object + /// and handle rather than emit silently-wrong geometry. + /// + /// + /// Winding is preserved exactly as OpenStudio stores it (counter-clockwise viewed from + /// outside, giving an outward normal). The importer relies on that normal to classify + /// floors versus ceilings, so re-winding here would destroy information. + /// + /// + /// OpenStudio planar surface; null returns null. + /// Distance tolerance [m]. + /// Angle tolerance [rad]. + /// Minimum polygon area [m²]. + /// Receives cleaning and validation diagnostics; never null on return. + /// Group → target-space transformation; null means none. + /// The converted face, or null when the boundary is unusable. + public static Face3D ToSAM(this global::OpenStudio.PlanarSurface planarSurface, double distanceTolerance, double angleTolerance, double minimumArea, out List diagnostics, global::OpenStudio.Transformation transformation = null) + { + diagnostics = new List(); + + if (planarSurface == null) + { + return null; + } + + global::OpenStudio.Point3dVector point3dVector; + try + { + point3dVector = planarSurface.vertices(); + } + catch (System.Exception exception) + { + diagnostics.Add(new Core.OpenStudio.OpenStudioDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.GeometryInvalid, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("The vertices could not be read ({0}: {1})", exception.GetType().Name, exception.Message))); + return null; + } + + List point3Ds = point3dVector.ToSAM(transformation); + if (point3Ds == null) + { + diagnostics.Add(new Core.OpenStudio.OpenStudioDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.GeometryInvalid, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "The vertices could not be transformed into the target coordinate system")); + return null; + } + + return ToSAM(point3Ds, distanceTolerance, angleTolerance, minimumArea, diagnostics); + } + + /// + /// Builds a validated SAM Face3D from ordered points already in the target coordinate + /// system. Shared by surfaces, subsurfaces and shading surfaces so all three obey one + /// validation policy. + /// + /// Ordered boundary points. + /// Distance tolerance [m]. + /// Angle tolerance [rad]. + /// Minimum polygon area [m²]. + /// Receives cleaning and validation diagnostics; required. + /// The converted face, or null when the boundary is unusable. + public static Face3D ToSAM(IEnumerable point3Ds, double distanceTolerance, double angleTolerance, double minimumArea, IList diagnostics) + { + if (point3Ds == null || diagnostics == null) + { + return null; + } + + // Reuse the forward validator so both directions reject the same geometry. Its codes + // are forward codes, so they are re-badged with the import equivalents: a consumer + // filtering on SAM-OSI-* must see every import geometry event. + // + // Vertex cleaning keeps its own code and drops to Information: removing a collinear + // vertex leaves the polygon's shape, area and normal identical, so reporting it at the + // same code and severity as genuinely invalid geometry buries the real failures among + // routine normalisation (a real model produces one per surface). + bool valid = true; + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in Query.ValidatePolygon(point3Ds, distanceTolerance, angleTolerance, minimumArea)) + { + bool verticesCleaned = diagnostic.Code == Core.OpenStudio.OpenStudioDiagnosticCodes.GeometryVerticesCleaned; + + diagnostics.Add(new Core.OpenStudio.OpenStudioDiagnostic( + verticesCleaned ? Core.OpenStudio.OpenStudioImportDiagnosticCodes.GeometryVerticesCleaned : Core.OpenStudio.OpenStudioImportDiagnosticCodes.GeometryInvalid, + verticesCleaned ? Core.OpenStudio.OpenStudioDiagnosticSeverity.Information : diagnostic.Severity, + diagnostic.Message)); + + if (diagnostic.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error) + { + valid = false; + } + } + + if (!valid) + { + return null; + } + + List cleaned = Query.CleanVertices(point3Ds, distanceTolerance, angleTolerance); + if (cleaned == null || cleaned.Count < 3) + { + diagnostics.Add(new Core.OpenStudio.OpenStudioDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.GeometryInvalid, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "The boundary collapses to fewer than three vertices after cleaning")); + return null; + } + + try + { + Polygon3D polygon3D = new Polygon3D(cleaned, distanceTolerance); + if (polygon3D == null) + { + diagnostics.Add(new Core.OpenStudio.OpenStudioDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.GeometryInvalid, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "The boundary could not be built into a SAM polygon")); + return null; + } + + return new Face3D(polygon3D); + } + catch (System.Exception exception) + { + diagnostics.Add(new Core.OpenStudio.OpenStudioDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.GeometryInvalid, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("The boundary could not be built into a SAM face ({0}: {1})", exception.GetType().Name, exception.Message))); + return null; + } + } + + /// + /// Outward normal of an OpenStudio planar surface expressed in the target coordinate + /// system. Derived from the transformed vertices with the Newell method rather than from + /// PlanarSurface.outwardNormal(), because the native normal is in group + /// coordinates and would be wrong for any rotated or non-origin group. + /// + /// OpenStudio planar surface; null returns null. + /// Group → target-space transformation; null means none. + /// Unnormalized outward normal, or null. + public static Vector3D ToSAM_Normal(this global::OpenStudio.PlanarSurface planarSurface, global::OpenStudio.Transformation transformation = null) + { + if (planarSurface == null) + { + return null; + } + + List point3Ds; + try + { + point3Ds = planarSurface.vertices().ToSAM(transformation); + } + catch (System.Exception) + { + return null; + } + + return Query.Normal(point3Ds); + } + } +} diff --git a/SAM_OpenStudio/SAM.Geometry.OpenStudio/Convert/ToSAM/Point3D.cs b/SAM_OpenStudio/SAM.Geometry.OpenStudio/Convert/ToSAM/Point3D.cs new file mode 100644 index 0000000..2811cc9 --- /dev/null +++ b/SAM_OpenStudio/SAM.Geometry.OpenStudio/Convert/ToSAM/Point3D.cs @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Collections.Generic; +using SAM.Geometry.Spatial; + +namespace SAM.Geometry.OpenStudio +{ + public static partial class Convert + { + /// + /// Converts an OpenStudio Point3d to a SAM Point3D. Coordinates are copied unchanged + /// (both are metres); any coordinate-system change is the caller's business — see + /// . + /// + /// OpenStudio point; null returns null. + /// SAM point, or null. + public static Point3D ToSAM(this global::OpenStudio.Point3d point3d) + { + if (point3d == null) + { + return null; + } + + return new Point3D(point3d.x(), point3d.y(), point3d.z()); + } + + /// + /// Converts an OpenStudio Point3dVector to SAM points, preserving order. + /// + /// is applied first when supplied. This matters: + /// OpenStudio surface vertices are stored in the coordinate system of their + /// PlanarSurfaceGroup (the owning Space or ShadingSurfaceGroup), NOT in world + /// coordinates. A space with a non-zero origin or a relative-north rotation therefore + /// produces vertices that are meaningless until the group transformation is applied. + /// SAM-authored OSM files happen to place every space at the origin, so the + /// transformation is the identity there and round trips are unaffected — but a + /// third-party OSM would import as overlapping geometry without this. + /// + /// No cleaning is performed here; see . + /// + /// OpenStudio points; null returns null; null entries are skipped. + /// Group → target-space transformation; null means no transformation. + /// Ordered SAM points, or null. + public static List ToSAM(this global::OpenStudio.Point3dVector point3dVector, global::OpenStudio.Transformation transformation = null) + { + if (point3dVector == null) + { + return null; + } + + global::OpenStudio.Point3dVector transformed = point3dVector; + if (transformation != null) + { + // A transformation the native layer rejects must not silently yield untransformed + // (i.e. wrong) geometry — the caller validates the result and reports it. + transformed = transformation.Multiply(point3dVector); + if (transformed == null) + { + return null; + } + } + + List result = new List(); + foreach (global::OpenStudio.Point3d point3d in transformed) + { + Point3D point3D = point3d.ToSAM(); + if (point3D == null) + { + continue; + } + + result.Add(point3D); + } + + return result; + } + } +} diff --git a/SAM_OpenStudio/SAM.Geometry.OpenStudio/Query/Area.cs b/SAM_OpenStudio/SAM.Geometry.OpenStudio/Query/Area.cs new file mode 100644 index 0000000..0d6ec98 --- /dev/null +++ b/SAM_OpenStudio/SAM.Geometry.OpenStudio/Query/Area.cs @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; +using SAM.Geometry.Spatial; + +namespace SAM.Geometry.OpenStudio +{ + public static partial class Query + { + /// + /// Area of a closed (assumed planar) polygon, computed as half the magnitude of the + /// Newell normal. Winding-independent (always non-negative); use + /// for orientation. + /// Returns double.NaN for null input or fewer than three vertices. + /// + /// Ordered polygon vertices. + /// Polygon area [m²], or NaN. + public static double Area(IEnumerable point3Ds) + { + Vector3D normal = Normal(point3Ds); + if (normal == null) + { + return double.NaN; + } + + return 0.5 * Math.Sqrt(normal.X * normal.X + normal.Y * normal.Y + normal.Z * normal.Z); + } + } +} diff --git a/SAM_OpenStudio/SAM.Geometry.OpenStudio/Query/CleanVertices.cs b/SAM_OpenStudio/SAM.Geometry.OpenStudio/Query/CleanVertices.cs new file mode 100644 index 0000000..467208b --- /dev/null +++ b/SAM_OpenStudio/SAM.Geometry.OpenStudio/Query/CleanVertices.cs @@ -0,0 +1,111 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; +using SAM.Geometry.Spatial; + +namespace SAM.Geometry.OpenStudio +{ + public static partial class Query + { + /// + /// Cleans an ordered closed-polygon vertex list for OpenStudio surface creation: + /// removes null entries, consecutive duplicates within the distance tolerance (including + /// the duplicate closing vertex), and collinear or spike vertices within the angle + /// tolerance. The polygon is treated as closed (first–last wraparound). The input is not + /// modified. The result may contain fewer than three vertices — callers must validate. + /// + /// Ordered polygon vertices; null returns null. + /// Distance tolerance [m] for duplicate removal. + /// Angle tolerance [rad] for collinearity removal. + /// New cleaned vertex list, or null. + public static List CleanVertices(IEnumerable point3Ds, double distanceTolerance, double angleTolerance) + { + if (point3Ds == null) + { + return null; + } + + List result = new List(); + foreach (Point3D point3D in point3Ds) + { + if (point3D == null) + { + continue; + } + + if (result.Count > 0 && Distance(result[result.Count - 1], point3D) <= distanceTolerance) + { + continue; + } + + result.Add(point3D); + } + + while (result.Count > 1 && Distance(result[0], result[result.Count - 1]) <= distanceTolerance) + { + result.RemoveAt(result.Count - 1); + } + + if (result.Count < 3) + { + return result; + } + + double sinAngleTolerance = Math.Sin(angleTolerance); + bool removed = true; + int iterations = 0; + while (removed && result.Count >= 3 && iterations <= result.Count * result.Count) + { + removed = false; + for (int i = 0; i < result.Count; i++) + { + iterations++; + + Point3D previous = result[(i + result.Count - 1) % result.Count]; + Point3D current = result[i]; + Point3D next = result[(i + 1) % result.Count]; + + double aX = current.X - previous.X; + double aY = current.Y - previous.Y; + double aZ = current.Z - previous.Z; + double bX = next.X - current.X; + double bY = next.Y - current.Y; + double bZ = next.Z - current.Z; + + double aLength = Math.Sqrt(aX * aX + aY * aY + aZ * aZ); + double bLength = Math.Sqrt(bX * bX + bY * bY + bZ * bZ); + if (aLength <= distanceTolerance || bLength <= distanceTolerance) + { + result.RemoveAt(i); + removed = true; + break; + } + + double crossX = aY * bZ - aZ * bY; + double crossY = aZ * bX - aX * bZ; + double crossZ = aX * bY - aY * bX; + double crossLength = Math.Sqrt(crossX * crossX + crossY * crossY + crossZ * crossZ); + + if (crossLength <= aLength * bLength * sinAngleTolerance) + { + result.RemoveAt(i); + removed = true; + break; + } + } + } + + return result; + } + + private static double Distance(Point3D point3D_1, Point3D point3D_2) + { + double dX = point3D_1.X - point3D_2.X; + double dY = point3D_1.Y - point3D_2.Y; + double dZ = point3D_1.Z - point3D_2.Z; + return Math.Sqrt(dX * dX + dY * dY + dZ * dZ); + } + } +} diff --git a/SAM_OpenStudio/SAM.Geometry.OpenStudio/Query/EnergyPlusSideCount.cs b/SAM_OpenStudio/SAM.Geometry.OpenStudio/Query/EnergyPlusSideCount.cs new file mode 100644 index 0000000..b5e0b8c --- /dev/null +++ b/SAM_OpenStudio/SAM.Geometry.OpenStudio/Query/EnergyPlusSideCount.cs @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Collections.Generic; +using SAM.Geometry.Spatial; + +namespace SAM.Geometry.OpenStudio +{ + public static partial class Query + { + /// + /// The side count a polygon keeps under the EnergyPlus vertex-proximity rule + /// (SurfaceGeometry GetVertices: consecutive vertices closer than 0.01 m are dropped, + /// and a surface dropping below three sides is reported as a severe "degenerate + /// surface" error). EnergyPlus applies this on top of the converter's own cleaning, + /// which works to far finer tolerances — a sliver panel/aperture (e.g. a 2 mm residual + /// door) survives our cleaning yet collapses in EnergyPlus. Fewer than three surviving + /// sides means EnergyPlus would call the surface degenerate. + /// + /// Ordered polygon vertices (already cleaned by the caller). + /// Proximity threshold [m]; EnergyPlus uses 0.01. + /// Surviving side count; 0 for null/empty input. + public static int EnergyPlusSideCount(IEnumerable point3Ds, double proximity = 0.01) + { + if (point3Ds == null) + { + return 0; + } + + List kept = new List(); + foreach (Point3D point3D in point3Ds) + { + if (point3D == null) + { + continue; + } + + if (kept.Count == 0 || kept[kept.Count - 1].Distance(point3D) >= proximity) + { + kept.Add(point3D); + } + } + + // Closing pair: the last vertex is checked against the first, as EnergyPlus checks + // the wrap-around edge. + while (kept.Count > 1 && kept[kept.Count - 1].Distance(kept[0]) < proximity) + { + kept.RemoveAt(kept.Count - 1); + } + + return kept.Count; + } + } +} diff --git a/SAM_OpenStudio/SAM.Geometry.OpenStudio/Query/IsClockwise.cs b/SAM_OpenStudio/SAM.Geometry.OpenStudio/Query/IsClockwise.cs new file mode 100644 index 0000000..d7eea4e --- /dev/null +++ b/SAM_OpenStudio/SAM.Geometry.OpenStudio/Query/IsClockwise.cs @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Collections.Generic; +using SAM.Geometry.Spatial; + +namespace SAM.Geometry.OpenStudio +{ + public static partial class Query + { + /// + /// True when the polygon winds clockwise about the given reference normal: the polygon's + /// Newell normal (right-hand rule) points against the reference direction. OpenStudio + /// surfaces require counterclockwise vertices viewed from the side the normal points to, + /// so a clockwise polygon must be reversed by the caller. + /// Returns false for degenerate input (no orientation can be determined). + /// + /// Ordered polygon vertices. + /// Reference direction (for example the intended outward normal). + /// True when winding is clockwise about the reference normal. + public static bool IsClockwise(IEnumerable point3Ds, Vector3D viewNormal) + { + if (viewNormal == null) + { + return false; + } + + Vector3D normal = Normal(point3Ds); + if (normal == null) + { + return false; + } + + double dot = normal.X * viewNormal.X + normal.Y * viewNormal.Y + normal.Z * viewNormal.Z; + return dot < 0; + } + } +} diff --git a/SAM_OpenStudio/SAM.Geometry.OpenStudio/Query/IsConvex.cs b/SAM_OpenStudio/SAM.Geometry.OpenStudio/Query/IsConvex.cs new file mode 100644 index 0000000..3a73d58 --- /dev/null +++ b/SAM_OpenStudio/SAM.Geometry.OpenStudio/Query/IsConvex.cs @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Collections.Generic; +using SAM.Geometry.Spatial; + +namespace SAM.Geometry.OpenStudio +{ + public static partial class Query + { + /// + /// Convexity test mirroring what EnergyPlus (CheckConvexity) sees: the turn sign at + /// every vertex must agree, and near-collinear vertices are ignored rather than + /// treated as a sign flip — a polygon straight out of a CAD/BIM shell carries + /// collinear mid-edge points whose zero turn would otherwise read as concave. A + /// genuine reflex vertex (turn beyond the angle tolerance) makes the polygon + /// non-convex. + /// + /// Ordered polygon vertices (planar within tolerance). + /// Turn angle [rad] below which a vertex counts as collinear and is skipped. + /// True when every non-collinear turn has the same sign; false for null, fewer than three vertices or a reflex vertex. + public static bool IsConvex(IEnumerable point3Ds, double angleTolerance) + { + if (point3Ds == null) + { + return false; + } + + List points = new List(point3Ds); + if (points.Count < 3) + { + return false; + } + + Vector3D normal = Normal(points); + if (normal == null) + { + return false; + } + + double sinTolerance = System.Math.Sin(angleTolerance); + + int sign = 0; + for (int i = 0; i < points.Count; i++) + { + Point3D previous = points[(i + points.Count - 1) % points.Count]; + Point3D current = points[i]; + Point3D next = points[(i + 1) % points.Count]; + + Vector3D edge1 = new Vector3D(previous, current); + Vector3D edge2 = new Vector3D(current, next); + + double length = edge1.Length * edge2.Length; + if (double.IsNaN(length) || length < 1e-12) + { + continue; + } + + double sin = edge1.CrossProduct(edge2).DotProduct(normal) / length; + if (double.IsNaN(sin) || System.Math.Abs(sin) < sinTolerance) + { + continue; + } + + int sign_Temp = sin > 0 ? 1 : -1; + if (sign == 0) + { + sign = sign_Temp; + continue; + } + + if (sign != sign_Temp) + { + return false; + } + } + + return true; + } + } +} diff --git a/SAM_OpenStudio/SAM.Geometry.OpenStudio/Query/IsPlanar.cs b/SAM_OpenStudio/SAM.Geometry.OpenStudio/Query/IsPlanar.cs new file mode 100644 index 0000000..0c16892 --- /dev/null +++ b/SAM_OpenStudio/SAM.Geometry.OpenStudio/Query/IsPlanar.cs @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; +using SAM.Geometry.Spatial; + +namespace SAM.Geometry.OpenStudio +{ + public static partial class Query + { + /// + /// True when every vertex lies within the distance tolerance of the best-fit plane + /// (Newell normal through the vertex centroid). Three valid vertices are always planar. + /// Returns false for null input, fewer than three vertices, or a degenerate normal. + /// + /// Ordered polygon vertices. + /// Maximum out-of-plane distance [m]. + /// True when planar within tolerance. + public static bool IsPlanar(IEnumerable point3Ds, double distanceTolerance) + { + if (point3Ds == null) + { + return false; + } + + List points = point3Ds is List list ? list : new List(point3Ds); + if (points.Count < 3) + { + return false; + } + + Vector3D normal = Normal(points); + if (normal == null) + { + return false; + } + + double length = Math.Sqrt(normal.X * normal.X + normal.Y * normal.Y + normal.Z * normal.Z); + if (length == 0 || double.IsNaN(length)) + { + return false; + } + + double unitX = normal.X / length; + double unitY = normal.Y / length; + double unitZ = normal.Z / length; + + double centroidX = 0; + double centroidY = 0; + double centroidZ = 0; + foreach (Point3D point3D in points) + { + if (point3D == null) + { + return false; + } + + centroidX += point3D.X; + centroidY += point3D.Y; + centroidZ += point3D.Z; + } + + centroidX /= points.Count; + centroidY /= points.Count; + centroidZ /= points.Count; + + foreach (Point3D point3D in points) + { + double distance = Math.Abs((point3D.X - centroidX) * unitX + (point3D.Y - centroidY) * unitY + (point3D.Z - centroidZ) * unitZ); + if (distance > distanceTolerance) + { + return false; + } + } + + return true; + } + } +} diff --git a/SAM_OpenStudio/SAM.Geometry.OpenStudio/Query/IsSelfIntersecting.cs b/SAM_OpenStudio/SAM.Geometry.OpenStudio/Query/IsSelfIntersecting.cs new file mode 100644 index 0000000..da68a2c --- /dev/null +++ b/SAM_OpenStudio/SAM.Geometry.OpenStudio/Query/IsSelfIntersecting.cs @@ -0,0 +1,141 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; +using SAM.Geometry.Spatial; + +namespace SAM.Geometry.OpenStudio +{ + public static partial class Query + { + /// + /// True when any two non-adjacent edges of the (assumed planar) closed polygon properly + /// cross. Adjacent edge pairs sharing a vertex are ignored; near-touching within the + /// distance tolerance counts as intersecting. Projection uses the dominant axis of the + /// Newell normal, so the check is robust for vertical and sloping polygons. O(n²); + /// returns false for null input or fewer than four vertices. + /// + /// Ordered polygon vertices. + /// Distance tolerance [m] for touch detection. + /// True when the polygon self-intersects. + public static bool IsSelfIntersecting(IEnumerable point3Ds, double distanceTolerance) + { + if (point3Ds == null) + { + return false; + } + + List points = point3Ds is List list ? list : new List(point3Ds); + int count = points.Count; + if (count < 4) + { + return false; + } + + Vector3D normal = Normal(points); + if (normal == null) + { + return false; + } + + // Project onto the plane most facing the polygon: drop the dominant normal axis. + double absX = Math.Abs(normal.X); + double absY = Math.Abs(normal.Y); + double absZ = Math.Abs(normal.Z); + + double[] u = new double[count]; + double[] v = new double[count]; + for (int i = 0; i < count; i++) + { + if (absZ >= absX && absZ >= absY) + { + u[i] = points[i].X; + v[i] = points[i].Y; + } + else if (absY >= absX) + { + u[i] = points[i].X; + v[i] = points[i].Z; + } + else + { + u[i] = points[i].Y; + v[i] = points[i].Z; + } + } + + for (int i = 0; i < count; i++) + { + int i2 = (i + 1) % count; + for (int j = i + 1; j < count; j++) + { + int j2 = (j + 1) % count; + + // Skip adjacent edges (shared endpoint, including the wraparound pair). + if (i == j || i2 == j || j2 == i) + { + continue; + } + + if (SegmentsIntersect(u[i], v[i], u[i2], v[i2], u[j], v[j], u[j2], v[j2], distanceTolerance)) + { + return true; + } + } + } + + return false; + } + + private static bool SegmentsIntersect(double p1x, double p1y, double p2x, double p2y, double p3x, double p3y, double p4x, double p4y, double tolerance) + { + double d1 = Cross(p3x, p3y, p4x, p4y, p1x, p1y); + double d2 = Cross(p3x, p3y, p4x, p4y, p2x, p2y); + double d3 = Cross(p1x, p1y, p2x, p2y, p3x, p3y); + double d4 = Cross(p1x, p1y, p2x, p2y, p4x, p4y); + + double norm = Math.Max(1.0, Math.Abs(p2x - p1x) + Math.Abs(p2y - p1y)) * Math.Max(1.0, Math.Abs(p4x - p3x) + Math.Abs(p4y - p3y)); + double epsilon = tolerance * Math.Sqrt(norm); + + if (((d1 > epsilon && d2 < -epsilon) || (d1 < -epsilon && d2 > epsilon)) && ((d3 > epsilon && d4 < -epsilon) || (d3 < -epsilon && d4 > epsilon))) + { + return true; + } + + // Touching (an endpoint on the other segment within tolerance) counts as intersecting. + if (Math.Abs(d1) <= epsilon && OnSegment(p3x, p3y, p4x, p4y, p1x, p1y, tolerance)) + { + return true; + } + + if (Math.Abs(d2) <= epsilon && OnSegment(p3x, p3y, p4x, p4y, p2x, p2y, tolerance)) + { + return true; + } + + if (Math.Abs(d3) <= epsilon && OnSegment(p1x, p1y, p2x, p2y, p3x, p3y, tolerance)) + { + return true; + } + + if (Math.Abs(d4) <= epsilon && OnSegment(p1x, p1y, p2x, p2y, p4x, p4y, tolerance)) + { + return true; + } + + return false; + } + + private static double Cross(double ax, double ay, double bx, double by, double px, double py) + { + return (bx - ax) * (py - ay) - (by - ay) * (px - ax); + } + + private static bool OnSegment(double ax, double ay, double bx, double by, double px, double py, double tolerance) + { + return px >= Math.Min(ax, bx) - tolerance && px <= Math.Max(ax, bx) + tolerance + && py >= Math.Min(ay, by) - tolerance && py <= Math.Max(ay, by) + tolerance; + } + } +} diff --git a/SAM_OpenStudio/SAM.Geometry.OpenStudio/Query/Normal.cs b/SAM_OpenStudio/SAM.Geometry.OpenStudio/Query/Normal.cs new file mode 100644 index 0000000..ff63193 --- /dev/null +++ b/SAM_OpenStudio/SAM.Geometry.OpenStudio/Query/Normal.cs @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Collections.Generic; +using SAM.Geometry.Spatial; + +namespace SAM.Geometry.OpenStudio +{ + public static partial class Query + { + /// + /// Newell-method normal of a closed polygon. The returned vector is NOT normalized: its + /// magnitude equals twice the polygon area, and its direction follows the right-hand rule + /// for the vertex winding order. Returns null for null input or fewer than three vertices. + /// + /// Ordered polygon vertices. + /// Unnormalized normal vector, or null. + public static Vector3D Normal(IEnumerable point3Ds) + { + if (point3Ds == null) + { + return null; + } + + List points = point3Ds is List list ? list : new List(point3Ds); + if (points.Count < 3) + { + return null; + } + + double x = 0; + double y = 0; + double z = 0; + for (int i = 0; i < points.Count; i++) + { + Point3D current = points[i]; + Point3D next = points[(i + 1) % points.Count]; + if (current == null || next == null) + { + return null; + } + + x += (current.Y - next.Y) * (current.Z + next.Z); + y += (current.Z - next.Z) * (current.X + next.X); + z += (current.X - next.X) * (current.Y + next.Y); + } + + return new Vector3D(x, y, z); + } + } +} diff --git a/SAM_OpenStudio/SAM.Geometry.OpenStudio/Query/ValidatePolygon.cs b/SAM_OpenStudio/SAM.Geometry.OpenStudio/Query/ValidatePolygon.cs new file mode 100644 index 0000000..522d6fe --- /dev/null +++ b/SAM_OpenStudio/SAM.Geometry.OpenStudio/Query/ValidatePolygon.cs @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Collections.Generic; +using SAM.Geometry.Spatial; + +namespace SAM.Geometry.OpenStudio +{ + public static partial class Query + { + /// + /// Validates a polygon for OpenStudio surface creation, applying the vertex-cleaning and + /// validation rules of the implementation plan §8: cleaning is reported as a warning + /// (SAM-OS-GEO-002); fewer than three vertices, non-planarity or area below the minimum + /// are errors (SAM-OS-GEO-001). No repair beyond cleaning is attempted — non-planar + /// polygons are rejected, never repaired. An empty result list means the polygon is valid + /// and unchanged. + /// + /// Ordered polygon vertices. + /// Distance tolerance [m] (duplicates, planarity). + /// Angle tolerance [rad] (collinearity). + /// Minimum polygon area [m²]. + /// Diagnostics describing cleaning actions and validation failures. + public static List ValidatePolygon(IEnumerable point3Ds, double distanceTolerance, double angleTolerance, double minimumArea) + { + List result = new List(); + + if (point3Ds == null) + { + result.Add(new Core.OpenStudio.OpenStudioDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.GeometryInvalidBoundary, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "Polygon has no vertices")); + return result; + } + + List points = new List(point3Ds); + List cleaned = CleanVertices(points, distanceTolerance, angleTolerance); + + if (cleaned.Count != points.Count) + { + result.Add(new Core.OpenStudio.OpenStudioDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.GeometryVerticesCleaned, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Removed {0} duplicate/collinear vertices ({1} → {2})", points.Count - cleaned.Count, points.Count, cleaned.Count))); + } + + if (cleaned.Count < 3) + { + result.Add(new Core.OpenStudio.OpenStudioDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.GeometryInvalidBoundary, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("Polygon has fewer than three valid vertices after cleaning ({0})", cleaned.Count))); + return result; + } + + if (!IsPlanar(cleaned, distanceTolerance)) + { + result.Add(new Core.OpenStudio.OpenStudioDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.GeometryInvalidBoundary, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "Polygon is not planar within tolerance; automatic repair is not performed")); + return result; + } + + if (IsSelfIntersecting(cleaned, distanceTolerance)) + { + result.Add(new Core.OpenStudio.OpenStudioDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.GeometryInvalidBoundary, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "Polygon is self-intersecting; automatic repair is not performed")); + return result; + } + + double area = Area(cleaned); + if (double.IsNaN(area) || area < minimumArea) + { + result.Add(new Core.OpenStudio.OpenStudioDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.GeometryInvalidBoundary, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("Polygon area {0:G6} m² is below the minimum {1:G6} m²", area, minimumArea))); + } + + return result; + } + } +} diff --git a/SAM_OpenStudio/SAM.Geometry.OpenStudio/SAM.Geometry.OpenStudio.csproj b/SAM_OpenStudio/SAM.Geometry.OpenStudio/SAM.Geometry.OpenStudio.csproj index ebdc921..5b16eb6 100644 --- a/SAM_OpenStudio/SAM.Geometry.OpenStudio/SAM.Geometry.OpenStudio.csproj +++ b/SAM_OpenStudio/SAM.Geometry.OpenStudio/SAM.Geometry.OpenStudio.csproj @@ -42,9 +42,20 @@ + + + ..\..\..\SAM\build\SAM.Core.dll + + + ..\..\..\SAM\build\SAM.Geometry.dll + + + + + - 3.8.0 + 3.10.0 \ No newline at end of file diff --git a/benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/CliTests.cs b/benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/CliTests.cs new file mode 100644 index 0000000..9d88bfc --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/CliTests.cs @@ -0,0 +1,163 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020-2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.IO; +using NUnit.Framework; +using SAM.Analytical.Benchmark; + +namespace SAM.Analytical.OpenStudio.Benchmark.Tests +{ + /// + /// The producer honours the shared benchmark CLI contract (): + /// exit 0 success, 2 usage, 3 input/IO/serialization, 4 validation, + /// 5 producer failure. Everything here runs offline: the parse/usage/input paths through + /// , and the validation/producer exit decisions through + /// (both reached without an OpenStudio/EnergyPlus install; the full + /// live route is exercised by the Simulation-category test). + /// + [TestFixture] + public class CliTests + { + [Test] + public void Help_ReturnsSuccess_AndPrintsUsageOnceToStdout() + { + StringWriter output = new StringWriter(); + StringWriter error = new StringWriter(); + + int exitCode = Program.Run(new[] { "--help" }, output, error); + + Assert.That(exitCode, Is.EqualTo((int)BenchmarkExitCode.Success)); + Assert.That(error.ToString(), Is.Empty, "help must not write to stderr"); + Assert.That(output.ToString(), Does.Contain("Usage: benchmark-openstudio")); + Assert.That(CountOccurrences(output.ToString(), "Usage: benchmark-openstudio"), Is.EqualTo(1), "usage must print exactly once"); + } + + [Test] + public void MissingRequiredOption_ReturnsUsageError() + { + StringWriter error = new StringWriter(); + + int exitCode = Program.Run(new[] { "--model", "model.json" }, new StringWriter(), error); + + Assert.That(exitCode, Is.EqualTo((int)BenchmarkExitCode.InvalidUsage)); + Assert.That(error.ToString(), Does.Contain("Missing required option")); + } + + [Test] + public void NonexistentModelFile_ReturnsInputError() + { + string missing = Path.Combine(Path.GetTempPath(), "sam-benchmark-missing-" + Guid.NewGuid().ToString("N") + ".json"); + string outputPath = Path.Combine(Path.GetTempPath(), "sam-benchmark-out-" + Guid.NewGuid().ToString("N") + ".json"); + StringWriter error = new StringWriter(); + + int exitCode = Program.Run( + new[] { "--model", missing, "--weather", missing, "--out", outputPath }, + new StringWriter(), + error); + + Assert.That(exitCode, Is.EqualTo((int)BenchmarkExitCode.InputOutputOrSerializationFailure)); + Assert.That(File.Exists(outputPath), Is.False); + } + + [Test] + public void ModelFileWithNoSamModel_ReturnsInputError() + { + string model = Path.GetTempFileName(); + string weather = Path.GetTempFileName(); + string outputPath = Path.Combine(Path.GetTempPath(), "sam-benchmark-out-" + Guid.NewGuid().ToString("N") + ".json"); + + // A well-formed JSON document that carries no SAM object: ToSAM yields nothing, so the + // producer reports a deserialization failure (exit 3) before ever reaching the run stage. + File.WriteAllText(model, "[]"); + StringWriter error = new StringWriter(); + try + { + int exitCode = Program.Run( + new[] { "--model", model, "--weather", weather, "--out", outputPath }, + new StringWriter(), + error); + + Assert.That(exitCode, Is.EqualTo((int)BenchmarkExitCode.InputOutputOrSerializationFailure)); + Assert.That(File.Exists(outputPath), Is.False); + } + finally + { + File.Delete(model); + File.Delete(weather); + } + } + + [Test] + public void Emit_InvalidDocument_ReturnsValidationFailure_AndWritesNothing() + { + string outputPath = Path.Combine(Path.GetTempPath(), "sam-benchmark-out-" + Guid.NewGuid().ToString("N") + ".json"); + StringWriter error = new StringWriter(); + + // An empty document fails schema validation; routed through the shared host that is exit 4. + int exitCode = BenchmarkCliHost.Run( + Array.Empty(), + "usage", + Array.Empty(), + (_, _) => Program.Emit(new BenchmarkDocument(), outputPath, runSucceeded: true, new StringWriter()), + new StringWriter(), + error); + + Assert.That(exitCode, Is.EqualTo((int)BenchmarkExitCode.ValidationFailure)); + Assert.That(File.Exists(outputPath), Is.False, "an invalid document must not be written"); + } + + [Test] + public void Emit_ValidDocument_WithFailedRun_ReturnsProducerFailure_AndWritesDocument() + { + string outputPath = Path.Combine(Path.GetTempPath(), "sam-benchmark-out-" + Guid.NewGuid().ToString("N") + ".json"); + try + { + int exitCode = Program.Emit(BenchmarkFixture.GoldenDocument(), outputPath, runSucceeded: false, new StringWriter()); + + Assert.That(exitCode, Is.EqualTo((int)BenchmarkExitCode.ProducerFailure)); + Assert.That(File.Exists(outputPath), Is.True, "a valid document is still written for a failed run"); + } + finally + { + if (File.Exists(outputPath)) + { + File.Delete(outputPath); + } + } + } + + [Test] + public void Emit_ValidDocument_WithSucceededRun_ReturnsSuccess() + { + string outputPath = Path.Combine(Path.GetTempPath(), "sam-benchmark-out-" + Guid.NewGuid().ToString("N") + ".json"); + try + { + int exitCode = Program.Emit(BenchmarkFixture.GoldenDocument(), outputPath, runSucceeded: true, new StringWriter()); + + Assert.That(exitCode, Is.EqualTo((int)BenchmarkExitCode.Success)); + Assert.That(File.Exists(outputPath), Is.True); + } + finally + { + if (File.Exists(outputPath)) + { + File.Delete(outputPath); + } + } + } + + private static int CountOccurrences(string haystack, string needle) + { + int count = 0; + int index = 0; + while ((index = haystack.IndexOf(needle, index, StringComparison.Ordinal)) >= 0) + { + count++; + index += needle.Length; + } + + return count; + } + } +} diff --git a/benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/DesignDaySourceTests.cs b/benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/DesignDaySourceTests.cs new file mode 100644 index 0000000..69ba5ee --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/DesignDaySourceTests.cs @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020-2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Collections.Generic; +using NUnit.Framework; +using SAM.Analytical.Benchmark; + +namespace SAM.Analytical.OpenStudio.Benchmark.Tests +{ + /// + /// provenance.designDaySource is derived, never fixed. A hardcoded made every cross-engine pair on a model carrying design days + /// look provenance-incompatible to the B3 comparator (the TAS producer derives + /// from the same model), so the field is asserted + /// on both layers the producer uses: the model-derived pre-run value (mirroring the TAS + /// derivation) and the mapping of the design-day basis the OpenStudio route reports. Fully + /// offline — no OpenStudio/EnergyPlus install involved. + /// + [TestFixture] + public class DesignDaySourceTests + { + private static DesignDay Day(string name, byte month, byte day) + { + return new DesignDay(name, 2026, month, day); + } + + [Test] + public void ModelWithEmbeddedDesignDays_DerivesEmbeddedModel_NotNone() + { + AnalyticalModel analyticalModel = BenchmarkFixture.SingleSpaceModel(); + Analytical.Modify.UpdateWeather( + analyticalModel, + null, + new List { Day("Cooling Design Day", 7, 21) }, + new List { Day("Heating Design Day", 1, 21) }); + + DesignDaySource designDaySource = Program.ResolveDesignDaySource(analyticalModel); + + Assert.That(designDaySource, Is.EqualTo(DesignDaySource.EmbeddedModel), "A model carrying heating/cooling design days must not report None — the B3 comparator compares this field across engines"); + } + + [Test] + public void ModelWithHeatingDesignDaysOnly_DerivesEmbeddedModel() + { + AnalyticalModel analyticalModel = BenchmarkFixture.SingleSpaceModel(); + Analytical.Modify.UpdateWeather(analyticalModel, null, null, new List { Day("Heating Design Day", 1, 21) }); + + Assert.That(Program.ResolveDesignDaySource(analyticalModel), Is.EqualTo(DesignDaySource.EmbeddedModel), "One side is enough for an embedded basis"); + } + + [Test] + public void ModelWithCoolingDesignDaysOnly_DerivesEmbeddedModel() + { + AnalyticalModel analyticalModel = BenchmarkFixture.SingleSpaceModel(); + Analytical.Modify.UpdateWeather(analyticalModel, null, new List { Day("Cooling Design Day", 7, 21) }, null); + + Assert.That(Program.ResolveDesignDaySource(analyticalModel), Is.EqualTo(DesignDaySource.EmbeddedModel), "One side is enough for an embedded basis"); + } + + [Test] + public void ModelWithoutDesignDays_DerivesNone() + { + Assert.That(Program.ResolveDesignDaySource(BenchmarkFixture.SingleSpaceModel()), Is.EqualTo(DesignDaySource.None), "No design days in the model → None"); + } + + [Test] + public void EmptyDesignDayCollection_DerivesNone() + { + AnalyticalModel analyticalModel = BenchmarkFixture.SingleSpaceModel(); + Analytical.Modify.UpdateWeather(analyticalModel, null, new List(), new List()); + + Assert.That(Program.ResolveDesignDaySource(analyticalModel), Is.EqualTo(DesignDaySource.None), "An empty collection is not a design-day basis"); + } + + [Test] + public void NullModel_DerivesNone() + { + Assert.That(Program.ResolveDesignDaySource(null), Is.EqualTo(DesignDaySource.None)); + } + + [TestCase(Core.OpenStudio.OpenStudioDesignDaySource.Ddy, DesignDaySource.Ddy)] + [TestCase(Core.OpenStudio.OpenStudioDesignDaySource.EmbeddedModel, DesignDaySource.EmbeddedModel)] + [TestCase(Core.OpenStudio.OpenStudioDesignDaySource.None, DesignDaySource.None)] + public void RouteDesignDayBasis_MapsOntoProvenanceEnum(Core.OpenStudio.OpenStudioDesignDaySource routeBasis, DesignDaySource expected) + { + Assert.That(Program.ToBenchmarkDesignDaySource(routeBasis), Is.EqualTo(expected)); + } + + [Test] + public void ProvenanceEnum_NeverReportsUnknown() + { + // Unknown is the schema's "unrecognised token" value; the validator rejects a document + // carrying it, so no mapped route basis may produce it. + foreach (Core.OpenStudio.OpenStudioDesignDaySource routeBasis in System.Enum.GetValues(typeof(Core.OpenStudio.OpenStudioDesignDaySource))) + { + Assert.That(Program.ToBenchmarkDesignDaySource(routeBasis), Is.Not.EqualTo(DesignDaySource.Unknown), routeBasis.ToString()); + } + } + } +} diff --git a/benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/DesignLoadBenchmarkTests.cs b/benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/DesignLoadBenchmarkTests.cs new file mode 100644 index 0000000..ab232a2 --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/DesignLoadBenchmarkTests.cs @@ -0,0 +1,129 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020-2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using SAM.Analytical.Benchmark; + +namespace SAM.Analytical.OpenStudio.Benchmark.Tests +{ + /// + /// designLoad reaches the neutral benchmark document from the route's zone sizing results. + /// Every per-space design load was previously unavailable — 28 of the 66 unavailable metrics in the + /// recorded cross-engine runs — even though EnergyPlus had sized the zones and written the loads to + /// the SQL ZoneSizes table. Fully offline: the result set is fabricated. + /// + [TestFixture] + public class DesignLoadBenchmarkTests + { + private static OpenStudioZoneSizingResult Row(string zoneName, string loadType, double? userDesignLoad, double? calculatedDesignLoad) + { + return new OpenStudioZoneSizingResult(zoneName, loadType, calculatedDesignLoad, userDesignLoad, 0.04, 0.05, "WINTER_DD", "3/2 08:00:00", -3.2, 0.00243652); + } + + private static BenchmarkSpaceResult Space(AnalyticalModel model, OpenStudioSimulationResultSet resultSet) + { + OpenStudioBenchmarkContext context = BenchmarkFixture.Context(model, resultSet); + context.SpaceDesignLoadResults = resultSet.ToSAM_SpaceDesignLoadResults(model.AdjacencyCluster.GetSpaces()); + + BenchmarkDocument document = model.ToBenchmark(context); + Assert.That(BenchmarkValidator.Validate(document).IsValid, Is.True, "The document must stay schema-valid"); + return document.Spaces.First(); + } + + private static OpenStudioSimulationResultSet WithZoneSizing(OpenStudioSimulationResultSet source, params OpenStudioZoneSizingResult[] rows) + { + // The fixture result set carries the annual measurements; re-create it with sizing rows added + // so both families are present exactly as a real run has them. + return new OpenStudioSimulationResultSet( + source.AnnualHeatingEnergy, source.AnnualCoolingEnergy, + source.PeakHeatingLoad, source.PeakCoolingLoad, + source.PeakHeatingHour, source.PeakCoolingHour, + source.PeakHeatingLoadTotal, source.PeakHeatingHourTotal, + source.PeakCoolingLoadTotal, source.PeakCoolingHourTotal, + source.UnmetHeatingHours, source.UnmetCoolingHours, + source.PeopleGains, source.LightingGains, source.EquipmentGains, + source.WindowSolarGains, source.InfiltrationGains, + source.VentilationHeatingEnergy, source.VentilationCoolingEnergy, + source.TemperatureSeries, source.OperativeTemperatureSeries, source.RelativeHumiditySeries, + source.RuntimeSeconds, source.WarningCount, source.SevereCount, source.FatalCount, + rows); + } + + [Test] + public void SizedZone_ReportsDesignLoadFromCalcDesLoad() + { + AnalyticalModel model = BenchmarkFixture.SingleSpaceModel(); + Analytical.Space space = model.AdjacencyCluster.GetSpaces().First(); + string zoneName = Core.OpenStudio.Query.OpenStudioName("ThermalZone", space.Name, space.Guid); + + OpenStudioSimulationResultSet resultSet = WithZoneSizing( + BenchmarkFixture.ResultSet(), + Row(zoneName, "Heating", userDesignLoad: 1409.83, calculatedDesignLoad: 1127.86)); + + BenchmarkSpaceResult result = Space(model, resultSet); + + Assert.That(result.Heating.DesignLoad.Available, Is.True, "The design load is no longer unavailable"); + Assert.That(result.Heating.DesignLoad.Value, Is.EqualTo(1127.86).Within(1e-9), "CalcDesLoad is emitted — the calculated load, not the post-sizing-factor capacity"); + Assert.That(result.Heating.DesignLoad.Unit, Is.EqualTo(MetricUnit.Watt), "ZoneSizes loads are already W"); + } + + [Test] + public void DesignLoadDoesNotDisturbTheAnnualPeak() + { + AnalyticalModel model = BenchmarkFixture.SingleSpaceModel(); + Analytical.Space space = model.AdjacencyCluster.GetSpaces().First(); + string zoneName = Core.OpenStudio.Query.OpenStudioName("ThermalZone", space.Name, space.Guid); + + OpenStudioSimulationResultSet baseline = BenchmarkFixture.ResultSet(); + BenchmarkSpaceResult without = Space(model, baseline); + BenchmarkSpaceResult with = Space(model, WithZoneSizing(baseline, Row(zoneName, "Heating", 1409.83, 1127.86))); + + Assert.That(with.Heating.PeakLoad.Available, Is.EqualTo(without.Heating.PeakLoad.Available), "peakLoad availability is untouched by sizing results"); + Assert.That(with.Heating.PeakLoad.Value, Is.EqualTo(without.Heating.PeakLoad.Value), "peakLoad still comes from the annual weather run"); + Assert.That(with.Heating.PeakHour.Value, Is.EqualTo(without.Heating.PeakHour.Value), "peakHour still comes from the annual weather run"); + } + + [Test] + public void UnsizedLoadType_StaysUnavailable() + { + AnalyticalModel model = BenchmarkFixture.SingleSpaceModel(); + Analytical.Space space = model.AdjacencyCluster.GetSpaces().First(); + string zoneName = Core.OpenStudio.Query.OpenStudioName("ThermalZone", space.Name, space.Guid); + + OpenStudioSimulationResultSet resultSet = WithZoneSizing(BenchmarkFixture.ResultSet(), Row(zoneName, "Heating", 1409.83, 1127.86)); + + BenchmarkSpaceResult result = Space(model, resultSet); + + Assert.That(result.Cooling.DesignLoad.Available, Is.False, "A zone sized for heating only leaves the cooling design load unavailable"); + Assert.That(result.Cooling.DesignLoad.Value, Is.Null, "Unavailable stays null, never 0"); + } + + [Test] + public void SizedZero_IsReportedAsAnAvailableZero() + { + AnalyticalModel model = BenchmarkFixture.SingleSpaceModel(); + Analytical.Space space = model.AdjacencyCluster.GetSpaces().First(); + string zoneName = Core.OpenStudio.Query.OpenStudioName("ThermalZone", space.Name, space.Guid); + + OpenStudioSimulationResultSet resultSet = WithZoneSizing(BenchmarkFixture.ResultSet(), Row(zoneName, "Cooling", userDesignLoad: 0.0, calculatedDesignLoad: 0.0)); + + BenchmarkSpaceResult result = Space(model, resultSet); + + Assert.That(result.Cooling.DesignLoad.Available, Is.True, "A genuinely sized zero is a measurement"); + Assert.That(result.Cooling.DesignLoad.Value, Is.EqualTo(0.0)); + } + + [Test] + public void NoZoneSizing_LeavesDesignLoadsUnavailableAsBefore() + { + AnalyticalModel model = BenchmarkFixture.SingleSpaceModel(); + + BenchmarkSpaceResult result = Space(model, BenchmarkFixture.ResultSet()); + + Assert.That(result.Heating.DesignLoad.Available, Is.False, "A run without sizing keeps the previous, honest behaviour"); + Assert.That(result.Cooling.DesignLoad.Available, Is.False); + } + } +} diff --git a/benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/DiagnosticPropagationTests.cs b/benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/DiagnosticPropagationTests.cs new file mode 100644 index 0000000..c56a3e3 --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/DiagnosticPropagationTests.cs @@ -0,0 +1,262 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020-2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using SAM.Analytical.Benchmark; + +namespace SAM.Analytical.OpenStudio.Benchmark.Tests +{ + /// + /// Conversion diagnostics must reach the neutral benchmark document on EVERY run. Previously they + /// were recorded only when the EnergyPlus run failed, and through an Error-only filter, so a + /// SUCCESSFUL document reported "warnings": [] even when the route had explicitly named its + /// approximations (hourly humidity collapsed to a constant dew point, hourly solar replaced by + /// ASHRAEClearSky, a substituted barometric pressure, the weather/design-day basis). A document that + /// hides those presents a cross-engine comparison as cleaner than it was. + /// + /// These tests drive the mapping helpers directly with fabricated diagnostics, so they are fully + /// offline: no OpenStudio install, no EnergyPlus run, no conversion. + /// + /// + [TestFixture] + public class DiagnosticPropagationTests + { + private static Core.OpenStudio.OpenStudioDiagnostic Diagnostic(string code, Core.OpenStudio.OpenStudioDiagnosticSeverity severity, string message) + { + return new Core.OpenStudio.OpenStudioDiagnostic(code, severity, message); + } + + private static Core.OpenStudio.OpenStudioDiagnostic Warning(string message) + { + return Diagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.WeatherDataIssue, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, message); + } + + /// A design-day/weather-basis Information diagnostic: benchmark-relevant, becomes a note. + private static Core.OpenStudio.OpenStudioDiagnostic BasisInformation(string message) + { + return Diagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.WeatherDataIssue, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, message); + } + + /// A per-object modelling Information diagnostic: routine detail, must not be copied. + private static Core.OpenStudio.OpenStudioDiagnostic RoutineInformation(string message) + { + return Diagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ConstructionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, message); + } + + private static OpenStudioBenchmarkContext SuccessfulContext() + { + AnalyticalModel model = BenchmarkFixture.SingleSpaceModel(); + return BenchmarkFixture.Context(model, BenchmarkFixture.ResultSet()); + } + + [Test] + public void SuccessfulRun_WarningReachesWarnings() + { + OpenStudioBenchmarkContext context = SuccessfulContext(); + Assert.That(context.State, Is.EqualTo(RunState.Success), "The regression this guards is specifically about SUCCESSFUL runs"); + + Modify.ApplyConversionDiagnostics(context, new List + { + Warning("the hourly solar profile was approximated by the ASHRAEClearSky model") + }); + + Assert.That(context.Warnings.Count, Is.EqualTo(1), "A successful run must not discard converter warnings: " + string.Join(" | ", context.Warnings)); + Assert.That(context.Warnings[0], Does.Contain("ASHRAEClearSky")); + Assert.That(context.Warnings[0], Does.Contain(Core.OpenStudio.OpenStudioDiagnosticCodes.WeatherDataIssue), "The stable code travels with the message"); + } + + [Test] + public void FailedRun_RecordsBothWarningAndError() + { + OpenStudioBenchmarkContext context = SuccessfulContext(); + context.State = RunState.Failure; + + Modify.ApplyConversionDiagnostics(context, new List + { + Warning("a warning that must survive a failed run"), + Diagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.RunCliFailed, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "the OpenStudio CLI failed") + }); + + Assert.That(context.Warnings.Count, Is.EqualTo(2), "Both severities are recorded: " + string.Join(" | ", context.Warnings)); + Assert.That(context.Warnings.Any(x => x.Contains("must survive")), Is.True); + Assert.That(context.Warnings.Any(x => x.Contains("CLI failed")), Is.True); + } + + [Test] + public void BenchmarkRelevantInformation_ReachesNotes() + { + OpenStudioBenchmarkContext context = SuccessfulContext(); + + Modify.ApplyConversionDiagnostics(context, new List + { + BasisInformation("Design-day source: AnalyticalModel heating/cooling design days"), + Diagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ResultExtractionLimitation, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, "peaks assume hourly reporting"), + Diagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.SimulationSettingsUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, "the requested shading calculation method was substituted") + }); + + Assert.That(context.Notes.Count, Is.EqualTo(3), "Weather/design-day basis, result-extraction limits and substituted settings all describe the simulation basis: " + string.Join(" | ", context.Notes)); + Assert.That(context.Notes.Any(x => x.Contains("Design-day source")), Is.True); + Assert.That(context.Warnings, Is.Empty, "Information diagnostics are notes, never warnings"); + } + + [Test] + public void RoutineInformation_IsNotPropagated() + { + OpenStudioBenchmarkContext context = SuccessfulContext(); + + Modify.ApplyConversionDiagnostics(context, new List + { + RoutineInformation("Frame data on an opaque door is not converted"), + Diagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.GeometryVerticesCleaned, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, "duplicate vertices removed"), + Diagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.InternalConditionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, "equipment view coefficient is not converted") + }); + + Assert.That(context.Notes, Is.Empty, "Per-object modelling detail is not the simulation basis and must not become notes: " + string.Join(" | ", context.Notes)); + Assert.That(context.Warnings, Is.Empty); + } + + [Test] + public void RoutineInformationCodes_StillPropagateTheirWarnings() + { + // The allow-list narrows NOTES only. A warning is material whatever family raised it. + OpenStudioBenchmarkContext context = SuccessfulContext(); + + Modify.ApplyConversionDiagnostics(context, new List + { + Diagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ConstructionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "an aperture shade is not converted") + }); + + Assert.That(context.Warnings.Count, Is.EqualTo(1), "Non-allow-listed codes still deliver their warnings"); + } + + [Test] + public void DuplicateWarningsAndNotes_AppearOnce() + { + OpenStudioBenchmarkContext context = SuccessfulContext(); + + Modify.ApplyConversionDiagnostics(context, new List + { + Warning("the same approximation reported twice"), + Warning("the same approximation reported twice"), + BasisInformation("Ground temperatures taken from the EPW GROUND TEMPERATURES header"), + BasisInformation("Ground temperatures taken from the EPW GROUND TEMPERATURES header") + }); + + Assert.That(context.Warnings.Count, Is.EqualTo(1), "Exact duplicates collapse: " + string.Join(" | ", context.Warnings)); + Assert.That(context.Notes.Count, Is.EqualTo(1), "Exact duplicates collapse: " + string.Join(" | ", context.Notes)); + } + + [Test] + public void WarningsAndNotes_AreOrdinalSorted() + { + OpenStudioBenchmarkContext context = SuccessfulContext(); + + Modify.ApplyConversionDiagnostics(context, new List + { + Warning("zulu"), + Warning("alpha"), + Warning("Zulu"), + Warning("Alpha"), + BasisInformation("second"), + BasisInformation("first") + }); + + Assert.That(context.Warnings, Is.EqualTo(context.Warnings.OrderBy(x => x, System.StringComparer.Ordinal).ToList()), "Warnings are ordinal-sorted: " + string.Join(" | ", context.Warnings)); + Assert.That(context.Notes, Is.EqualTo(context.Notes.OrderBy(x => x, System.StringComparer.Ordinal).ToList()), "Notes are ordinal-sorted: " + string.Join(" | ", context.Notes)); + } + + [Test] + public void SameDiagnosticsInAnyOrder_ProduceIdenticalArrays() + { + var diagnostics = new List + { + Warning("beta approximation"), + Warning("alpha approximation"), + BasisInformation("Annual weather source: AnalyticalModel WeatherData"), + BasisInformation("Design-day source: explicit DDY") + }; + + OpenStudioBenchmarkContext first = SuccessfulContext(); + Modify.ApplyConversionDiagnostics(first, diagnostics); + + OpenStudioBenchmarkContext second = SuccessfulContext(); + Modify.ApplyConversionDiagnostics(second, Enumerable.Reverse(diagnostics).ToList()); + + Assert.That(second.Warnings, Is.EqualTo(first.Warnings), "Byte-stable regardless of diagnostic order"); + Assert.That(second.Notes, Is.EqualTo(first.Notes), "Byte-stable regardless of diagnostic order"); + } + + [Test] + public void ExistingProducerNotes_ArePreserved() + { + OpenStudioBenchmarkContext context = SuccessfulContext(); + context.Notes.Add("EnergyPlus version was unavailable from the loaded OpenStudio SDK at run time."); + context.Notes.Add("The OpenStudio/EnergyPlus run did not complete successfully; measurements are unavailable."); + context.Warnings.Add("A producer-generated warning."); + + Modify.ApplyConversionDiagnostics(context, new List + { + BasisInformation("Design-day source: explicit DDY (Boston.ddy)"), + Warning("a converter warning") + }); + + Assert.That(context.Notes.Any(x => x.Contains("EnergyPlus version was unavailable")), Is.True, "Producer notes survive propagation: " + string.Join(" | ", context.Notes)); + Assert.That(context.Notes.Any(x => x.Contains("did not complete successfully")), Is.True); + Assert.That(context.Notes.Any(x => x.Contains("Design-day source")), Is.True, "Propagated and producer notes are combined"); + Assert.That(context.Warnings.Any(x => x.Contains("A producer-generated warning.")), Is.True); + Assert.That(context.Notes, Is.EqualTo(context.Notes.OrderBy(x => x, System.StringComparer.Ordinal).ToList()), "The combined list is ordered too"); + } + + [Test] + public void NullAndEmptyDiagnostics_LeaveValidEmptyArrays() + { + OpenStudioBenchmarkContext nullDiagnostics = SuccessfulContext(); + Modify.ApplyConversionDiagnostics(nullDiagnostics, null); + Assert.That(nullDiagnostics.Warnings, Is.Empty); + Assert.That(nullDiagnostics.Notes, Is.Empty); + + AnalyticalModel model = BenchmarkFixture.SingleSpaceModel(); + OpenStudioBenchmarkContext emptyDiagnostics = BenchmarkFixture.Context(model, BenchmarkFixture.ResultSet()); + Modify.ApplyConversionDiagnostics(emptyDiagnostics, new List()); + Assert.That(emptyDiagnostics.Warnings, Is.Empty); + Assert.That(emptyDiagnostics.Notes, Is.Empty); + + // A null entry and a whitespace-only message are dropped rather than serialized: the schema + // rejects empty list entries. + OpenStudioBenchmarkContext dirty = SuccessfulContext(); + dirty.Notes.Add(" "); + dirty.Warnings.Add(null); + Modify.ApplyConversionDiagnostics(dirty, new List { null }); + Assert.That(dirty.Warnings, Is.Empty, "Null diagnostics and null entries are skipped"); + Assert.That(dirty.Notes, Is.Empty, "Whitespace-only entries are skipped"); + + BenchmarkDocument document = model.ToBenchmark(emptyDiagnostics); + Assert.That(document.Provenance.Warnings, Is.Not.Null.And.Empty, "Empty arrays still serialize as valid empty arrays"); + Assert.That(document.Provenance.Notes, Is.Not.Null.And.Empty); + Assert.That(BenchmarkValidator.Validate(document).IsValid, Is.True, "An empty-diagnostic document stays schema-valid"); + } + + [Test] + public void SuccessfulDocument_CarriesNonEmptyWarningsAndNotes() + { + // Integration-level mapping check: the propagated diagnostics survive into a SUCCESSFUL, + // schema-valid benchmark document — the exact case that previously emitted empty arrays. + AnalyticalModel model = BenchmarkFixture.SingleSpaceModel(); + OpenStudioBenchmarkContext context = BenchmarkFixture.Context(model, BenchmarkFixture.ResultSet()); + Modify.ApplyConversionDiagnostics(context, new List + { + Warning("the hourly humidity profile was approximated as a constant dew point"), + BasisInformation("Annual weather source: AnalyticalModel WeatherData") + }); + + BenchmarkDocument document = model.ToBenchmark(context); + + Assert.That(document.Provenance.State, Is.EqualTo(RunState.Success)); + Assert.That(document.Provenance.Warnings.Any(x => x.Contains("constant dew point")), Is.True, "A successful document can now carry converter warnings: " + string.Join(" | ", document.Provenance.Warnings)); + Assert.That(document.Provenance.Notes.Any(x => x.Contains("Annual weather source")), Is.True); + Assert.That(BenchmarkValidator.Validate(document).IsValid, Is.True, "Propagated diagnostics keep the document schema-valid: " + string.Join(" | ", BenchmarkValidator.Validate(document).Issues.Select(x => x.Message))); + } + } +} diff --git a/benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/Fixtures/BenchmarkFixture.cs b/benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/Fixtures/BenchmarkFixture.cs new file mode 100644 index 0000000..28993ec --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/Fixtures/BenchmarkFixture.cs @@ -0,0 +1,310 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020-2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; +using SAM.Analytical.Benchmark; +using SAM.Core; +using SAM.Geometry.Spatial; +using AnalyticalCreate = SAM.Analytical.Create; + +namespace SAM.Analytical.OpenStudio.Benchmark.Tests +{ + /// + /// Deterministic fixtures for the benchmark producer tests. A one-space + /// (fixed GUID, area and volume) plus a synthetic engine-neutral + /// keyed on that space's deterministic Ideal Loads + /// name for the offline mapping; and a full simulatable one-zone (the + /// same box, GUID and name as the C5 fixture) for the live consumption-unit pin. + /// + public static class BenchmarkFixture + { + public static readonly Guid SpaceGuid = new Guid("cccccccc-0000-0000-0000-000000000001"); + + public const string SpaceName = "Space Single"; + + public const double FloorArea = 20.0; + + public const double SpaceVolume = 60.0; + + // Golden measurements for the offline result set (distinct, non-round, in-range). + public const double AnnualHeatingKwh = 1234.5; + + public const double AnnualCoolingKwh = 678.25; + + public const double PeakHeatingKw = 3.6; + + public const double PeakCoolingKw = 2.4; + + public const int PeakHeatingHour = 205; + + public const int PeakCoolingHour = 4602; + + public const double UnmetHeatingHours = 3.0; + + public const double UnmetCoolingHours = 0.0; + + /// One conditioned office space with a fixed GUID, 20 m² floor area and 60 m³ volume (no geometry). + public static AnalyticalModel SingleSpaceModel() + { + AdjacencyCluster adjacencyCluster = new AdjacencyCluster(); + + Space space = new Space(SpaceGuid, SpaceName, new Point3D(2.5, 2, 1.5)); + space.SetValue(SpaceParameter.Area, FloorArea); + space.SetValue(SpaceParameter.Volume, SpaceVolume); + adjacencyCluster.AddObject(space); + + return new AnalyticalModel( + "Single Box Model", + "Benchmark producer offline fixture", + null, + null, + adjacencyCluster, + new MaterialLibrary("Benchmark Material Library"), + new ProfileLibrary("Benchmark Profile Library")); + } + + /// The Ideal Loads report key EnergyPlus would emit for the fixture space. + public static string IdealLoadsKey() + { + return Core.OpenStudio.Query.OpenStudioName("IdealLoads", SpaceName, SpaceGuid); + } + + /// The golden result set: annual energies [kWh], coincident peaks [kW]/hour-of-year and unmet hours [h]. + public static OpenStudioSimulationResultSet ResultSet() + { + string key = IdealLoadsKey(); + + Dictionary heatingEnergy = new Dictionary { { key, AnnualHeatingKwh } }; + Dictionary coolingEnergy = new Dictionary { { key, AnnualCoolingKwh } }; + Dictionary peakHeatingLoad = new Dictionary { { key, PeakHeatingKw } }; + Dictionary peakCoolingLoad = new Dictionary { { key, PeakCoolingKw } }; + Dictionary peakHeatingHour = new Dictionary { { key, PeakHeatingHour } }; + Dictionary peakCoolingHour = new Dictionary { { key, PeakCoolingHour } }; + Dictionary unmetHeating = new Dictionary { { key, UnmetHeatingHours } }; + Dictionary unmetCooling = new Dictionary { { key, UnmetCoolingHours } }; + Dictionary empty = new Dictionary(); + + return new OpenStudioSimulationResultSet( + heatingEnergy, + coolingEnergy, + peakHeatingLoad, + peakCoolingLoad, + peakHeatingHour, + peakCoolingHour, + PeakHeatingKw, + PeakHeatingHour, + PeakCoolingKw, + PeakCoolingHour, + unmetHeating, + unmetCooling, + empty, + empty, + empty, + empty, + empty, + empty, + empty, + null, + null, + null, + 12.5, + 0, + 0, + 0); + } + + /// + /// The full offline golden document: the one-space model mapped through the deterministic + /// result set and a fixed-provenance context (pinned ), + /// so its serialization is byte-stable and can be asserted against a committed fixture. + /// + public static BenchmarkDocument GoldenDocument() + { + AnalyticalModel model = SingleSpaceModel(); + OpenStudioSimulationResultSet resultSet = ResultSet(); + OpenStudioBenchmarkContext context = Context(model, resultSet); + return model.ToBenchmark(context); + } + + /// + /// A context with valid, fully deterministic provenance, ready to feed a successful benchmark + /// document. Both model-identity fields are pinned to fixed literals (not derived from the + /// live model) so the document serializes byte-for-byte identically on every run: the model + /// and its nested libraries/cluster take fresh random GUIDs each construction, which would + /// otherwise leak into sourceModelGuid and canonicalModelHash. The producer's + /// real hash computation is covered separately by the hashing test. + /// + public static OpenStudioBenchmarkContext Context(AnalyticalModel model, OpenStudioSimulationResultSet resultSet) + { + return new OpenStudioBenchmarkContext + { + SourceModelName = model.Name, + SourceModelGuid = "cccccccc000000000000000000000009", + SourceFileHash = BenchmarkHash.ComputeSha256(new byte[] { 1, 2, 3, 4 }), + CanonicalModelHash = BenchmarkCanonicalJson.ComputeSha256("{\"model\":\"benchmark-golden-fixture\"}"), + CanonicalizationVersion = BenchmarkCanonicalization.CurrentVersion, + SamCommit = "0123456789abcdef", + RunnerCommit = "fedcba9876543210", + EngineName = "EnergyPlus", + EngineVersion = "24.2.0", + SdkVersion = "3.10.0", + WeatherIdentity = "USA_TEST_Weather", + WeatherHash = BenchmarkHash.ComputeSha256(new byte[] { 5, 6, 7, 8 }), + DesignDaySource = DesignDaySource.None, + RunTimestampUtc = new DateTimeOffset(2026, 7, 21, 12, 0, 0, TimeSpan.Zero), + DurationSeconds = 12.5, + State = RunState.Success, + ResultSet = resultSet, + }; + } + + // ---- Full simulatable fixture (mirrors the C5 SingleBox: same box, GUID and name) ---- + + /// Opaque wall construction, layers inside → outside: Plasterboard 12.5 mm, Insulation 100 mm, Brick 100 mm. + private static readonly Construction WallConstruction = new Construction(new Guid("11111111-1111-1111-1111-111111111111"), "Fixture Construction", new List + { + new ConstructionLayer("Plasterboard", 0.0125), + new ConstructionLayer("Insulation", 0.1), + new ConstructionLayer("Brick", 0.1), + }); + + /// Double-glazing aperture construction, panes inside → outside: Glass 6 mm, Air 12 mm, Glass 6 mm. + private static readonly ApertureConstruction WindowConstruction = new ApertureConstruction(new Guid("22222222-2222-2222-2222-222222222222"), "Fixture Window", ApertureType.Window, new List + { + new ConstructionLayer("Glass", 0.006), + new ConstructionLayer("Air", 0.012), + new ConstructionLayer("Glass", 0.006), + }); + + /// + /// One-zone box (x 0–5, y 0–4, z 0–3) with a south window — the same conditioned office box + /// the C5 tests simulate. Reused here to pin the annual-consumption unit against the raw SQL. + /// + public static AnalyticalModel SingleBox() + { + AdjacencyCluster adjacencyCluster = new AdjacencyCluster(); + + Space space = new Space(SpaceGuid, SpaceName, P(2.5, 2, 1.5)); + space.SetValue(SpaceParameter.Area, FloorArea); + space.SetValue(SpaceParameter.Volume, SpaceVolume); + space.SetValue(SpaceParameter.OutsideSupplyAirFlow, 0.02); + space.InternalCondition = CreateOfficeInternalCondition(); + adjacencyCluster.AddObject(space); + + List panels = new List + { + AnalyticalCreate.Panel(WallConstruction, PanelType.SlabOnGrade, F(P(0, 0, 0), P(5, 0, 0), P(5, 4, 0), P(0, 4, 0))), + AnalyticalCreate.Panel(WallConstruction, PanelType.Roof, F(P(0, 0, 3), P(5, 0, 3), P(5, 4, 3), P(0, 4, 3))), + AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(0, 0, 0), P(5, 0, 0), P(5, 0, 3), P(0, 0, 3))), + AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(0, 0, 0), P(0, 4, 0), P(0, 4, 3), P(0, 0, 3))), + AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(0, 4, 0), P(5, 4, 0), P(5, 4, 3), P(0, 4, 3))), + AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(5, 0, 0), P(5, 4, 0), P(5, 4, 3), P(5, 0, 3))), + }; + + panels[2].AddAperture(AnalyticalCreate.Aperture(WindowConstruction, F(P(1, 0, 0.8), P(3, 0, 0.8), P(3, 0, 2.2), P(1, 0, 2.2)))); + + foreach (Panel panel in panels) + { + adjacencyCluster.AddObject(panel); + adjacencyCluster.AddRelation(space, panel); + } + + return new AnalyticalModel("Single Box Model", "Benchmark live consumption-unit fixture", null, null, adjacencyCluster, CreateMaterialLibrary(), CreateProfileLibrary()); + } + + private static MaterialLibrary CreateMaterialLibrary() + { + OpaqueMaterial brick = new OpaqueMaterial(new Guid("33333333-0000-0000-0000-000000000001"), "Brick", "Brick", "Fixture brick", 0.84, 1700, 800); + brick.SetValue(OpaqueMaterialParameter.ExternalEmissivity, 0.9); + brick.SetValue(OpaqueMaterialParameter.ExternalSolarReflectance, 0.3); + brick.SetValue(OpaqueMaterialParameter.ExternalLightReflectance, 0.3); + + OpaqueMaterial insulation = new OpaqueMaterial(new Guid("33333333-0000-0000-0000-000000000002"), "Insulation", "Insulation", "Fixture insulation", 0.035, 25, 1400); + insulation.SetValue(OpaqueMaterialParameter.ExternalEmissivity, 0.9); + insulation.SetValue(OpaqueMaterialParameter.ExternalSolarReflectance, 0.3); + insulation.SetValue(OpaqueMaterialParameter.ExternalLightReflectance, 0.3); + + OpaqueMaterial plasterboard = new OpaqueMaterial(new Guid("33333333-0000-0000-0000-000000000003"), "Plasterboard", "Plasterboard", "Fixture plasterboard", 0.25, 900, 1000); + plasterboard.SetValue(OpaqueMaterialParameter.ExternalEmissivity, 0.9); + plasterboard.SetValue(OpaqueMaterialParameter.ExternalSolarReflectance, 0.5); + plasterboard.SetValue(OpaqueMaterialParameter.ExternalLightReflectance, 0.5); + + TransparentMaterial glass = new TransparentMaterial(new Guid("33333333-0000-0000-0000-000000000004"), "Glass", "Glass", "Fixture glass", 1.0, 2500, 840); + glass.SetValue(TransparentMaterialParameter.SolarTransmittance, 0.7); + glass.SetValue(TransparentMaterialParameter.InternalSolarReflectance, 0.07); + glass.SetValue(TransparentMaterialParameter.ExternalSolarReflectance, 0.07); + glass.SetValue(TransparentMaterialParameter.LightTransmittance, 0.8); + glass.SetValue(TransparentMaterialParameter.InternalLightReflectance, 0.07); + glass.SetValue(TransparentMaterialParameter.ExternalLightReflectance, 0.07); + glass.SetValue(TransparentMaterialParameter.InternalEmissivity, 0.84); + glass.SetValue(TransparentMaterialParameter.ExternalEmissivity, 0.84); + + GasMaterial air = new GasMaterial(new Guid("33333333-0000-0000-0000-000000000005"), "Air"); + + MaterialLibrary result = new MaterialLibrary("Fixture Material Library"); + result.Add(brick); + result.Add(insulation); + result.Add(plasterboard); + result.Add(glass); + result.Add(air); + return result; + } + + private static ProfileLibrary CreateProfileLibrary(double heatingSetpoint = 21, double coolingSetpoint = 25) + { + double[] officeHours = new double[24]; + for (int i = 8; i <= 17; i++) + { + officeHours[i] = 1; + } + + double[] alwaysOn = new double[24]; + double[] heating = new double[24]; + double[] cooling = new double[24]; + for (int i = 0; i < 24; i++) + { + alwaysOn[i] = 1; + heating[i] = heatingSetpoint; + cooling[i] = coolingSetpoint; + } + + ProfileLibrary result = new ProfileLibrary("Fixture Profile Library"); + result.Add(new Profile("Office Occupancy", ProfileType.Occupancy, officeHours)); + result.Add(new Profile("Office Lighting", ProfileType.Lighting, officeHours)); + result.Add(new Profile("Office Equipment", ProfileType.EquipmentSensible, alwaysOn)); + result.Add(new Profile("Office Infiltration", ProfileType.Infiltration, alwaysOn)); + result.Add(new Profile("Office Heating", ProfileType.Heating, heating)); + result.Add(new Profile("Office Cooling", ProfileType.Cooling, cooling)); + return result; + } + + private static InternalCondition CreateOfficeInternalCondition() + { + InternalCondition result = new InternalCondition(new Guid("44444444-0000-0000-0000-000000000001"), "Office"); + result.SetValue(InternalConditionParameter.AreaPerPerson, 10.0); + result.SetValue(InternalConditionParameter.OccupancySensibleGainPerPerson, 75.0); + result.SetValue(InternalConditionParameter.OccupancyLatentGainPerPerson, 55.0); + result.SetValue(InternalConditionParameter.LightingGainPerArea, 8.0); + result.SetValue(InternalConditionParameter.EquipmentSensibleGainPerArea, 12.0); + result.SetValue(InternalConditionParameter.InfiltrationAirChangesPerHour, 0.5); + result.SetValue(InternalConditionParameter.OccupancyProfileName, "Office Occupancy"); + result.SetValue(InternalConditionParameter.LightingProfileName, "Office Lighting"); + result.SetValue(InternalConditionParameter.EquipmentSensibleProfileName, "Office Equipment"); + result.SetValue(InternalConditionParameter.InfiltrationProfileName, "Office Infiltration"); + result.SetValue(InternalConditionParameter.HeatingProfileName, "Office Heating"); + result.SetValue(InternalConditionParameter.CoolingProfileName, "Office Cooling"); + return result; + } + + private static Point3D P(double x, double y, double z) + { + return new Point3D(x, y, z); + } + + private static Face3D F(params Point3D[] point3Ds) + { + return new Face3D(new Polygon3D(point3Ds)); + } + } +} diff --git a/benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/Fixtures/golden-openstudio-benchmark.json b/benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/Fixtures/golden-openstudio-benchmark.json new file mode 100644 index 0000000..2140dd8 --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/Fixtures/golden-openstudio-benchmark.json @@ -0,0 +1,134 @@ +{ + "schemaVersion": "1.0.0", + "provenance": { + "sourceModelName": "Single Box Model", + "sourceModelGuid": "cccccccc000000000000000000000009", + "sourceFileHash": "sha256:9f64a747e1b97f131fabb6b447296c9b6f0201e79fb3c5356e6c77e89b6a806a", + "canonicalModelHash": "sha256:2c1250ded6a34fad90bcd4a698075a5768489e086d4056e1bd6166c5c8c96fb9", + "canonicalizationVersion": "1.0.0", + "samCommit": "0123456789abcdef", + "runnerCommit": "fedcba9876543210", + "engine": { + "kind": "OpenStudio", + "name": "EnergyPlus", + "version": "24.2.0", + "sdkVersion": "3.10.0" + }, + "route": "Native-OpenStudio", + "weather": { + "identity": "USA_TEST_Weather", + "hash": "sha256:55e5509f8052998294266ee5b50cb592938191fb5d67f73cac2e60b0276b1bdd" + }, + "designDaySource": "None", + "runTimestampUtc": "2026-07-21T12:00:00Z", + "durationSeconds": 12.5, + "state": "Success", + "resultSources": [ + "SAM.Analytical.OpenStudio" + ], + "warnings": [], + "notes": [] + }, + "model": { + "consumptionHeating": { + "value": 1234.5, + "unit": "kWh", + "available": true + }, + "consumptionCooling": { + "value": 678.25, + "unit": "kWh", + "available": true + }, + "peakHeatingLoad": { + "value": 3.6, + "unit": "kW", + "available": true + }, + "peakHeatingHour": { + "value": 205, + "unit": "hourOfYear", + "available": true + }, + "peakCoolingLoad": { + "value": 2.4, + "unit": "kW", + "available": true + }, + "peakCoolingHour": { + "value": 4602, + "unit": "hourOfYear", + "available": true + }, + "floorArea": { + "value": 20, + "unit": "m2", + "available": true + }, + "volume": { + "value": 60, + "unit": "m3", + "available": true + } + }, + "spaces": [ + { + "guid": "cccccccc000000000000000000000001", + "name": "Space Single", + "area": { + "value": 20, + "unit": "m2", + "available": true + }, + "volume": { + "value": 60, + "unit": "m3", + "available": true + }, + "heating": { + "designLoad": { + "value": null, + "unit": "W", + "available": false + }, + "peakLoad": { + "value": 3600, + "unit": "W", + "available": true + }, + "peakHour": { + "value": 205, + "unit": "hourOfYear", + "available": true + }, + "unmetHours": { + "value": 3, + "unit": "h", + "available": true + } + }, + "cooling": { + "designLoad": { + "value": null, + "unit": "W", + "available": false + }, + "peakLoad": { + "value": 2400, + "unit": "W", + "available": true + }, + "peakHour": { + "value": 4602, + "unit": "hourOfYear", + "available": true + }, + "unmetHours": { + "value": 0, + "unit": "h", + "available": true + } + } + } + ] +} \ No newline at end of file diff --git a/benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/OfflineGoldenTests.cs b/benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/OfflineGoldenTests.cs new file mode 100644 index 0000000..0d38a72 --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/OfflineGoldenTests.cs @@ -0,0 +1,201 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020-2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.Json.Nodes; +using NUnit.Framework; +using SAM.Analytical.Benchmark; + +namespace SAM.Analytical.OpenStudio.Benchmark.Tests +{ + /// + /// Offline producer coverage: the C5 engine-neutral result set → B1a benchmark document + /// mapping, the two provenance hashes, and full schema validation — all with no OpenStudio or + /// EnergyPlus installed. The result set is built directly (its public constructor is the neutral + /// C5 type the live route also produces), so nothing here re-extracts or re-converts. + /// + [TestFixture] + public class OfflineGoldenTests + { + private static BenchmarkDocument Golden() + { + return BenchmarkFixture.GoldenDocument(); + } + + [Test] + public void Golden_ModelMetrics_MappedWithExplicitUnits() + { + BenchmarkModelResult model = Golden().Model; + + AssertAvailable(model.ConsumptionHeating, BenchmarkFixture.AnnualHeatingKwh, MetricUnit.KilowattHour); + AssertAvailable(model.ConsumptionCooling, BenchmarkFixture.AnnualCoolingKwh, MetricUnit.KilowattHour); + AssertAvailable(model.PeakHeatingLoad, BenchmarkFixture.PeakHeatingKw, MetricUnit.Kilowatt); + AssertAvailable(model.PeakHeatingHour, BenchmarkFixture.PeakHeatingHour, MetricUnit.HourOfYear); + AssertAvailable(model.PeakCoolingLoad, BenchmarkFixture.PeakCoolingKw, MetricUnit.Kilowatt); + AssertAvailable(model.PeakCoolingHour, BenchmarkFixture.PeakCoolingHour, MetricUnit.HourOfYear); + AssertAvailable(model.FloorArea, BenchmarkFixture.FloorArea, MetricUnit.SquareMetre); + AssertAvailable(model.Volume, BenchmarkFixture.SpaceVolume, MetricUnit.CubicMetre); + } + + [Test] + public void Golden_SpaceMetrics_PeakLoadsInWatts_UnmetZeroIsMeasured() + { + BenchmarkDocument document = Golden(); + Assert.That(document.Spaces, Has.Count.EqualTo(1)); + + BenchmarkSpaceResult space = document.Spaces.Single(); + Assert.That(space.Guid, Is.EqualTo(BenchmarkFixture.SpaceGuid.ToString("N"))); + Assert.That(space.Name, Is.EqualTo(BenchmarkFixture.SpaceName)); + AssertAvailable(space.Area, BenchmarkFixture.FloorArea, MetricUnit.SquareMetre); + AssertAvailable(space.Volume, BenchmarkFixture.SpaceVolume, MetricUnit.CubicMetre); + + // Space peaks are Watts (kW * 1000), coupled with their hour-of-year. + AssertAvailable(space.Heating.PeakLoad, BenchmarkFixture.PeakHeatingKw * 1000.0, MetricUnit.Watt); + AssertAvailable(space.Heating.PeakHour, BenchmarkFixture.PeakHeatingHour, MetricUnit.HourOfYear); + AssertAvailable(space.Cooling.PeakLoad, BenchmarkFixture.PeakCoolingKw * 1000.0, MetricUnit.Watt); + AssertAvailable(space.Cooling.PeakHour, BenchmarkFixture.PeakCoolingHour, MetricUnit.HourOfYear); + + // A measured zero stays a value of 0 and available; a genuinely non-zero unmet is kept. + AssertAvailable(space.Heating.UnmetHours, BenchmarkFixture.UnmetHeatingHours, MetricUnit.Hour); + AssertAvailable(space.Cooling.UnmetHours, BenchmarkFixture.UnmetCoolingHours, MetricUnit.Hour); + + // The v1 headless-annual route runs no sizing period: design loads are unavailable. + AssertUnavailable(space.Heating.DesignLoad, MetricUnit.Watt); + AssertUnavailable(space.Cooling.DesignLoad, MetricUnit.Watt); + } + + [Test] + public void Golden_Provenance_IsNativeOpenStudioRoute() + { + BenchmarkProvenance provenance = Golden().Provenance; + + Assert.That(provenance.Route, Is.EqualTo(BenchmarkRoute.NativeOpenStudio)); + Assert.That(provenance.Engine.Kind, Is.EqualTo(EngineKind.OpenStudio)); + Assert.That(provenance.Engine.Name, Is.EqualTo("EnergyPlus")); + Assert.That(provenance.CanonicalizationVersion, Is.EqualTo(BenchmarkCanonicalization.CurrentVersion)); + Assert.That(provenance.ResultSources, Is.EqualTo(new[] { Query.Source() })); + Assert.That(provenance.State, Is.EqualTo(RunState.Success)); + } + + [Test] + public void Golden_Document_ValidatesWithZeroErrorsAndWarnings() + { + BenchmarkValidationResult validation = BenchmarkValidator.Validate(Golden()); + + Assert.That(validation.Errors, Is.Empty, "Errors: " + string.Join(" | ", validation.Errors.Select(x => x.ToString()))); + Assert.That(validation.Warnings, Is.Empty, "Warnings: " + string.Join(" | ", validation.Warnings.Select(x => x.ToString()))); + Assert.That(validation.IsValid, Is.True); + } + + [Test] + public void Golden_Serializes_AndRoundTrips() + { + BenchmarkDocument document = Golden(); + + string json = BenchmarkSerializer.Serialize(document); + Assert.That(json, Does.Contain("\"route\": \"Native-OpenStudio\"")); + + BenchmarkDocument reloaded = BenchmarkSerializer.Deserialize(json); + Assert.That(reloaded.Model.ConsumptionHeating.Value, Is.EqualTo(BenchmarkFixture.AnnualHeatingKwh).Within(1e-9)); + Assert.That(reloaded.Spaces.Single().Heating.PeakLoad.Value, Is.EqualTo(BenchmarkFixture.PeakHeatingKw * 1000.0).Within(1e-9)); + } + + /// + /// The producer's serialized bytes must equal a committed golden fixture, exactly. This is + /// the byte-stable contract the whole benchmark rests on: the serializer canonicalizes + /// (sorted spaces/warnings/notes, UTC timestamp, LF newlines, UTF-8 no BOM) and the fixture + /// pins a fixed run timestamp, so any drift in the C5 -> B1a mapping, unit tokens or + /// serializer layout fails here. Regenerate intentionally with + /// SAM_BENCHMARK_UPDATE_GOLDEN=1 after reviewing the diff. + /// + [Test] + public void Golden_Bytes_MatchCommittedFixture() + { + byte[] produced = BenchmarkSerializer.SerializeToUtf8(Golden()); + string goldenPath = GoldenFixturePath(); + + if (Environment.GetEnvironmentVariable("SAM_BENCHMARK_UPDATE_GOLDEN") == "1") + { + File.WriteAllBytes(goldenPath, produced); + TestContext.Out.WriteLine("Rewrote golden fixture: " + goldenPath); + } + + Assert.That(File.Exists(goldenPath), Is.True, "Committed golden fixture missing: " + goldenPath); + + byte[] committed = File.ReadAllBytes(goldenPath); + Assert.That(produced, Is.EqualTo(committed), + "Producer output drifted from the committed golden fixture. If the schema/mapping change was intentional, regenerate with SAM_BENCHMARK_UPDATE_GOLDEN=1 and review the diff."); + } + + /// + /// Resolves the committed golden fixture in the source tree by walking up from the test + /// output directory to the Tests project root (identified by its Fixtures folder). + /// + private static string GoldenFixturePath() + { + DirectoryInfo directory = new DirectoryInfo(TestContext.CurrentContext.TestDirectory); + while (directory != null) + { + string fixtures = Path.Combine(directory.FullName, "Fixtures"); + if (File.Exists(Path.Combine(fixtures, "BenchmarkFixture.cs"))) + { + return Path.Combine(fixtures, "golden-openstudio-benchmark.json"); + } + + directory = directory.Parent; + } + + return Path.GetFullPath(Path.Combine("Fixtures", "golden-openstudio-benchmark.json")); + } + + /// + /// The two hashes answer different questions: sourceFileHash is byte-identity of the + /// input file, canonicalModelHash is model-identity under formatting. Re-saving the + /// same model with different formatting must change the source hash and keep the canonical + /// hash, and the two must never be equal. + /// + [Test] + public void Hashes_SourceVariesWithFormatting_CanonicalIsStable() + { + AnalyticalModel model = BenchmarkFixture.SingleSpaceModel(); + JsonObject neutral = model.ToJsonObject(); + + string compact = neutral.ToJsonString(); + string indented = neutral.ToJsonString(new System.Text.Json.JsonSerializerOptions { WriteIndented = true }); + Assert.That(compact, Is.Not.EqualTo(indented), "The two serializations must differ in bytes"); + + string sourceHashCompact = BenchmarkHash.ComputeSha256(Encoding.UTF8.GetBytes(compact)); + string sourceHashIndented = BenchmarkHash.ComputeSha256(Encoding.UTF8.GetBytes(indented)); + Assert.That(sourceHashCompact, Is.Not.EqualTo(sourceHashIndented), "sourceFileHash must track exact bytes"); + + AnalyticalModel fromCompact = Core.Convert.ToSAM(compact).First(); + AnalyticalModel fromIndented = Core.Convert.ToSAM(indented).First(); + string canonicalFromCompact = BenchmarkCanonicalJson.ComputeSha256(fromCompact.ToJsonObject().ToJsonString()); + string canonicalFromIndented = BenchmarkCanonicalJson.ComputeSha256(fromIndented.ToJsonObject().ToJsonString()); + + Assert.That(canonicalFromCompact, Is.EqualTo(canonicalFromIndented), "canonicalModelHash must be formatting-independent"); + Assert.That(canonicalFromCompact, Does.StartWith("sha256:")); + Assert.That(canonicalFromCompact, Is.Not.EqualTo(sourceHashCompact), "the two hashes must never coincide"); + } + + private static void AssertAvailable(MetricValue metric, double expected, MetricUnit unit) + { + Assert.That(metric, Is.Not.Null); + Assert.That(metric.Available, Is.True, "expected available"); + Assert.That(metric.Unit, Is.EqualTo(unit)); + Assert.That(metric.Value, Is.Not.Null); + Assert.That(metric.Value.Value, Is.EqualTo(expected).Within(1e-9)); + } + + private static void AssertUnavailable(MetricValue metric, MetricUnit unit) + { + Assert.That(metric, Is.Not.Null); + Assert.That(metric.Available, Is.False, "expected unavailable"); + Assert.That(metric.Unit, Is.EqualTo(unit)); + Assert.That(metric.Value, Is.Null); + } + } +} diff --git a/benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/SAM.Analytical.OpenStudio.Benchmark.Tests.csproj b/benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/SAM.Analytical.OpenStudio.Benchmark.Tests.csproj new file mode 100644 index 0000000..c735453 --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/SAM.Analytical.OpenStudio.Benchmark.Tests.csproj @@ -0,0 +1,50 @@ + + + + net8.0 + Library + false + x64 + x64 + x64 + latest + disable + disable + + + + + + + + + + + + + + + + + + + ..\..\..\SAM_Validation\build\SAM.Analytical.Benchmark.dll + + + ..\..\..\SAM\build\SAM.Core.dll + + + ..\..\..\SAM\build\SAM.Geometry.dll + + + ..\..\..\SAM\build\SAM.Analytical.dll + + + ..\..\..\SAM\build\SAM.Architectural.dll + + + ..\..\..\SAM\build\SAM.Weather.dll + + + + diff --git a/benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/SimulationBenchmarkTests.cs b/benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/SimulationBenchmarkTests.cs new file mode 100644 index 0000000..2a78ab5 --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/SimulationBenchmarkTests.cs @@ -0,0 +1,145 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020-2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.IO; +using NUnit.Framework; +using SAM.Analytical.Benchmark; + +namespace SAM.Analytical.OpenStudio.Benchmark.Tests +{ + /// + /// Live end-to-end producer coverage (requires the OpenStudio CLI + EnergyPlus; self-ignored + /// otherwise). Runs the headless route on the SingleBox fixture and pins the annual-consumption + /// stored magnitude against the raw SQL: the document stores kWh (J ÷ 3 600 000, the one J→kWh + /// authority), never Wh (J ÷ 3600). This is the gating unit decision for every downstream + /// comparison — the TAS producer (B2) must store consumption in the same kWh magnitude. + /// + [TestFixture] + public class SimulationBenchmarkTests + { + [Test] + [Category("Simulation")] + public void SingleBox_AnnualConsumption_IsStoredInKilowattHours_NotWattHours() + { + if (Core.OpenStudio.Query.OpenStudioCliPath(null) == null) + { + Assert.Ignore("OpenStudio CLI not found; the live consumption-unit pin needs an OpenStudio/EnergyPlus install."); + } + + string epwPath = WeatherFile("USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2004-2018.epw"); + Assert.That(File.Exists(epwPath), Is.True, "Pinned weather fixture missing: " + epwPath); + + AnalyticalModel model = BenchmarkFixture.SingleBox(); + + string outputDirectory = Path.Combine(TestContext.CurrentContext.WorkDirectory, "benchmark_live_singlebox"); + if (Directory.Exists(outputDirectory)) + { + Directory.Delete(outputDirectory, true); + } + + using (OpenStudioConversionResult conversionResult = model.ToOpenStudio(epwPath, outputDirectory)) + { + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in conversionResult.Diagnostics) + { + TestContext.Out.WriteLine(diagnostic.ToString()); + } + + Assert.That(conversionResult.RunResult?.Success, Is.True, "The headless run must succeed"); + Assert.That(conversionResult.Results, Is.Not.Null, "A result set must be extracted"); + + // Observe the raw SQL: annual Ideal Loads heating energy is stored in Joules. + double rawJoules = ReadAnnualHeatingJoules(conversionResult.RunResult.SqlPath); + Assert.That(rawJoules, Is.GreaterThan(0), "The conditioned box must report heating energy"); + + double expectedKilowattHours = rawJoules / 3_600_000.0; // the pinned magnitude + double wattHours = rawJoules / 3_600.0; // the rejected alternative + + // The C5 result set already carries kWh (one J→kWh authority). + Assert.That(conversionResult.Results.TotalAnnualHeating, Is.EqualTo(expectedKilowattHours).Within(1e-6), + "Result set annual heating is kWh (J / 3 600 000)"); + + BenchmarkDocument document = model.ToBenchmark(BuildContext(model, epwPath, conversionResult)); + + MetricValue consumptionHeating = document.Model.ConsumptionHeating; + Assert.That(consumptionHeating.Unit, Is.EqualTo(MetricUnit.KilowattHour), "Consumption is stored with the kWh token"); + Assert.That(consumptionHeating.Available, Is.True); + Assert.That(consumptionHeating.Value.Value, Is.EqualTo(expectedKilowattHours).Within(1e-6), + "The stored consumption magnitude is kWh"); + Assert.That(consumptionHeating.Value.Value, Is.Not.EqualTo(wattHours).Within(1.0), + "The stored consumption magnitude is NOT Wh"); + + BenchmarkValidationResult validation = BenchmarkValidator.Validate(document); + Assert.That(validation.IsValid, Is.True, "Errors: " + string.Join(" | ", System.Linq.Enumerable.Select(validation.Errors, x => x.ToString()))); + + TestContext.Out.WriteLine(string.Format(System.Globalization.CultureInfo.InvariantCulture, + "PINNED consumptionHeating: raw SQL = {0} J -> stored {1} kWh (Wh would have been {2}).", + rawJoules, consumptionHeating.Value.Value, wattHours)); + } + } + + private static OpenStudioBenchmarkContext BuildContext(AnalyticalModel model, string epwPath, OpenStudioConversionResult conversionResult) + { + string neutralJson = model.ToJsonObject().ToJsonString(); + + return new OpenStudioBenchmarkContext + { + SourceModelName = model.Name, + SourceModelGuid = model.Guid.ToString("N"), + SourceFileHash = BenchmarkHash.ComputeSha256(neutralJson), + CanonicalModelHash = BenchmarkCanonicalJson.ComputeSha256(neutralJson), + CanonicalizationVersion = BenchmarkCanonicalization.CurrentVersion, + SamCommit = "0123456789abcdef", + RunnerCommit = "fedcba9876543210", + EngineName = "EnergyPlus", + EngineVersion = Core.OpenStudio.Query.EnergyPlusVersion(), + SdkVersion = Core.OpenStudio.Query.OpenStudioVersion(), + WeatherIdentity = Path.GetFileNameWithoutExtension(epwPath), + WeatherHash = BenchmarkHash.ComputeSha256(File.ReadAllBytes(epwPath)), + DesignDaySource = DesignDaySource.None, + RunTimestampUtc = DateTimeOffset.UtcNow, + DurationSeconds = conversionResult.Results.RuntimeSeconds, + State = RunState.Success, + ResultSet = conversionResult.Results, + }; + } + + private static double ReadAnnualHeatingJoules(string sqlPath) + { + using (System.Data.SQLite.SQLiteConnection connection = new System.Data.SQLite.SQLiteConnection("Data Source=" + sqlPath + ";Read Only=True")) + { + connection.Open(); + using (System.Data.SQLite.SQLiteCommand command = connection.CreateCommand()) + { + command.CommandText = + "SELECT SUM(rd.Value) FROM ReportData rd " + + "JOIN ReportDataDictionary rdd ON rd.ReportDataDictionaryIndex = rdd.ReportDataDictionaryIndex " + + "JOIN Time t ON rd.TimeIndex = t.TimeIndex " + + "WHERE rdd.Name = @name AND t.EnvironmentPeriodIndex IN " + + "(SELECT EnvironmentPeriodIndex FROM EnvironmentPeriods WHERE EnvironmentType = 3)"; + command.Parameters.AddWithValue("@name", "Zone Ideal Loads Supply Air Total Heating Energy"); + object value = command.ExecuteScalar(); + return value == null || value == DBNull.Value ? 0 : System.Convert.ToDouble(value, System.Globalization.CultureInfo.InvariantCulture); + } + } + } + + /// Resolves a weather fixture by walking up from the test directory to find tests\resources\weather. + private static string WeatherFile(string fileName) + { + DirectoryInfo directory = new DirectoryInfo(TestContext.CurrentContext.TestDirectory); + while (directory != null) + { + string candidate = Path.Combine(directory.FullName, "tests", "resources", "weather", fileName); + if (File.Exists(candidate)) + { + return candidate; + } + + directory = directory.Parent; + } + + return Path.Combine("tests", "resources", "weather", fileName); + } + } +} diff --git a/benchmark/SAM.Analytical.OpenStudio.Benchmark/Classes/OpenStudioBenchmarkContext.cs b/benchmark/SAM.Analytical.OpenStudio.Benchmark/Classes/OpenStudioBenchmarkContext.cs new file mode 100644 index 0000000..4c81a75 --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.Benchmark/Classes/OpenStudioBenchmarkContext.cs @@ -0,0 +1,93 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020-2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; +using SAM.Analytical.Benchmark; + +namespace SAM.Analytical.OpenStudio.Benchmark +{ + /// + /// Everything the + /// mapping needs that cannot be derived from the source alone: + /// the engine-neutral C5 result set (annual energies, coincident peaks, unmet hours) that + /// carries the measurements, and the run provenance (both model hashes computed by the B1a + /// helpers, weather identity/hash, engine/SDK versions, commits, timing and state). + /// + /// The context is engine-artefact-free: it holds an + /// (already reduced to SAM units — kWh, kW, W, hour-of-year) and pre-computed hashes, never an + /// OpenStudio model, gbXML, SQLite handle or working directory. That keeps the mapping a pure + /// function of SAM-neutral inputs and lets it be exercised with no OpenStudio install. + /// + /// + public sealed class OpenStudioBenchmarkContext + { + /// Portable model label (not a filesystem path). + public string SourceModelName { get; set; } + + /// Source SAM model GUID in 32-character lowercase hexadecimal form; null only for a pre-model failure. + public string SourceModelGuid { get; set; } + + /// SHA-256 of the exact input model-file bytes (sha256: + 64 hex); null only when a failure prevented hashing. + public string SourceFileHash { get; set; } + + /// SHA-256 of the canonical neutral SAM model (sha256: + 64 hex); null only when a failure prevented canonicalization. + public string CanonicalModelHash { get; set; } + + /// Canonicalization rules version; for a v1 producer. + public string CanonicalizationVersion { get; set; } + + /// SAM source revision used for the run (7-64 lowercase hex). + public string SamCommit { get; set; } + + /// Producer repository revision used for the run (7-64 lowercase hex). + public string RunnerCommit { get; set; } + + /// Simulation engine name, e.g. EnergyPlus. + public string EngineName { get; set; } + + /// EnergyPlus engine version; null only when unavailable and explained in /. + public string EngineVersion { get; set; } + + /// OpenStudio SDK version (translation/runtime), e.g. 3.10.0. + public string SdkVersion { get; set; } + + /// Portable weather identity (station/file identity, not an absolute path). + public string WeatherIdentity { get; set; } + + /// SHA-256 of the exact weather-file bytes (sha256: + 64 hex). + public string WeatherHash { get; set; } + + /// Design-day source used for the run. + public DesignDaySource DesignDaySource { get; set; } = DesignDaySource.None; + + /// ISO 8601 UTC instant the run started/completed. + public DateTimeOffset RunTimestampUtc { get; set; } + + /// Non-negative elapsed wall-clock seconds. + public double DurationSeconds { get; set; } + + /// Run outcome. + public RunState State { get; set; } = RunState.Success; + + /// Deterministically ordered warnings; no machine-specific paths. + public List Warnings { get; } = new List(); + + /// Deterministically ordered material assumptions or limitations. + public List Notes { get; } = new List(); + + /// + /// The engine-neutral result set (C5) supplying every measurement. Null for a failure + /// document, in which case all metrics are emitted as unavailable. + /// + public OpenStudioSimulationResultSet ResultSet { get; set; } + + /// + /// Optional per-space design-day (ZoneSizes) results supplying designLoad [W]. + /// Null/empty when no sizing periods ran — designLoad is then emitted as unavailable, + /// which is the expected v1 headless-annual case. Matched to spaces by Reference + /// (the SAM space GUID in "N" form) and load type. + /// + public IEnumerable SpaceDesignLoadResults { get; set; } + } +} diff --git a/benchmark/SAM.Analytical.OpenStudio.Benchmark/Modify/ApplyConversionDiagnostics.cs b/benchmark/SAM.Analytical.OpenStudio.Benchmark/Modify/ApplyConversionDiagnostics.cs new file mode 100644 index 0000000..7f7b19f --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.Benchmark/Modify/ApplyConversionDiagnostics.cs @@ -0,0 +1,160 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020-2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; + +namespace SAM.Analytical.OpenStudio.Benchmark +{ + public static partial class Modify + { + /// + /// The families whose + /// diagnostics describe the + /// SIMULATION BASIS or a material transformation of it, and therefore belong in the benchmark + /// document's notes. An allow-list of stable codes is used rather than message matching, so a + /// reworded diagnostic cannot silently change what the benchmark records. + /// + /// WeatherDataIssue (SAM-OS-RUN-002) — names the annual weather source, the + /// design-day source, the number/identity of imported design days, and the ground-temperature + /// source. These decide what the run actually simulated and sized against. + /// ResultExtractionLimitation (SAM-OS-RUN-003) — qualifies the measurements the + /// benchmark itself publishes (e.g. peaks assuming hourly reporting under a non-hourly + /// reporting frequency). + /// SimulationSettingsUnsupported (SAM-OS-SET-001) — a rejected or substituted + /// simulation setting changes the basis the numbers were produced on. + /// + /// Everything else is deliberately excluded. Geometry, adjacency, material, construction, + /// schedule, internal-condition and HVAC codes report per-object modelling detail: there can be + /// hundreds per model, they say nothing about the run basis, and copying them would turn the + /// notes array into conversion chatter. Their Warning and Error variants still reach + /// , so nothing that matters is dropped. + /// + private static readonly HashSet BenchmarkRelevantInformationCodes = new HashSet(StringComparer.Ordinal) + { + Core.OpenStudio.OpenStudioDiagnosticCodes.WeatherDataIssue, + Core.OpenStudio.OpenStudioDiagnosticCodes.ResultExtractionLimitation, + Core.OpenStudio.OpenStudioDiagnosticCodes.SimulationSettingsUnsupported + }; + + /// + /// Records the conversion's own diagnostics on the benchmark context, then makes both arrays + /// deterministic. Called for EVERY run, successful or not: the neutral schema provides + /// warnings/notes precisely so a reader can see what the route approximated, and a + /// successful run previously discarded all of it — a document claiming success while silently + /// omitting, say, that the hourly solar profile was replaced by ASHRAEClearSky overstates what + /// was compared. + /// + /// + /// Severity mapping: Warning and Error both become warnings (an Error that did not + /// stop the run is still something the reader must see). Only the allow-listed + /// become notes. Producer-generated entries + /// already present on the context are preserved and normalized together with the propagated + /// ones. Message text is taken verbatim from the diagnostic's own + /// , never rewritten. + /// + /// Context whose Warnings/Notes are appended and normalized. + /// Conversion diagnostics; null or empty is valid and leaves empty arrays. + internal static void ApplyConversionDiagnostics(OpenStudioBenchmarkContext openStudioBenchmarkContext, IEnumerable diagnostics) + { + if (openStudioBenchmarkContext == null) + { + return; + } + + openStudioBenchmarkContext.Warnings.AddRange(EnumerateWarningDiagnostics(diagnostics)); + openStudioBenchmarkContext.Notes.AddRange(EnumerateBenchmarkRelevantInformationDiagnostics(diagnostics)); + + NormalizeDiagnosticMessages(openStudioBenchmarkContext.Warnings); + NormalizeDiagnosticMessages(openStudioBenchmarkContext.Notes); + } + + /// + /// The formatted Warning and Error diagnostics, in source order. Errors are + /// included because a diagnostic severe enough to be an Error is never less relevant than a + /// Warning, and a run can complete with Errors recorded. + /// + internal static IEnumerable EnumerateWarningDiagnostics(IEnumerable diagnostics) + { + if (diagnostics == null) + { + yield break; + } + + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in diagnostics) + { + if (diagnostic == null) + { + continue; + } + + if (diagnostic.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning + || diagnostic.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error) + { + yield return diagnostic.ToString(); + } + } + } + + /// + /// The formatted Information diagnostics whose code is in + /// , in source order. Routine progress, + /// object-count and per-object modelling messages are not benchmark-relevant and are skipped. + /// + internal static IEnumerable EnumerateBenchmarkRelevantInformationDiagnostics(IEnumerable diagnostics) + { + if (diagnostics == null) + { + yield break; + } + + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in diagnostics) + { + if (diagnostic == null || diagnostic.Severity != Core.OpenStudio.OpenStudioDiagnosticSeverity.Information) + { + continue; + } + + if (diagnostic.Code != null && BenchmarkRelevantInformationCodes.Contains(diagnostic.Code)) + { + yield return diagnostic.ToString(); + } + } + } + + /// + /// Makes a warning/note list byte-stable in place: drops null and whitespace-only entries, drops + /// exact ordinal duplicates (the same conversion decision reported twice must not appear twice), + /// and sorts with . Entries are trimmed of surrounding + /// whitespace only — the diagnostic text itself is never rewritten. + /// + internal static void NormalizeDiagnosticMessages(List messages) + { + if (messages == null) + { + return; + } + + var seen = new HashSet(StringComparer.Ordinal); + var normalized = new List(messages.Count); + foreach (string message in messages) + { + if (string.IsNullOrWhiteSpace(message)) + { + continue; + } + + string trimmed = message.Trim(); + if (seen.Add(trimmed)) + { + normalized.Add(trimmed); + } + } + + normalized.Sort(StringComparer.Ordinal); + + messages.Clear(); + messages.AddRange(normalized); + } + } +} diff --git a/benchmark/SAM.Analytical.OpenStudio.Benchmark/Modify/ToBenchmark.cs b/benchmark/SAM.Analytical.OpenStudio.Benchmark/Modify/ToBenchmark.cs new file mode 100644 index 0000000..31a97c2 --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.Benchmark/Modify/ToBenchmark.cs @@ -0,0 +1,253 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020-2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; +using System.Linq; +using SAM.Analytical.Benchmark; + +namespace SAM.Analytical.OpenStudio.Benchmark +{ + public static partial class Modify + { + /// + /// Maps a simulated SAM and its run context to a B1a + /// benchmark document (schema v1, route Native-OpenStudio). Measurements are read + /// from the engine-neutral C5 result set through the established SAM mappings + /// ( for the + /// model, + /// for spaces) so this producer never re-extracts or re-converts anything. + /// + /// + /// Units are emitted with explicit tokens and no re-scaling: annual consumption is stored + /// as kWh exactly as the one J→kWh authority (Core.OpenStudio.Query.JoulesToKilowattHours) + /// produced it, model peaks as kW, space peaks/design loads as W, hours as hour-of-year in + /// 0..8759. A measurement that is present, finite and in range is available; anything + /// missing or out of range is available:false with a null value. A measured zero + /// stays a value of 0. Peak load and its hour are coupled: a peak with no valid hour-of-year + /// is emitted as unavailable rather than a misleading zero. + /// + /// The neutral source model (provides GUIDs, names, areas and volumes). + /// Run context: result set, hashes and provenance. + /// The benchmark document, or null when either argument is null. + public static BenchmarkDocument ToBenchmark(this AnalyticalModel analyticalModel, OpenStudioBenchmarkContext openStudioBenchmarkContext) + { + if (analyticalModel == null || openStudioBenchmarkContext == null) + { + return null; + } + + OpenStudioSimulationResultSet resultSet = openStudioBenchmarkContext.ResultSet; + AnalyticalModelSimulationResult modelResult = resultSet?.ToSAM(analyticalModel); + List spaceResults = resultSet?.ToSAM_SpaceSimulationResults(analyticalModel) ?? new List(); + + return new BenchmarkDocument + { + SchemaVersion = BenchmarkSchema.CurrentVersion, + Provenance = Provenance(openStudioBenchmarkContext, modelResult, spaceResults), + Model = Model(modelResult), + Spaces = Spaces(analyticalModel, spaceResults, openStudioBenchmarkContext.SpaceDesignLoadResults), + }; + } + + private static BenchmarkProvenance Provenance(OpenStudioBenchmarkContext context, AnalyticalModelSimulationResult modelResult, IEnumerable spaceResults) + { + return new BenchmarkProvenance + { + SourceModelName = context.SourceModelName, + SourceModelGuid = context.SourceModelGuid, + SourceFileHash = context.SourceFileHash, + CanonicalModelHash = context.CanonicalModelHash, + CanonicalizationVersion = context.CanonicalizationVersion, + SamCommit = context.SamCommit, + RunnerCommit = context.RunnerCommit, + Engine = new BenchmarkEngine + { + Kind = EngineKind.OpenStudio, + Name = context.EngineName, + Version = context.EngineVersion, + SdkVersion = context.SdkVersion, + }, + Route = BenchmarkRoute.NativeOpenStudio, + Weather = new BenchmarkWeather { Identity = context.WeatherIdentity, Hash = context.WeatherHash }, + DesignDaySource = context.DesignDaySource, + RunTimestampUtc = context.RunTimestampUtc, + DurationSeconds = context.DurationSeconds, + State = context.State, + ResultSources = ResultSources(modelResult, spaceResults), + Warnings = new List(context.Warnings ?? new List()), + Notes = new List(context.Notes ?? new List()), + }; + } + + /// Distinct, non-empty SAM Query.Source() values retained from the attached results. + private static List ResultSources(AnalyticalModelSimulationResult modelResult, IEnumerable spaceResults) + { + HashSet sources = new HashSet(StringComparer.Ordinal); + if (!string.IsNullOrWhiteSpace(modelResult?.Source)) + { + sources.Add(modelResult.Source); + } + + if (spaceResults != null) + { + foreach (SpaceSimulationResult spaceResult in spaceResults) + { + if (!string.IsNullOrWhiteSpace(spaceResult?.Source)) + { + sources.Add(spaceResult.Source); + } + } + } + + return sources.ToList(); + } + + private static BenchmarkModelResult Model(AnalyticalModelSimulationResult modelResult) + { + (MetricValue heatingLoad, MetricValue heatingHour) = Peak( + Double(modelResult, AnalyticalModelSimulationResultParameter.PeakHeatingLoad), + Integer(modelResult, AnalyticalModelSimulationResultParameter.PeakHeatingHour), + MetricUnit.Kilowatt); + + (MetricValue coolingLoad, MetricValue coolingHour) = Peak( + Double(modelResult, AnalyticalModelSimulationResultParameter.PeakCoolingLoad), + Integer(modelResult, AnalyticalModelSimulationResultParameter.PeakCoolingHour), + MetricUnit.Kilowatt); + + return new BenchmarkModelResult + { + ConsumptionHeating = NonNegative(Double(modelResult, AnalyticalModelSimulationResultParameter.ConsumptionHeating), MetricUnit.KilowattHour), + ConsumptionCooling = NonNegative(Double(modelResult, AnalyticalModelSimulationResultParameter.ConsumptionCooling), MetricUnit.KilowattHour), + PeakHeatingLoad = heatingLoad, + PeakHeatingHour = heatingHour, + PeakCoolingLoad = coolingLoad, + PeakCoolingHour = coolingHour, + FloorArea = NonNegative(Double(modelResult, AnalyticalModelSimulationResultParameter.FloorArea), MetricUnit.SquareMetre), + Volume = NonNegative(Double(modelResult, AnalyticalModelSimulationResultParameter.Volume), MetricUnit.CubicMetre), + }; + } + + private static List Spaces(AnalyticalModel analyticalModel, List spaceResults, IEnumerable designLoadResults) + { + List result = new List(); + + List spaces = analyticalModel.AdjacencyCluster?.GetSpaces(); + if (spaces == null) + { + return result; + } + + List designLoads = designLoadResults?.ToList() ?? new List(); + + foreach (Space space in spaces) + { + if (space == null) + { + continue; + } + + string reference = space.Guid.ToString("N"); + + result.Add(new BenchmarkSpaceResult + { + Guid = reference, + Name = space.Name, + Area = NonNegative(Double(space, SpaceParameter.Area), MetricUnit.SquareMetre), + Volume = NonNegative(Double(space, SpaceParameter.Volume), MetricUnit.CubicMetre), + Heating = Condition(reference, LoadType.Heating, spaceResults, designLoads), + Cooling = Condition(reference, LoadType.Cooling, spaceResults, designLoads), + }); + } + + return result; + } + + private static BenchmarkConditionResult Condition(string reference, LoadType loadType, List spaceResults, List designLoads) + { + SpaceSimulationResult annual = spaceResults.FirstOrDefault(x => Matches(x, reference, loadType) && Double(x, Analytical.SpaceSimulationResultParameter.Load).HasValue); + SpaceSimulationResult design = designLoads.FirstOrDefault(x => Matches(x, reference, loadType) && Double(x, Analytical.SpaceSimulationResultParameter.DesignLoad).HasValue); + + (MetricValue peakLoad, MetricValue peakHour) = Peak( + Double(annual, Analytical.SpaceSimulationResultParameter.Load), + Integer(annual, Analytical.SpaceSimulationResultParameter.LoadIndex), + MetricUnit.Watt); + + return new BenchmarkConditionResult + { + DesignLoad = NonNegative(Double(design, Analytical.SpaceSimulationResultParameter.DesignLoad), MetricUnit.Watt), + PeakLoad = peakLoad, + PeakHour = peakHour, + UnmetHours = NonNegative(Double(annual, Analytical.SpaceSimulationResultParameter.UnmetHours), MetricUnit.Hour), + }; + } + + private static bool Matches(SpaceSimulationResult spaceSimulationResult, string reference, LoadType loadType) + { + return spaceSimulationResult != null + && string.Equals(spaceSimulationResult.Reference, reference, StringComparison.OrdinalIgnoreCase) + && spaceSimulationResult.TryGetValue(Analytical.SpaceSimulationResultParameter.LoadType, out string value) + && string.Equals(value, loadType.ToString(), StringComparison.Ordinal); + } + + private static MetricValue NonNegative(double? value, MetricUnit unit) + { + if (value.HasValue && IsFinite(value.Value) && value.Value >= 0) + { + return MetricValue.AvailableValue(value.Value, unit); + } + + return MetricValue.Unavailable(unit); + } + + /// + /// A peak load and its hour-of-year, coupled: both are available only when the load is a + /// finite non-negative number and the hour is an integer in 0..8759; otherwise both are + /// unavailable (a peak without a valid hour is missing, never a measured zero). + /// + private static (MetricValue load, MetricValue hour) Peak(double? loadValue, int? hourValue, MetricUnit loadUnit) + { + bool hourValid = hourValue.HasValue && hourValue.Value >= 0 && hourValue.Value <= 8759; + bool loadValid = loadValue.HasValue && IsFinite(loadValue.Value) && loadValue.Value >= 0; + if (hourValid && loadValid) + { + return (MetricValue.AvailableValue(loadValue.Value, loadUnit), MetricValue.AvailableValue(hourValue.Value, MetricUnit.HourOfYear)); + } + + return (MetricValue.Unavailable(loadUnit), MetricValue.Unavailable(MetricUnit.HourOfYear)); + } + + private static double? Double(Core.SAMObject sAMObject, Enum parameter) + { + if (sAMObject != null && sAMObject.TryGetValue(parameter, out double value) && IsFinite(value)) + { + return value; + } + + return null; + } + + private static int? Integer(Core.SAMObject sAMObject, Enum parameter) + { + if (sAMObject != null && sAMObject.TryGetValue(parameter, out int value)) + { + return value; + } + + // Integer parameters are sometimes stored as doubles (e.g. a peak hour read back as a + // double); accept a whole-number double as the hour-of-year. + double? asDouble = Double(sAMObject, parameter); + if (asDouble.HasValue && asDouble.Value == Math.Truncate(asDouble.Value)) + { + return (int)asDouble.Value; + } + + return null; + } + + private static bool IsFinite(double value) + { + return !double.IsNaN(value) && !double.IsInfinity(value); + } + } +} diff --git a/benchmark/SAM.Analytical.OpenStudio.Benchmark/Program.cs b/benchmark/SAM.Analytical.OpenStudio.Benchmark/Program.cs new file mode 100644 index 0000000..5873efc --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.Benchmark/Program.cs @@ -0,0 +1,391 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020-2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; +using SAM.Analytical.Benchmark; + +namespace SAM.Analytical.OpenStudio.Benchmark +{ + /// + /// benchmark-openstudio: the B1b OpenStudio benchmark producer. Loads a SAM + /// AnalyticalModel, runs the headless OpenStudio/EnergyPlus route (SAM_OpenStudio's own + /// ToOpenStudio pipeline), and emits a B1a schema-v1 benchmark document + /// (route = Native-OpenStudio). The two provenance hashes are computed with the B1a + /// helpers exactly as the schema requires: sourceFileHash over the raw model bytes and + /// canonicalModelHash over the neutral SAM model BEFORE any OpenStudio translation. + /// + /// Argument parsing, invariant-culture, exception mapping and exit codes are delegated to the + /// shared benchmark CLI host () so this producer honours the same + /// contract as every other producer: 0 success, 2 usage, 3 input/IO/ + /// serialization, 4 validation, 5 producer failure (see ). + /// + /// + public static class Program + { + private static readonly Regex CommitPattern = new Regex("^[0-9a-f]{7,64}$", RegexOptions.CultureInvariant); + + private static readonly string[] RequiredOptions = { "model", "weather", "out" }; + + public static int Main(string[] args) + { + return Run(args, Console.Out, Console.Error); + } + + /// + /// Testable entry point: the shared host drives parsing, culture, help and exception mapping; + /// carries the producer logic. Writers are injectable so CLI tests can + /// capture the output without touching the process . + /// + internal static int Run(string[] args, TextWriter standardOutput, TextWriter standardError) + { + return BenchmarkCliHost.Run( + args, + Usage, + RequiredOptions, + (arguments, _) => Execute(arguments, standardOutput), + standardOutput, + standardError); + } + + private static int Execute(BenchmarkArguments arguments, TextWriter standardOutput) + { + // Path validation throws mapped exceptions: a missing input file is a FileNotFoundException + // (input/IO), a bad output directory a DirectoryNotFoundException (input/IO). + string modelPath = BenchmarkCliPaths.ValidateInputFile(arguments.RequireOption("model")); + string weatherPath = BenchmarkCliPaths.ValidateInputFile(arguments.RequireOption("weather")); + string outputPath = BenchmarkCliPaths.ValidateOutputFile(arguments.RequireOption("out")); + + // Provenance hashes (B1a helpers, exactly per SCHEMA.md "Canonical model hashing"). + string sourceFileHash = BenchmarkHash.ComputeSha256(File.ReadAllBytes(modelPath)); + + AnalyticalModel model = LoadModel(modelPath); + + // The canonical hash covers the neutral loaded model BEFORE any engine-specific mutation. + string neutralJson = model.ToJsonObject().ToJsonString(); + string canonicalModelHash = BenchmarkCanonicalJson.ComputeSha256(neutralJson); + + OpenStudioBenchmarkContext context = new OpenStudioBenchmarkContext + { + SourceModelName = string.IsNullOrWhiteSpace(model.Name) ? "model" : model.Name, + SourceModelGuid = model.Guid.ToString("N"), + SourceFileHash = sourceFileHash, + CanonicalModelHash = canonicalModelHash, + CanonicalizationVersion = BenchmarkCanonicalization.CurrentVersion, + SamCommit = ResolveCommit(arguments.GetOption("sam-commit"), "SAM_COMMIT", typeof(AnalyticalModel), allowLocalGit: false), + RunnerCommit = ResolveCommit(arguments.GetOption("runner-commit"), "RUNNER_COMMIT", typeof(Program), allowLocalGit: true), + EngineName = "EnergyPlus", + EngineVersion = SafeVersion(Core.OpenStudio.Query.EnergyPlusVersion), + SdkVersion = SafeVersion(Core.OpenStudio.Query.OpenStudioVersion), + WeatherIdentity = Path.GetFileNameWithoutExtension(weatherPath), + WeatherHash = BenchmarkHash.ComputeSha256(File.ReadAllBytes(weatherPath)), + // Design-day basis derived from the source model (as the TAS producer does), then + // replaced below by what the route actually established. Never hardcoded: the B3 + // comparator treats a designDaySource difference as provenance-incompatible, so a + // fixed value would report a genuinely paired cross-engine run as incomparable. + DesignDaySource = ResolveDesignDaySource(model), + RunTimestampUtc = DateTimeOffset.UtcNow, + }; + + if (string.IsNullOrEmpty(context.EngineVersion)) + { + context.EngineVersion = null; + context.Notes.Add("EnergyPlus version was unavailable from the loaded OpenStudio SDK at run time."); + } + + string workDirectory = arguments.GetOption("work") ?? Path.Combine(Path.GetTempPath(), "sam_benchmark_openstudio_" + Guid.NewGuid().ToString("N").Substring(0, 8)); + Directory.CreateDirectory(workDirectory); + + Stopwatch stopwatch = Stopwatch.StartNew(); + using (OpenStudioConversionResult conversionResult = model.ToOpenStudio(weatherPath, workDirectory)) + { + stopwatch.Stop(); + + bool success = conversionResult?.RunResult?.Success == true && conversionResult.Results != null; + context.State = success ? RunState.Success : RunState.Failure; + context.DurationSeconds = conversionResult?.Results != null && conversionResult.Results.RuntimeSeconds > 0 + ? conversionResult.Results.RuntimeSeconds + : stopwatch.Elapsed.TotalSeconds; + context.ResultSet = conversionResult?.Results; + + // The route reports its own design-day outcome (explicit DDY / embedded model / + // none), which is the provenance-grade answer: embedded days that were all skipped + // as invalid must not be reported as an embedded basis. The model-derived value + // above stands in only when no conversion result exists at all. + if (conversionResult != null) + { + DesignDaySource modelDesignDaySource = context.DesignDaySource; + context.DesignDaySource = ToBenchmarkDesignDaySource(conversionResult.DesignDaySource); + + if (context.DesignDaySource == DesignDaySource.None && modelDesignDaySource != DesignDaySource.None) + { + context.Notes.Add("The source model carries design days but the OpenStudio route imported none; designDaySource records the run's actual basis (None)."); + } + } + + if (!success) + { + context.Notes.Add("The OpenStudio/EnergyPlus run did not complete successfully; measurements are unavailable."); + } + + // Per-space design loads come from the route's own zone sizing results (SQL ZoneSizes), + // mapped by the SAME core converter every OpenStudio/Grasshopper consumer uses — the + // producer does not query the engine artefacts itself. Sizing results are separate from + // the annual results, so peakLoad/peakHour keep coming from the weather run only. + List designLoadDiagnostics = null; + if (conversionResult?.Results != null) + { + context.SpaceDesignLoadResults = conversionResult.Results.ToSAM_SpaceDesignLoadResults( + model?.AdjacencyCluster?.GetSpaces(), + out designLoadDiagnostics); + } + + // Record what the conversion itself reported, on EVERY run rather than only failures. + // The route documents its own approximations (hourly humidity collapsed to a constant + // dew point, hourly solar replaced by ASHRAEClearSky, a substituted barometric pressure, + // the weather/design-day/ground-temperature basis); a successful document that omitted + // them presented the comparison as cleaner than it was. This also normalizes the + // producer-generated notes added above, so both arrays are deterministic. + Modify.ApplyConversionDiagnostics(context, Concat(conversionResult?.Diagnostics, designLoadDiagnostics)); + + BenchmarkDocument document = model.ToBenchmark(context); + return Emit(document, outputPath, success, standardOutput); + } + } + + /// + /// Validates, writes and reports a produced document, returning the shared exit code: a + /// document that fails schema validation throws + /// (host maps to ); a valid document whose + /// run did not succeed returns ; otherwise + /// . Internal so the producer's exit-code decisions + /// are exercised offline without an OpenStudio install. + /// + internal static int Emit(BenchmarkDocument document, string outputPath, bool runSucceeded, TextWriter standardOutput) + { + BenchmarkValidationResult validation = BenchmarkValidator.Validate(document); + if (!validation.IsValid) + { + throw new BenchmarkValidationException(validation); + } + + BenchmarkSerializer.Write(outputPath, document); + standardOutput.WriteLine("Wrote " + outputPath + " (state=" + (runSucceeded ? RunState.Success : RunState.Failure) + ", route=Native-OpenStudio)."); + return runSucceeded ? (int)BenchmarkExitCode.Success : (int)BenchmarkExitCode.ProducerFailure; + } + + /// + /// Loads the source model. A file that exists but does not carry a SAM AnalyticalModel — + /// whether it deserializes to nothing or the SAM deserializer throws part way through — is a + /// deserialization failure, reported as so the + /// shared host maps it to input/IO/serialization (exit 3), never a producer failure (5). + /// + private static AnalyticalModel LoadModel(string modelPath) + { + AnalyticalModel model; + try + { + model = Core.Convert.ToSAM(modelPath)?.FirstOrDefault(); + } + catch (Exception exception) when (!(exception is IOException) && !(exception is UnauthorizedAccessException) && !(exception is System.Text.Json.JsonException)) + { + throw new System.Text.Json.JsonException("The model file could not be read as a SAM AnalyticalModel: " + modelPath, exception); + } + + if (model == null) + { + throw new System.Text.Json.JsonException("The model file did not deserialize to a SAM AnalyticalModel: " + modelPath); + } + + return model; + } + + /// + /// The design-day basis derivable from the source model before the run: only when the model actually carries heating or + /// cooling design days, otherwise — the same derivation + /// the TAS producer uses, so both documents populate the field on the same terms. This + /// producer passes no DDY to the route, so can only come + /// from the route's own report (an explicit DDY set through the conversion/run options). + /// + internal static DesignDaySource ResolveDesignDaySource(AnalyticalModel analyticalModel) + { + bool hasDesignDays = HasDesignDays(analyticalModel, AnalyticalModelParameter.HeatingDesignDays) + || HasDesignDays(analyticalModel, AnalyticalModelParameter.CoolingDesignDays); + return hasDesignDays ? DesignDaySource.EmbeddedModel : DesignDaySource.None; + } + + private static bool HasDesignDays(AnalyticalModel analyticalModel, AnalyticalModelParameter analyticalModelParameter) + { + return analyticalModel != null + && analyticalModel.TryGetValue(analyticalModelParameter, out Core.SAMCollection designDays) + && designDays != null + && designDays.Count > 0; + } + + /// Maps the design-day basis the route established onto the B1a provenance enum. + internal static DesignDaySource ToBenchmarkDesignDaySource(Core.OpenStudio.OpenStudioDesignDaySource openStudioDesignDaySource) + { + switch (openStudioDesignDaySource) + { + case Core.OpenStudio.OpenStudioDesignDaySource.Ddy: + return DesignDaySource.Ddy; + + case Core.OpenStudio.OpenStudioDesignDaySource.EmbeddedModel: + return DesignDaySource.EmbeddedModel; + + default: + return DesignDaySource.None; + } + } + + /// + /// Concatenates two diagnostic sequences, tolerating nulls, so conversion diagnostics and + /// result-mapping diagnostics are normalized together in one pass (deduplicated and ordered). + /// + private static IEnumerable Concat( + IEnumerable first, + IEnumerable second) + { + if (first != null) + { + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in first) + { + yield return diagnostic; + } + } + + if (second != null) + { + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in second) + { + yield return diagnostic; + } + } + } + + private static string SafeVersion(Func version) + { + try + { + return version(); + } + catch (Exception) + { + return null; + } + } + + /// + /// Resolves a 7-64 lowercase-hex commit: explicit argument, then environment variable, then + /// the assembly's InformationalVersion SHA (the +<sha> suffix CI stamps), then — + /// only for the runner — git rev-parse HEAD from the executable's directory. Returns + /// null when none resolve; validation then rejects the document with a precise message. + /// + private static string ResolveCommit(string explicitValue, string environmentVariable, Type assemblyType, bool allowLocalGit) + { + string candidate = Normalize(explicitValue); + if (candidate != null) + { + return candidate; + } + + candidate = Normalize(Environment.GetEnvironmentVariable(environmentVariable)); + if (candidate != null) + { + return candidate; + } + + candidate = Normalize(InformationalVersionSha(assemblyType)); + if (candidate != null) + { + return candidate; + } + + if (allowLocalGit) + { + candidate = Normalize(GitHead(AppContext.BaseDirectory)); + if (candidate != null) + { + return candidate; + } + } + + return null; + } + + private static string Normalize(string value) + { + if (string.IsNullOrWhiteSpace(value)) + { + return null; + } + + value = value.Trim().ToLowerInvariant(); + return CommitPattern.IsMatch(value) ? value : null; + } + + private static string InformationalVersionSha(Type assemblyType) + { + try + { + object[] attributes = assemblyType.Assembly.GetCustomAttributes(typeof(System.Reflection.AssemblyInformationalVersionAttribute), false); + if (attributes.Length == 0) + { + return null; + } + + string informationalVersion = ((System.Reflection.AssemblyInformationalVersionAttribute)attributes[0]).InformationalVersion; + int plus = informationalVersion?.IndexOf('+') ?? -1; + return plus >= 0 ? informationalVersion.Substring(plus + 1) : null; + } + catch (Exception) + { + return null; + } + } + + private static string GitHead(string directory) + { + try + { + ProcessStartInfo processStartInfo = new ProcessStartInfo + { + FileName = "git", + Arguments = "rev-parse HEAD", + WorkingDirectory = directory, + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true, + CreateNoWindow = true, + }; + + using (Process process = Process.Start(processStartInfo)) + { + if (process == null) + { + return null; + } + + string output = process.StandardOutput.ReadToEnd(); + process.WaitForExit(5000); + return process.ExitCode == 0 ? output.Trim() : null; + } + } + catch (Exception) + { + return null; + } + } + + private const string Usage = + "Usage: benchmark-openstudio --model --weather --out \n" + + " [--work ] [--sam-commit ] [--runner-commit ]\n" + + "\n" + + "Exit codes: 0 success, 2 usage error, 3 input/IO/serialization error, 4 validation failure, 5 producer failure."; + } +} diff --git a/benchmark/SAM.Analytical.OpenStudio.Benchmark/SAM.Analytical.OpenStudio.Benchmark.csproj b/benchmark/SAM.Analytical.OpenStudio.Benchmark/SAM.Analytical.OpenStudio.Benchmark.csproj new file mode 100644 index 0000000..a4d0ef3 --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.Benchmark/SAM.Analytical.OpenStudio.Benchmark.csproj @@ -0,0 +1,58 @@ + + + + Exe + net8.0 + SAM.Analytical.OpenStudio.Benchmark + + benchmark-openstudio + false + x64 + x64 + x64 + latest + disable + disable + + + + + + + + + + + + + + + + + + + + + ..\..\..\SAM_Validation\build\SAM.Analytical.Benchmark.dll + true + + + ..\..\..\SAM\build\SAM.Core.dll + + + ..\..\..\SAM\build\SAM.Geometry.dll + + + ..\..\..\SAM\build\SAM.Analytical.dll + + + ..\..\..\SAM\build\SAM.Architectural.dll + + + ..\..\..\SAM\build\SAM.Weather.dll + + + + diff --git a/docs/SAM_OPENSTUDIO_ANALYTICAL_COVERAGE.md b/docs/SAM_OPENSTUDIO_ANALYTICAL_COVERAGE.md new file mode 100644 index 0000000..9d24c7e --- /dev/null +++ b/docs/SAM_OPENSTUDIO_ANALYTICAL_COVERAGE.md @@ -0,0 +1,510 @@ +# SAM → OpenStudio Analytical Translation Coverage + +Status: reviewed 2026-07-19 (programme *SAM → OpenStudio Analytical Completeness v1*, milestone C0). + +This document is the complete audit of the `SAM.Analytical.AnalyticalModel` data surface +against the native OpenStudio translation in this repository. It is **generated from and kept +in lockstep with** the machine-readable manifest +[`tests/resources/openstudio-analytical-coverage.json`](../tests/resources/openstudio-analytical-coverage.json); +the completeness tests enforce the manifest (never this Markdown). When coverage changes, update +the manifest first and regenerate the tables here. + +## Classification scheme + +Every SAM property or concept with potential energy-model semantics is classified as exactly one of: + +| Status | Meaning | +|---|---| +| **Native** | Direct OpenStudio/EnergyPlus representation; values pass through (unit-converted where needed). | +| **Derived** | Deterministically calculated from SAM source data (formula documented per row). | +| **Approximated** | Mapped under a documented engineering assumption; a structured diagnostic notes the approximation where it can distort results. | +| **Unsupported** | No safe OpenStudio equivalent; when source data is present a structured diagnostic is emitted. Nothing is silently dropped. | +| **Deferred** | Belongs to the detailed-HVAC programme (air/plant loops, equipment, controls, water systems). Ideal Loads remains the simulation system here. | +| **NA** | No translation applies: display/compliance metadata, result-only slots, derived classifications OpenStudio computes itself, or concepts with no SAM source data. | + +The **Milestone** column names where the final mapping lands: `MVP` = merged PR #7; +`C1`–`C5` = this programme's milestones; `C0` marks rows whose classification (NA/Deferred) +*is* the outcome. Rows are updated as milestones complete. + +## Explicitly deferred domains + +Detailed SAM AirSystem conversion; air loops and plant loops; heating/cooling system equipment; +water systems; control sequences; Modelica/FMI; compliance workflows (NCM, Part F, Part O); +the TAS-versus-EnergyPlus validation harness; AI-assisted QA. + +## Reclassifications agreed at programme approval + +- **Glazing dividers/muntins — NA**: SAM has no divider geometry model (`AperturePart` is Pane|Frame only). +- **Aperture blinds/shades (`IsBlind`, `FeatureShade`) — Unsupported** with diagnostic: SAM carries no slat/shade geometry, so fabricating `WindowMaterial:Blind` inputs would be invention. +- **Opening properties (openable fraction, discharge coefficient) — Unsupported** under Ideal Loads (AirflowNetwork territory), deferred to the HVAC programme. +- **STAT-file ground temperatures — deferred**: no STAT parser exists in the SAM ecosystem; SAM `WeatherData` and the EPW header cover the need. +- **SAM hourly `DesignDay` → parametric `SizingPeriod:DesignDay` — Approximated** (documented fit), downgradeable to a diagnostic if unsafe; deterministic DDY import is the primary design-day path. +- **Subhourly profiles — NA**: SAM `Profile` stores are hour-indexed; no subhourly source data exists. +- **Daylight saving — Approximated, default off** (energy-model convention); SAM carries no DST data, the EPW header is the only source. +- **Emitter radiant proportions — Deferred**: Ideal Loads is a purely convective air system. +- **Pollutant profiles — Unsupported** (EnergyPlus generic-contaminant modelling out of scope). + +## Coverage tables + +Legend: **Status** per the scheme above; **Conversion / policy** carries the formula, +diagnostic code and/or note recorded in the manifest. + +### Internal conditions (`SAM.Analytical.InternalConditionParameter`) + +| SAM property | Unit | OpenStudio / EnergyPlus representation | Status | Milestone | Conversion / policy | +|---|---|---|---|---|---| +| `InternalConditionParameter.Color` | - | SpaceType RenderingColor | Native | C2 | Display colour only; no energy effect. | +| `InternalConditionParameter.AreaPerPerson` | m2/p | OS:People:Definition People per Space Floor Area | Native | MVP | peoplePerArea = Analytical.Query.CalculatedPeoplePerArea(space) | +| `InternalConditionParameter.OccupancyProfileName` | - | OS:People Number of People Schedule (ScheduleFixedInterval) | Native | MVP | SAM-OS-SCH-001 error when gains exist but profile unresolved; load skipped | +| `InternalConditionParameter.OccupancySensibleGainPerPerson` | W/p | OS:People:Definition Sensible Heat Fraction + constant ActivityLevel schedule | Derived | MVP | sensibleFraction = S/(S+L); activityLevel = OccupancyGain/CalculatedOccupancy [W/p] | +| `InternalConditionParameter.OccupancyLatentGainPerPerson` | W/p | OS:People:Definition Sensible Heat Fraction (complement) + ActivityLevel schedule | Derived | MVP | latent = activityLevel * (1 - sensibleFraction) | +| `InternalConditionParameter.EquipmentSensibleProfileName` | - | OS:ElectricEquipment Schedule (sensible instance) | Native | MVP | SAM-OS-SCH-001 error when gains exist but profile unresolved | +| `InternalConditionParameter.EquipmentSensibleGain` | W | OS:ElectricEquipment:Definition Watts per Space Floor Area (sensible instance) | Derived | MVP | W/m2 = CalculatedEquipmentSensibleGain(space)/SpaceParameter.Area | +| `InternalConditionParameter.EquipmentSensibleGainPerArea` | W/m2 | OS:ElectricEquipment:Definition Watts per Space Floor Area (sensible instance) | Native | MVP | - | +| `InternalConditionParameter.EquipmentSensibleGainPerPerson` | W/p | OS:ElectricEquipment:Definition Watts per Space Floor Area (sensible instance) | Derived | MVP | folded through Analytical.Query.CalculatedEquipmentSensibleGain(space) | +| `InternalConditionParameter.EquipmentLatentProfileName` | - | OS:ElectricEquipment Schedule (dedicated latent instance) | Native | C2 | SAM-OS-SCH-001 error when latent gains exist but profile unresolved | +| `InternalConditionParameter.EquipmentLatentGain` | W | OS:ElectricEquipment:Definition (latent instance, Fraction Latent = 1) | Derived | C2 | W/m2 = CalculatedEquipmentLatentGain(space)/SpaceParameter.Area; separate instance so sensible/latent keep independent profiles | +| `InternalConditionParameter.EquipmentLatentGainPerArea` | W/m2 | OS:ElectricEquipment:Definition (latent instance, Fraction Latent = 1) | Native | C2 | - | +| `InternalConditionParameter.LightingGainPerArea` | W/m2 | OS:Lights:Definition Watts per Space Floor Area | Native | MVP | - | +| `InternalConditionParameter.LightingGainPerPerson` | W/p | OS:Lights:Definition Watts per Space Floor Area | Derived | MVP | folded through Analytical.Query.CalculatedLightingGain(space) | +| `InternalConditionParameter.LightingGain` | W | OS:Lights:Definition Watts per Space Floor Area | Derived | MVP | W/m2 = CalculatedLightingGain(space)/SpaceParameter.Area | +| `InternalConditionParameter.LightingLevel` | lux | OS:Lights:Definition Watts per Space Floor Area | Derived | MVP | lux-based lighting gain folded through Analytical.Query.CalculatedLightingGain (with LightingEfficiency) | +| `InternalConditionParameter.LightingProfileName` | - | OS:Lights Schedule | Native | MVP | SAM-OS-SCH-001 error when gains exist but profile unresolved | +| `InternalConditionParameter.LightingEfficiency` | W/m2/100lux | OS:Lights:Definition Watts per Space Floor Area | Derived | MVP | with LightingLevel through CalculatedLightingGain | +| `InternalConditionParameter.InfiltrationAirChangesPerHour` | ACH | OS:SpaceInfiltration:DesignFlowRate Air Changes per Hour | Native | C2 | MVP approximated as Flow per Exterior Surface Area; C2 uses the native ACH field. | +| `InternalConditionParameter.InfiltrationProfileName` | - | OS:SpaceInfiltration:DesignFlowRate Schedule | Native | MVP | SAM-OS-SCH-001 error when infiltration exists but profile unresolved | +| `InternalConditionParameter.PollutantGenerationPerPerson` | g/h/p | - | Unsupported | C2 | SAM-OS-IC-001 warning; EnergyPlus generic contaminant modelling out of scope | +| `InternalConditionParameter.PollutantGenerationPerArea` | g/h/m2 | - | Unsupported | C2 | SAM-OS-IC-001 warning | +| `InternalConditionParameter.PollutantProfileName` | - | - | Unsupported | C2 | SAM-OS-IC-001 warning | +| `InternalConditionParameter.HeatingEmitterRadiantProportion` | 0-1 | - | Deferred | C2 | SAM-OS-HVAC-001 info; Ideal Loads is a convective air system - emitter characteristics need detailed HVAC | +| `InternalConditionParameter.HeatingEmitterCoefficient` | 0-1 | - | Deferred | C2 | SAM-OS-HVAC-001 info | +| `InternalConditionParameter.HeatingProfileName` | - | OS:ThermostatSetpoint:DualSetpoint Heating Setpoint Schedule | Native | MVP | - | +| `InternalConditionParameter.CoolingEmitterRadiantProportion` | 0-1 | - | Deferred | C2 | SAM-OS-HVAC-001 info | +| `InternalConditionParameter.CoolingEmitterCoefficient` | 0-1 | - | Deferred | C2 | SAM-OS-HVAC-001 info | +| `InternalConditionParameter.CoolingProfileName` | - | OS:ThermostatSetpoint:DualSetpoint Cooling Setpoint Schedule | Native | MVP | - | +| `InternalConditionParameter.HumidificationProfileName` | - | OS:ZoneControl:Humidistat Humidifying Relative Humidity Schedule + IdealLoads Humidification Control Type Humidistat | Native | C2 | SAM-OS-SCH-001 error when named but unresolved | +| `InternalConditionParameter.DehumidificationProfileName` | - | OS:ZoneControl:Humidistat Dehumidifying Relative Humidity Schedule + IdealLoads Dehumidification Control Type Humidistat | Native | C2 | SAM-OS-SCH-001 error when named but unresolved | +| `InternalConditionParameter.VentilationSystemTypeName` | - | - | Deferred | C2 | System identity feeds conditioned-space classification (Query.IsConditioned); equipment itself is detailed HVAC. | +| `InternalConditionParameter.CoolingSystemTypeName` | - | - | Deferred | C2 | Informs IsConditioned classification. | +| `InternalConditionParameter.HeatingSystemTypeName` | - | - | Deferred | C2 | Informs IsConditioned classification. | +| `InternalConditionParameter.SupplyAirFlowPerPerson` | m3/s/p | OS:DesignSpecification:OutdoorAir Outdoor Air Flow per Person (method Sum) | Native | C2 | - | +| `InternalConditionParameter.ExhaustAirFlowPerPerson` | m3/s/p | - | Deferred | C2 | SAM-OS-HVAC-001 info; exhaust flows need fan/air-loop equipment | +| `InternalConditionParameter.SupplyAirChangesPerHour` | ACH | OS:DesignSpecification:OutdoorAir Air Changes per Hour (method Sum) | Native | C2 | - | +| `InternalConditionParameter.ExhaustAirChangesPerHour` | ACH | - | Deferred | C2 | SAM-OS-HVAC-001 info | +| `InternalConditionParameter.SupplyAirFlowPerArea` | m3/s/m2 | OS:DesignSpecification:OutdoorAir Outdoor Air Flow per Floor Area (method Sum) | Native | C2 | - | +| `InternalConditionParameter.ExhaustAirFlowPerArea` | m3/s/m2 | - | Deferred | C2 | SAM-OS-HVAC-001 info | +| `InternalConditionParameter.SupplyAirFlow` | m3/s | OS:DesignSpecification:OutdoorAir Outdoor Air Flow Rate (method Sum) | Native | C2 | SpaceParameter.OutsideSupplyAirFlow takes precedence when present (space override). | +| `InternalConditionParameter.ExhaustAirFlow` | m3/s | - | Deferred | C2 | SAM-OS-HVAC-001 info | +| `InternalConditionParameter.VentilationProfileName` | - | OS:DesignSpecification:OutdoorAir Outdoor Air Schedule | Native | C2 | SAM-OS-SCH-001 error when named but unresolved | +| `InternalConditionParameter.LightingRadiantProportion` | 0-1 | OS:Lights:Definition Fraction Radiant | Native | MVP | Documented default 0.32 when absent. | +| `InternalConditionParameter.OccupancyRadiantProportion` | 0-1 | OS:People:Definition Fraction Radiant | Native | MVP | Documented default 0.3 when absent. | +| `InternalConditionParameter.EquipmentRadiantProportion` | 0-1 | OS:ElectricEquipment:Definition Fraction Radiant | Native | MVP | Documented default 0 when absent. | +| `InternalConditionParameter.LightingViewCoefficient` | 0-1 | OS:Lights:Definition Fraction Visible | Approximated | MVP | TAS view coefficient mapped to EnergyPlus visible fraction; documented default 0.25 when absent. | +| `InternalConditionParameter.OccupancyViewCoefficient` | 0-1 | - | Unsupported | C2 | SAM-OS-IC-001 info; OS:People has no visible-fraction field | +| `InternalConditionParameter.EquipmentViewCoefficient` | 0-1 | - | Unsupported | C2 | SAM-OS-IC-001 info; OS:ElectricEquipment has no visible-fraction field | +| `InternalConditionParameter.LightingControlFunction` | - | - | Unsupported | C2 | SAM-OS-IC-001 info; TAS control function string has no deterministic daylighting-control mapping | +| `InternalConditionParameter.VentilationFunction` | - | - | Unsupported | C2 | SAM-OS-IC-001 info; TAS function expression | +| `InternalConditionParameter.VentilationFunctionFactor` | - | - | Unsupported | C2 | SAM-OS-IC-001 info | +| `InternalConditionParameter.VentilationFunctionSetback` | - | - | Unsupported | C2 | SAM-OS-IC-001 info | +| `InternalConditionParameter.VentilationFunctionDescription` | - | - | NA | C0 | Documentation string. | +| `InternalConditionParameter.NCMData` | - | - | NA | C0 | UK NCM compliance metadata; no thermal semantics. | +| `InternalConditionParameter.Description` | - | - | NA | C0 | Metadata. | + +### Space parameters (`SAM.Analytical.SpaceParameter`) + +| SAM property | Unit | OpenStudio / EnergyPlus representation | Status | Milestone | Conversion / policy | +|---|---|---|---|---|---| +| `SpaceParameter.Color` | - | - | NA | C0 | Display colour; SpaceType rendering colour covers presentation. | +| `SpaceParameter.DesignHeatingLoad` | W | - | NA | C0 | Result slot written back by C5 result mapping, not a translation input. | +| `SpaceParameter.DesignCoolingLoad` | W | - | NA | C0 | Result slot written back by C5 result mapping. | +| `SpaceParameter.Volume` | m3 | load derivations (ACH -> flow); OpenStudio computes zone volume from geometry | Derived | MVP | - | +| `SpaceParameter.Area` | m2 | density denominators for W and W/p bases | Derived | MVP | - | +| `SpaceParameter.Occupancy` | p | OS:People:Definition People per Space Floor Area | Derived | MVP | peoplePerArea = CalculatedOccupancy/Area (space override wins over AreaPerPerson) | +| `SpaceParameter.FacingExternal` | - | - | NA | C0 | Derived classification; OpenStudio derives exposure from geometry and boundary conditions. | +| `SpaceParameter.FacingExternalGlazing` | - | - | NA | C0 | Derived classification. | +| `SpaceParameter.LevelName` | - | OS:BuildingStory assignment/naming fallback | Derived | C1 | Used by the story fallback when no floor-group panels exist. | +| `SpaceParameter.CoolingSizingFactor` | - | OS:Sizing:Zone Cooling Sizing Factor | Native | C4 | Effective only when sizing runs are enabled. | +| `SpaceParameter.HeatingSizingFactor` | - | OS:Sizing:Zone Heating Sizing Factor | Native | C4 | - | +| `SpaceParameter.VentilationRiserName` | - | - | Deferred | C0 | Distribution identity; detailed HVAC. | +| `SpaceParameter.HeatingRiserName` | - | - | Deferred | C0 | - | +| `SpaceParameter.CoolingRiserName` | - | - | Deferred | C0 | - | +| `SpaceParameter.OutsideSupplyAirFlow` | m3/s | OS:DesignSpecification:OutdoorAir Outdoor Air Flow Rate (per-space) | Native | MVP | Space-level override; takes precedence over InternalCondition supply values (C2). | +| `SpaceParameter.SupplyAirFlow` | m3/s | - | Deferred | C0 | Total supply air is system equipment; Ideal Loads sizes its own supply. | +| `SpaceParameter.ExhaustAirFlow` | m3/s | - | Deferred | C0 | - | +| `SpaceParameter.DaylightFactor` | - | - | NA | C0 | Result-style metric; no translation input. | +| `SpaceParameter.PartFSpaceData` | - | - | NA | C0 | UK Part F compliance metadata. | + +### Profile types (`SAM.Analytical.ProfileType`) + +| SAM property | Unit | OpenStudio / EnergyPlus representation | Status | Milestone | Conversion / policy | +|---|---|---|---|---|---| +| `ProfileType.Undefined` | - | - | NA | C0 | Never bound to a load slot; unresolved profile references raise SAM-OS-SCH-001. | +| `ProfileType.Occupancy` | fraction | ScheduleFixedInterval (Fractional limits) | Native | MVP | - | +| `ProfileType.EquipmentSensible` | fraction | ScheduleFixedInterval (Fractional limits) | Native | MVP | - | +| `ProfileType.EquipmentLatent` | fraction | ScheduleFixedInterval (Fractional limits) on latent equipment instance | Native | C2 | - | +| `ProfileType.Lighting` | fraction | ScheduleFixedInterval (Fractional limits) | Native | MVP | - | +| `ProfileType.Infiltration` | fraction | ScheduleFixedInterval (Fractional limits) | Native | MVP | - | +| `ProfileType.Pollutant` | - | - | Unsupported | C2 | SAM-OS-IC-001 warning when referenced | +| `ProfileType.Heating` | C | ScheduleFixedInterval (Temperature limits) | Native | MVP | - | +| `ProfileType.Cooling` | C | ScheduleFixedInterval (Temperature limits) | Native | MVP | - | +| `ProfileType.Humidification` | %RH | ScheduleFixedInterval (Percent limits) on ZoneControl:Humidistat | Native | C2 | - | +| `ProfileType.Dehumidification` | %RH | ScheduleFixedInterval (Percent limits) on ZoneControl:Humidistat | Native | C2 | - | +| `ProfileType.Ventilation` | fraction | ScheduleFixedInterval (Fractional limits) on DesignSpecification:OutdoorAir | Native | C2 | - | +| `ProfileType.Other` | - | - | NA | C0 | No load slot binds ProfileType.Other. | + +### Profile semantics (`SAM.Analytical.Profile`) + +| SAM property | Unit | OpenStudio / EnergyPlus representation | Status | Milestone | Conversion / policy | +|---|---|---|---|---|---| +| `Profile.HourlyAnnualValues` | - | ScheduleFixedInterval, 8760 hourly values | Native | MVP | - | +| `Profile.WeeklyDayComposition` | - | ScheduleFixedInterval via 7 day-vectors rotated by run-calendar first day of week | Native | MVP | - | +| `Profile.ValuesBeyond8760` | - | first 8760 values used on non-leap run calendars | Approximated | MVP | SAM-OS-SCH-001 warning (documented truncation policy) | +| `Profile.LeapYear8784` | - | ScheduleFixedInterval, 8784 values when the run calendar is a leap year | Derived | C4 | explicit >=8784 stores pass through; day-composed/cyclic profiles tile to 8784 | +| `Profile.SubhourlyValues` | - | - | NA | C0 | SAM Profile stores are hour-indexed (SortedList); no subhourly source data exists. | +| `Profile.FractionOutOfRange` | - | kept as-authored | Native | MVP | SAM-OS-SCH-001 warning; values never clamped | +| `Profile.MissingOrNaNValues` | - | - | Native | MVP | SAM-OS-SCH-001 error; schedule not created, never substituted | + +### Aperture parameters (`SAM.Analytical.ApertureParameter`) + +| SAM property | Unit | OpenStudio / EnergyPlus representation | Status | Milestone | Conversion / policy | +|---|---|---|---|---|---| +| `ApertureParameter.ThermalTransmittance` | W/m2K | OS:WindowMaterial:SimpleGlazingSystem U-Factor (fallback when no pane layers) | Approximated | C3 | SAM-OS-CON-001 info when fallback used | +| `ApertureParameter.LightTransmittance` | 0-1 | OS:WindowMaterial:SimpleGlazingSystem Visible Transmittance (fallback) | Approximated | C3 | - | +| `ApertureParameter.LightReflectance` | 0-1 | - | NA | C0 | Pane layers govern optics; SimpleGlazing fallback has no reflectance field. | +| `ApertureParameter.DirectSolarEnergyTransmittance` | 0-1 | - | NA | C0 | Layers govern; SimpleGlazing uses SHGC only. | +| `ApertureParameter.DirectSolarEnergyReflectance` | 0-1 | - | NA | C0 | - | +| `ApertureParameter.DirectSolarEnergyAbsorptance` | 0-1 | - | NA | C0 | - | +| `ApertureParameter.TotalSolarEnergyTransmittance` | 0-1 | OS:WindowMaterial:SimpleGlazingSystem SHGC (fallback when no pane layers) | Approximated | C3 | - | +| `ApertureParameter.PilkingtonShadingShortWavelengthCoefficient` | - | - | NA | C0 | Manufacturer shading coefficient; no EnergyPlus slot. | +| `ApertureParameter.PilkingtonShadingLongWavelengthCoefficient` | - | - | NA | C0 | - | +| `ApertureParameter.OpeningProperties` | - | - | Unsupported | C3 | SAM-OS-CON-002 info; openable fraction/discharge coefficient need AirflowNetwork or ZoneVentilation (deferred HVAC domain) | +| `ApertureParameter.Color` | - | - | NA | C0 | Display colour. | +| `ApertureParameter.FeatureShade` | - | - | Unsupported | C3 | SAM-OS-CON-002 info; no slat/shade geometry in SAM to build WindowMaterial:Blind or WindowShadingControl | + +### Aperture construction parameters (`SAM.Analytical.ApertureConstructionParameter`) + +| SAM property | Unit | OpenStudio / EnergyPlus representation | Status | Milestone | Conversion / policy | +|---|---|---|---|---|---| +| `ApertureConstructionParameter.DefaultPanelType` | - | informs host typing | Derived | MVP | - | +| `ApertureConstructionParameter.Description` | - | - | NA | C0 | - | +| `ApertureConstructionParameter.Transparent` | - | SubSurface type classification (Window/Door/GlassDoor) | Derived | MVP | - | +| `ApertureConstructionParameter.Color` | - | - | NA | C0 | - | +| `ApertureConstructionParameter.DefaultFrameWidth` | m | OS:WindowProperty:FrameAndDivider Frame Width | Native | C3 | - | +| `ApertureConstructionParameter.IsInternalShadow` | - | - | Unsupported | C3 | SAM-OS-CON-002 info; TAS internal-shadow flag has no deterministic mapping | +| `ApertureConstructionParameter.LightTransmittance` | 0-1 | OS:WindowMaterial:SimpleGlazingSystem Visible Transmittance (fallback) | Approximated | C3 | - | +| `ApertureConstructionParameter.TotalSolarEnergyTransmittance` | 0-1 | OS:WindowMaterial:SimpleGlazingSystem SHGC (fallback) | Approximated | C3 | - | +| `ApertureConstructionParameter.ThermalTransmittance` | W/m2K | OS:WindowMaterial:SimpleGlazingSystem U-Factor (fallback) | Approximated | C3 | - | +| `ApertureConstructionParameter.PaneAdditionalHeatTransfer` | % | - | Unsupported | C3 | SAM-OS-CON-002 info; TAS percentage U-adjustment has no safe layer-level equivalent | +| `ApertureConstructionParameter.FrameAdditionalHeatTransfer` | % | - | Unsupported | C3 | SAM-OS-CON-002 info | + +### Aperture construction structure + +| SAM property | Unit | OpenStudio / EnergyPlus representation | Status | Milestone | Conversion / policy | +|---|---|---|---|---|---| +| `ApertureConstruction.PaneConstructionLayers` | - | OS:Construction of glazing/gas layers (FenestrationConstruction usage) | Native | MVP | - | +| `ApertureConstruction.FrameConstructionLayers` | - | OS:WindowProperty:FrameAndDivider (width, conductance, absorptances derived from layers) | Approximated | C3 | frame U = 1/sum(thickness_i/conductivity_i); width = DefaultFrameWidth else outermost frame layer thickness; solar/visible absorptance = 1 - External*Reflectance of frame material SAM-OS-CON-002 warning on invalid frame data; frameless fallback | + +### Aperture structure + +| SAM property | Unit | OpenStudio / EnergyPlus representation | Status | Milestone | Conversion / policy | +|---|---|---|---|---|---| +| `Aperture.PaneFrameGeometry` | - | SubSurface polygon reduced to pane; frame width grows outward (EnergyPlus convention) | Approximated | C3 | area conservation validated: \|aperture\| ~= \|pane\| + \|frame\|; pane stays inside host; invalid inset -> frameless fallback + SAM-OS-CON-002 warning | +| `Aperture.InternalPairing` | - | SubSurface setAdjacentSubSurface | Native | MVP | - | + +### Aperture types (`SAM.Analytical.ApertureType`) + +| SAM property | Unit | OpenStudio / EnergyPlus representation | Status | Milestone | Conversion / policy | +|---|---|---|---|---|---| +| `ApertureType.Undefined` | - | SubSurface type via construction/material family | Derived | MVP | - | +| `ApertureType.Window` | - | SubSurface FixedWindow | Native | MVP | - | +| `ApertureType.Door` | - | SubSurface Door (opaque) / GlassDoor (transparent) | Native | MVP | - | + +### Construction parameters (`SAM.Analytical.ConstructionParameter`) + +| SAM property | Unit | OpenStudio / EnergyPlus representation | Status | Milestone | Conversion / policy | +|---|---|---|---|---|---| +| `ConstructionParameter.DefaultPanelType` | - | informs panel typing | Derived | MVP | - | +| `ConstructionParameter.Description` | - | - | NA | C0 | - | +| `ConstructionParameter.Color` | - | - | NA | C0 | - | +| `ConstructionParameter.IsAir` | - | OS:Construction:AirBoundary | Native | C1 | PanelType.Air handled in MVP; C1 verifies the construction-level IsAir flag reaches the same path. | +| `ConstructionParameter.IsGround` | - | Ground outside boundary condition | Derived | MVP | Ground contact primarily driven by PanelType (SlabOnGrade/Underground*). | +| `ConstructionParameter.IsInternalShadow` | - | - | Unsupported | C3 | SAM-OS-CON-002 info | +| `ConstructionParameter.Transparent` | - | ReplaceTransparentPanels preprocessing (panel -> aperture) | Derived | MVP | - | +| `ConstructionParameter.DefaultThickness` | m | layer thickness fallback | Native | MVP | SAM-OS-CON-001 warning when fallback used | +| `ConstructionParameter.LightTransmittance` | 0-1 | - | NA | C0 | Performance descriptor; layers govern. Constructions without layers raise SAM-OS-CON-001 error. | +| `ConstructionParameter.TotalSolarEnergyTransmittance` | 0-1 | - | NA | C0 | - | +| `ConstructionParameter.ThermalTransmittance` | W/m2K | - | NA | C0 | No opaque no-mass fallback is fabricated; missing layers are an explicit error. | + +### Construction structure + +| SAM property | Unit | OpenStudio / EnergyPlus representation | Status | Milestone | Conversion / policy | +|---|---|---|---|---|---| +| `Construction.LayerOrderInsideToOutside` | - | OS:Construction layers outside-first; forward/reverse variants per internal pair side | Native | MVP | Mirrored internal-pair orientation is valid and must not be changed. | + +### Panel parameters (`SAM.Analytical.PanelParameter`) + +| SAM property | Unit | OpenStudio / EnergyPlus representation | Status | Milestone | Conversion / policy | +|---|---|---|---|---|---| +| `PanelParameter.Transparent` | - | ReplaceTransparentPanels preprocessing | Derived | MVP | - | +| `PanelParameter.Color` | - | - | NA | C0 | - | +| `PanelParameter.ThermalTransmittance` | W/m2K | - | NA | C0 | Performance descriptor; construction layers govern. | +| `PanelParameter.LightTransmittance` | 0-1 | - | NA | C0 | - | +| `PanelParameter.LightReflectance` | 0-1 | - | NA | C0 | - | +| `PanelParameter.DirectSolarEnergyTransmittance` | 0-1 | - | NA | C0 | - | +| `PanelParameter.DirectSolarEnergyReflectance` | 0-1 | - | NA | C0 | - | +| `PanelParameter.DirectSolarEnergyAbsorptance` | 0-1 | - | NA | C0 | - | +| `PanelParameter.TotalSolarEnergyTransmittance` | 0-1 | - | NA | C0 | - | +| `PanelParameter.PilkingtonShadingShortWavelengthCoefficient` | - | - | NA | C0 | - | +| `PanelParameter.PilkingtonShadingLongWavelengthCoefficient` | - | - | NA | C0 | - | +| `PanelParameter.Adiabatic` | - | Adiabatic outside boundary condition | Native | C1 | C1 verifies the flag is honoured by OutsideBoundaryCondition. | +| `PanelParameter.FeatureShade` | - | - | Unsupported | C3 | SAM-OS-CON-002 info | + +### Panel structure + +| SAM property | Unit | OpenStudio / EnergyPlus representation | Status | Milestone | Conversion / policy | +|---|---|---|---|---|---| +| `Panel.InternalEdgeHoles` | - | - | Unsupported | C3 | SAM-OS-GEO-001 warning with panel GUID and hole geometry summary (count, per-hole and total area); holes are never fabricated into windows | + +### Panel types (`SAM.Analytical.PanelType`) + +| SAM property | Unit | OpenStudio / EnergyPlus representation | Status | Milestone | Conversion / policy | +|---|---|---|---|---|---| +| `PanelType.Undefined` | - | surface type from normal orientation | Derived | MVP | - | +| `PanelType.Ceiling` | - | Surface RoofCeiling, internal adjacency | Native | MVP | - | +| `PanelType.CurtainWall` | - | Wall + transparent replacement preprocessing | Native | MVP | - | +| `PanelType.Floor` | - | Surface Floor | Native | MVP | - | +| `PanelType.FloorExposed` | - | Floor, Outdoors exposure | Native | MVP | - | +| `PanelType.FloorInternal` | - | Floor, internal adjacency | Native | MVP | - | +| `PanelType.FloorRaised` | - | Floor, Outdoors exposure | Native | MVP | - | +| `PanelType.Roof` | - | Surface RoofCeiling, Outdoors + sun/wind | Native | MVP | - | +| `PanelType.Shade` | - | OS:ShadingSurface in building-level group | Native | MVP | - | +| `PanelType.SlabOnGrade` | - | Floor, Ground boundary | Native | MVP | - | +| `PanelType.SolarPanel` | - | OS:ShadingSurface (geometry only) | Approximated | C3 | SAM-OS-GEO-002 info; PV generation is not modelled | +| `PanelType.UndergroundCeiling` | - | RoofCeiling, Ground boundary | Native | MVP | - | +| `PanelType.UndergroundSlab` | - | Floor, Ground boundary | Native | MVP | - | +| `PanelType.UndergroundWall` | - | Wall, Ground boundary | Native | MVP | - | +| `PanelType.Wall` | - | Surface Wall | Native | MVP | - | +| `PanelType.WallExternal` | - | Wall, Outdoors + sun/wind | Native | MVP | - | +| `PanelType.WallInternal` | - | Wall, internal adjacency | Native | MVP | - | +| `PanelType.Air` | - | OS:Construction:AirBoundary | Native | MVP | - | + +### Boundary types (`SAM.Analytical.BoundaryType`) + +| SAM property | Unit | OpenStudio / EnergyPlus representation | Status | Milestone | Conversion / policy | +|---|---|---|---|---|---| +| `BoundaryType.Undefined` | - | - | NA | C0 | Resolved through PanelType mapping. | +| `BoundaryType.Ground` | - | Ground outside boundary condition | Native | MVP | - | +| `BoundaryType.Exposed` | - | Outdoors + SunExposed/WindExposed | Native | MVP | - | +| `BoundaryType.Adiabatic` | - | Adiabatic outside boundary condition | Native | MVP | - | +| `BoundaryType.Linked` | - | Surface adjacency (setAdjacentSurface) | Native | MVP | - | +| `BoundaryType.Shade` | - | OS:ShadingSurface | Native | MVP | - | + +### Core material properties (`SAM.Core.Material`) + +| SAM property | Unit | OpenStudio / EnergyPlus representation | Status | Milestone | Conversion / policy | +|---|---|---|---|---|---| +| `Material.ThermalConductivity` | W/mK | OS:Material Conductivity / StandardGlazing Conductivity | Native | MVP | SAM-OS-MAT-001 error on non-positive values | +| `Material.Density` | kg/m3 | OS:Material Density | Native | MVP | - | +| `Material.SpecificHeatCapacity` | J/kgK | OS:Material Specific Heat | Native | MVP | - | + +### Core material parameters (`SAM.Core.MaterialParameter`) + +| SAM property | Unit | OpenStudio / EnergyPlus representation | Status | Milestone | Conversion / policy | +|---|---|---|---|---|---| +| `CoreMaterialParameter.DefaultThickness` | m | layer thickness fallback | Native | MVP | SAM-OS-CON-001 warning when used | + +### Analytical material parameters (`SAM.Analytical.MaterialParameter`) + +| SAM property | Unit | OpenStudio / EnergyPlus representation | Status | Milestone | Conversion / policy | +|---|---|---|---|---|---| +| `AnalyticalMaterialParameter.VapourDiffusionFactor` | - | - | Unsupported | C3 | SAM-OS-MAT-002 info; EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry | + +### Opaque material parameters (`SAM.Analytical.OpaqueMaterialParameter`) + +| SAM property | Unit | OpenStudio / EnergyPlus representation | Status | Milestone | Conversion / policy | +|---|---|---|---|---|---| +| `OpaqueMaterialParameter.ExternalEmissivity` | 0-1 | OS:Material Thermal Absorptance | Native | MVP | - | +| `OpaqueMaterialParameter.ExternalLightReflectance` | 0-1 | OS:Material Visible Absorptance = 1 - reflectance | Native | MVP | - | +| `OpaqueMaterialParameter.ExternalSolarReflectance` | 0-1 | OS:Material Solar Absorptance = 1 - reflectance | Native | MVP | - | +| `OpaqueMaterialParameter.IgnoreThermalTransmittanceCalculations` | - | - | NA | C0 | TAS calculation flag. | +| `OpaqueMaterialParameter.InternalEmissivity` | 0-1 | same single-sided OS:Material fields as External* | Approximated | C3 | SAM-OS-MAT-002 info when Internal differs from External; EnergyPlus opaque materials are single-sided | +| `OpaqueMaterialParameter.InternalLightReflectance` | 0-1 | single-sided OS:Material | Approximated | C3 | - | +| `OpaqueMaterialParameter.InternalSolarReflectance` | 0-1 | single-sided OS:Material | Approximated | C3 | - | + +### Transparent material parameters (`SAM.Analytical.TransparentMaterialParameter`) + +| SAM property | Unit | OpenStudio / EnergyPlus representation | Status | Milestone | Conversion / policy | +|---|---|---|---|---|---| +| `TransparentMaterialParameter.ExternalEmissivity` | 0-1 | StandardGlazing Front Side IR Hemispherical Emissivity | Native | MVP | - | +| `TransparentMaterialParameter.ExternalLightReflectance` | 0-1 | StandardGlazing Front Side Visible Reflectance | Native | MVP | - | +| `TransparentMaterialParameter.ExternalSolarReflectance` | 0-1 | StandardGlazing Front Side Solar Reflectance | Native | MVP | - | +| `TransparentMaterialParameter.InternalEmissivity` | 0-1 | StandardGlazing Back Side IR Hemispherical Emissivity | Native | MVP | - | +| `TransparentMaterialParameter.InternalLightReflectance` | 0-1 | StandardGlazing Back Side Visible Reflectance | Native | MVP | - | +| `TransparentMaterialParameter.InternalSolarReflectance` | 0-1 | StandardGlazing Back Side Solar Reflectance | Native | MVP | - | +| `TransparentMaterialParameter.IsBlind` | - | - | Unsupported | C3 | SAM-OS-MAT-002 info; no slat geometry to build WindowMaterial:Blind | +| `TransparentMaterialParameter.LightTransmittance` | 0-1 | StandardGlazing Visible Transmittance at Normal Incidence | Native | MVP | - | +| `TransparentMaterialParameter.SolarTransmittance` | 0-1 | StandardGlazing Solar Transmittance at Normal Incidence | Native | MVP | - | + +### Gas material parameters (`SAM.Analytical.GasMaterialParameter`) + +| SAM property | Unit | OpenStudio / EnergyPlus representation | Status | Milestone | Conversion / policy | +|---|---|---|---|---|---| +| `GasMaterialParameter.HeatTransferCoefficient` | W/m2K | OS:Material:AirGap Thermal Resistance = 1/h (opaque usage) | Native | MVP | SAM-OS-MAT-001 error on missing/non-finite/out-of-range values | +| `GasMaterialParameter.DefaultGasType` | - | OS:WindowMaterial:Gas Gas Type (fenestration usage; Air/Argon/Krypton/Xenon) | Native | MVP | SAM-OS-MAT-001 error for unsupported gas types (SulfurHexaFluoride) | + +### Analytical model parameters (`SAM.Analytical.AnalyticalModelParameter`) + +| SAM property | Unit | OpenStudio / EnergyPlus representation | Status | Milestone | Conversion / policy | +|---|---|---|---|---|---| +| `AnalyticalModelParameter.NorthAngle` | rad | OS:Building North Axis [deg] | Native | C4 | convention resolved against SAM_Tas/SAM_LadybugTools usage before mapping | +| `AnalyticalModelParameter.CoolingSizingFactor` | - | OS:Sizing:Parameters Cooling Sizing Factor | Native | C4 | - | +| `AnalyticalModelParameter.HeatingSizingFactor` | - | OS:Sizing:Parameters Heating Sizing Factor | Native | C4 | - | +| `AnalyticalModelParameter.WeatherData` | - | ground temperatures + location cross-check (EPW remains the run weather) | Derived | C4 | Never silently overridden by EPW values; precedence documented. | +| `AnalyticalModelParameter.HeatingDesignDays` | - | OS:SizingPeriod:DesignDay (parametric fit from hourly SAM DesignDay) | Approximated | C4 | SAM-OS-RUN-002 warning documenting the fit; downgraded to unsupported diagnostic if the fit is unsafe | +| `AnalyticalModelParameter.CoolingDesignDays` | - | OS:SizingPeriod:DesignDay (parametric fit) | Approximated | C4 | - | +| `AnalyticalModelParameter.CaseDataCollection` | - | - | NA | C0 | Scenario/case metadata. | +| `AnalyticalModelParameter.SolarModel` | - | - | NA | C0 | TAS solar model object; EnergyPlus solar behaviour is governed by the SolarDistribution conversion option. | + +### Zone parameters (`SAM.Analytical.ZoneParameter`) + +| SAM property | Unit | OpenStudio / EnergyPlus representation | Status | Milestone | Conversion / policy | +|---|---|---|---|---|---| +| `ZoneParameter.Color` | - | - | NA | C0 | - | +| `ZoneParameter.ZoneCategory` | - | - | Deferred | C0 | SAM zone grouping is an HVAC-zoning concept; Ideal Loads keeps one thermal zone per space. C5 aggregates results per SAM zone. | + +### Location (`SAM.Core.Location`) + +| SAM property | Unit | OpenStudio / EnergyPlus representation | Status | Milestone | Conversion / policy | +|---|---|---|---|---|---| +| `Location.Latitude` | deg | OS:Site Latitude | Native | C4 | MVP takes EPW; C4 adds explicit-SAM-vs-EPW precedence with warning on mismatch. | +| `Location.Longitude` | deg | OS:Site Longitude | Native | C4 | - | +| `Location.Elevation` | m | OS:Site Elevation | Native | C4 | - | + +### Location parameters (`SAM.Core.LocationParameter`) + +| SAM property | Unit | OpenStudio / EnergyPlus representation | Status | Milestone | Conversion / policy | +|---|---|---|---|---|---| +| `LocationParameter.TimeZone` | h | OS:Site Time Zone | Native | C4 | - | + +### Address (`SAM.Core.Address`) + +| SAM property | Unit | OpenStudio / EnergyPlus representation | Status | Milestone | Conversion / policy | +|---|---|---|---|---|---| +| `Address` | - | - | NA | C0 | Postal metadata. | + +### Weather data parameters (`SAM.Weather.WeatherDataParameter`) + +| SAM property | Unit | OpenStudio / EnergyPlus representation | Status | Milestone | Conversion / policy | +|---|---|---|---|---|---| +| `WeatherDataParameter.GroundTemperatures` | C | OS:Site:GroundTemperature:BuildingSurface (12 monthly values) | Native | C4 | SAM-OS-RUN-002 warning naming the fallback source (SAM -> EPW header -> EnergyPlus 18 C default) | +| `WeatherDataParameter.Country` | - | - | NA | C0 | Metadata. | +| `WeatherDataParameter.State` | - | - | NA | C0 | - | +| `WeatherDataParameter.City` | - | - | NA | C0 | - | +| `WeatherDataParameter.DataSource` | - | - | NA | C0 | - | +| `WeatherDataParameter.WMONumber` | - | - | NA | C0 | - | +| `WeatherDataParameter.TimeZone` | h | OS:Site Time Zone (with Location precedence) | Native | C4 | - | +| `WeatherDataParameter.Comments_1` | - | - | NA | C0 | - | +| `WeatherDataParameter.Comments_2` | - | - | NA | C0 | - | + +### Simulation and run settings + +| SAM property | Unit | OpenStudio / EnergyPlus representation | Status | Milestone | Conversion / policy | +|---|---|---|---|---|---| +| `Simulation.EpwAssignment` | - | OS:WeatherFile via EpwFile.load | Native | MVP | - | +| `Simulation.RunPeriodExplicit` | - | OS:RunPeriod begin/end month+day | Native | C4 | - | +| `Simulation.RunPeriodRepeatCount` | - | OS:RunPeriod Number of Times Runperiod to be Repeated | Native | C4 | - | +| `Simulation.FirstDayOfWeek` | - | profile rotation + OS:YearDescription Day of Week for Start Day | Native | C4 | MVP aligns profiles; C4 also stamps YearDescription. | +| `Simulation.LeapYearCalendar` | - | OS:YearDescription Is Leap Year / Calendar Year + 8784-value schedules | Native | C4 | - | +| `Simulation.DaylightSaving` | - | OS:RunPeriodControl:DaylightSavingTime from EPW header | Approximated | C4 | Option-driven, default OFF (energy-model convention); SAM carries no DST data. | +| `Simulation.Timestep` | 1/h | OS:Timestep | Native | C4 | MVP fixed at 6/h; C4 makes it an option. | +| `Simulation.SolarDistribution` | - | OS:SimulationControl Solar Distribution | Native | C4 | - | +| `Simulation.ShadowCalculation` | - | OS:ShadowCalculation | Native | C4 | - | +| `Simulation.OutputVariableRequests` | - | OS:Output:Variable set + reporting frequency | Native | C4 | MVP fixed six hourly variables; C4 makes set and frequency options. | +| `Simulation.DdyDesignDayImport` | - | OS:SizingPeriod:DesignDay via EnergyPlusReverseTranslator | Native | C4 | Deterministic; default heating 99.6% / cooling 0.4% selection, option for all design days. | +| `Simulation.SizingRuns` | - | OS:SimulationControl sizing flags | Native | C4 | Off by default (Ideal Loads); option-enabled. Annual sums are environment-period filtered before enablement. | + +### Results (SQL extraction and SAM result mapping) + +| SAM property | Unit | OpenStudio / EnergyPlus representation | Status | Milestone | Conversion / policy | +|---|---|---|---|---|---| +| `Result.AnalyticalModel.ConsumptionHeating` | kWh | SUM(Zone Ideal Loads Supply Air Total Heating Energy) over the annual weather RunPeriod | Native | C5 | - | +| `Result.AnalyticalModel.ConsumptionCooling` | kWh | SUM(Zone Ideal Loads Supply Air Total Cooling Energy) over the annual weather RunPeriod | Native | C5 | - | +| `Result.AnalyticalModel.PeakHeatingLoad` | kW | max hourly heating energy / 3600 s | Native | C5 | - | +| `Result.AnalyticalModel.PeakHeatingHour` | h | hour index of peak | Native | C5 | - | +| `Result.AnalyticalModel.PeakCoolingLoad` | kW | max hourly cooling energy / 3600 s | Native | C5 | - | +| `Result.AnalyticalModel.PeakCoolingHour` | h | hour index of peak | Native | C5 | - | +| `Result.AnalyticalModel.FloorArea` | m2 | sum of space areas | Derived | C5 | - | +| `Result.AnalyticalModel.Volume` | m3 | sum of space volumes | Derived | C5 | - | +| `Result.Space.Load` | W | Zone Ideal Loads Supply Air Total Heating/Cooling Energy series | Native | C5 | - | +| `Result.Space.DesignLoad` | W | ZoneSizes CalcDesLoad (sizing runs) | Native | C5 | - | +| `Result.Space.LoadIndex` | h | peak time index | Native | C5 | - | +| `Result.Space.DryBulbTempearture` | C | Zone Mean Air Temperature (at peak / series) | Native | C5 | SAM enum member name carries a historical typo. | +| `Result.Space.ResultantTemperature` | C | Zone Operative Temperature | Approximated | C5 | Operative temperature is the closest EnergyPlus analogue of TAS resultant temperature. | +| `Result.Space.RelativeHumidity` | % | Zone Air Relative Humidity | Native | C5 | - | +| `Result.Space.HumidityRatio` | kg/kg | Zone Air Humidity Ratio | Native | C5 | - | +| `Result.Space.UnmetHours` | h | Zone Heating/Cooling Setpoint Not Met Time | Native | C5 | - | +| `Result.Space.OccupiedUnmetHours` | h | Zone Setpoint Not Met While Occupied Time | Native | C5 | - | +| `Result.Space.SolarGain` | W | Zone Windows Total Transmitted Solar Radiation Rate | Native | C5 | - | +| `Result.Space.LightingGain` | W | Zone Lights Total Heating Rate | Native | C5 | - | +| `Result.Space.EquipmentSensibleGain` | W | Zone Electric Equipment Radiant+Convective Heating Rate | Native | C5 | - | +| `Result.Space.EquipmentLatentGain` | W | Zone Electric Equipment Latent Gain Rate | Native | C5 | - | +| `Result.Space.OccupancySensibleGain` | W | Zone People Sensible Heating Rate | Native | C5 | - | +| `Result.Space.OccupancyLatentGain` | W | Zone People Latent Gain Rate | Native | C5 | - | +| `Result.Space.InfiltrationGain` | W | Zone Infiltration Sensible Heat Gain/Loss Energy | Native | C5 | - | +| `Result.Space.GlazingExternalConduction` | W | Zone Windows Total Heat Gain/Loss Rate | Approximated | C5 | - | +| `Result.Space.OpaqueExternalConduction` | W | Surface Average Face Conduction Heat Transfer Rate (external opaque aggregate) | Approximated | C5 | - | +| `Result.Space.OccupiedHours` | h | occupancy schedule x zone temperature series | Derived | C5 | - | +| `Result.Space.MaxMinDryBulbTemperature` | C | series max/min + indices | Derived | C5 | - | +| `Result.Space.AirMovementGain` | W | - | NA | C0 | Inter-zone air movement needs AirflowNetwork; not populated. | +| `Result.Space.BuildingHeatTransfer` | W | - | NA | C0 | TAS aggregate without a direct EnergyPlus variable. | +| `Result.Space.ApertureFlow` | kg/s | - | NA | C0 | Aperture airflow needs AirflowNetwork. | +| `Result.Space.Pollutant` | ppm | - | NA | C0 | Contaminant modelling out of scope. | +| `Result.Surface.Temperatures` | C | Surface Inside/Outside Face Temperature | Native | C5 | - | +| `Result.Surface.Conduction` | W | Surface Inside/Outside Face Conduction Heat Transfer Rate | Native | C5 | - | +| `Result.Surface.Convection` | W | Surface Inside/Outside Face Convection Heat Gain Rate | Native | C5 | - | +| `Result.Surface.LongWave` | W | Surface Inside/Outside Face Net Thermal Radiation Heat Gain Rate | Native | C5 | - | +| `Result.Surface.SolarGain` | W | Surface Inside/Outside Face absorbed/incident solar | Approximated | C5 | - | +| `Result.Surface.Condensation` | g/m2 | - | NA | C0 | No EnergyPlus condensation-mass model in scope. | +| `Result.Surface.ApertureOpening` | % | - | NA | C0 | Opening modulation needs AirflowNetwork. | +| `Result.Zone.Aggregates` | - | member-space aggregation per SAM zone group | Derived | C5 | - | +| `Result.AdjacencyCluster.UnmetHours` | h | building aggregate of zone unmet hours | Native | C5 | - | +| `Result.Identity.SamGuidMapping` | - | OpenStudioObjectMap source GUID <-> OpenStudio handle/name | Native | MVP | - | +| `Result.SimulationRuntime` | s | runner wall-clock + eplusout.err warning/severe/fatal counts | Native | C5 | - | + + +## Enum completeness enforcement + +The manifest's `coveredEnums` list names every SAM parameter/type enum whose **entire live +membership** must appear in the manifest. The C7 completeness test reflects over those enums in +the referenced SAM assemblies and fails when: + +- a live enum member has no manifest entry (a *new* SAM property would otherwise be silently + omitted); +- a manifest entry references an enum member that no longer exists (stale coverage); +- an `Unsupported` entry declares no diagnostic policy. + +Concept rows (ids not backed by an enum member, e.g. `Profile.LeapYear8784`, +`Aperture.PaneFrameGeometry`, `Simulation.*`, `Result.*`) are maintained by review; they exist so +that behavioural semantics — not just parameter slots — are classified. + +## Counts at C0 (before implementation) + +Generated from the manifest: 277 entries — Native 135, Derived 28, Approximated 21, +Unsupported 20, Deferred 17, NA 56. Milestones: MVP 90, C1 3, C2 37, C3 23, C4 26, C5 36, +classification-only (C0) 62. + +Stage L review correction (P2-01): the C0 audit transcribed two commented-out members of +`SAM.Analytical.MaterialParameter` (`TypeName`, `Description`); those stale rows were removed +from the manifest and this document, and the stale-id reverse check in `CompletenessTests` +now fails on any manifest id that stops naming a live enum member. + +These counts change as milestones land; the final counts are reported in +`docs/openstudio-analytical-completeness-status.md`. + +## Semantic references + +- `SAM` core (sibling repository) is authoritative for units and semantics; enum member lists + were extracted mechanically from its source at review time. +- `SAM_LadybugTools` (HoneybeeSchema 2.6, PR #8) served as a semantic cross-reference for frames, + latent gains and humidistat handling. No Honeybee runtime dependency is introduced. +- EnergyPlus Input/Output Reference (V24.1/OpenStudio 3.10.0) for object field semantics. diff --git a/docs/SAM_OPENSTUDIO_INTERNAL_CONDITION_MAPPING.md b/docs/SAM_OPENSTUDIO_INTERNAL_CONDITION_MAPPING.md new file mode 100644 index 0000000..d76cab7 --- /dev/null +++ b/docs/SAM_OPENSTUDIO_INTERNAL_CONDITION_MAPPING.md @@ -0,0 +1,87 @@ +# SAM → OpenStudio internal-condition and schedule mapping + +**Status:** Binding for the MVP (M5), extended in C2 (latent equipment, native ACH infiltration, +SpaceType outdoor air with ventilation schedule, humidistat, single-mode thermostats). Units +verified from SAM query sources (`SAM.Analytical\Query\Calculated*.cs`, `OccupancyGain*.cs`) and +the SAM_LadybugTools `ProgramType.cs` reference — never inferred from parameter names. + +## Deduplication and assignment + +One OpenStudio `SpaceType` is created per unique `InternalCondition` identity — **sanitized name +plus a deterministic content hash** (`SAM_InternalCondition__`) — and assigned to +every space using that condition. `Space.InternalCondition`'s setter clones the condition with a +**new Guid** per space (`SAM.Analytical\Classes\Space.cs`), so Guids cannot identify shared +conditions. The content hash is computed over the condition's full parameter content (parameter +sets, profile-name references) with every nested `Guid` excluded, **extended in C1 with the +per-space computed load densities** (people/area, lighting and equipment W/m², occupancy and +activity level, infiltration flow, area): identical clones evaluated for equivalent spaces +therefore share one SpaceType, while same-named conditions with different gains, fractions or +profile references — or a shared condition evaluated for spaces with different densities — +never merge silently (name-only deduplication was found and fixed in review P1-03; the +first-space-density imposition in review P3-02). Every per-space condition Guid is still +registered in the traceability map against the SpaceType name. Thermostat setpoints are **not** +part of the SpaceType — they are per-thermal-zone (M6). Space-specific overrides remain possible +by assigning loads directly to spaces in later work. + +## Loads + +| Load | SAM source (unit) | OpenStudio object/field | Conversion | Missing-value policy | +| --- | --- | --- | --- | --- | +| People density | `Analytical.Query.CalculatedPeoplePerArea(space)` [people/m²] (from `InternalConditionParameter.AreaPerPerson` [m²/person] or `SpaceParameter.Occupancy` + `SpaceParameter.Area`) | `PeopleDefinition.PeopleperSpaceFloorArea` | direct | density ≤ 0 or NaN → no People objects (no diagnostic; genuinely unoccupied) | +| Occupancy schedule | `InternalConditionParameter.OccupancyProfileName` → `ProfileLibrary` | `People.NumberofPeopleSchedule` | fraction schedule | gains present but profile missing → **error** SAM-OS-SCH-001; never AlwaysOn | +| Activity level | `Analytical.Query.OccupancyGain(space)` / `CalculatedOccupancy(space)` [W/person] | `People.ActivityLevelSchedule` | constant annual schedule (ActivityLevel type limits) | NaN → 0 with warning | +| People radiant fraction | `InternalConditionParameter.OccupancyRadiantProportion` [0–1] | `PeopleDefinition.FractionRadiant` | direct | missing → 0.3 (LadybugTools parity, warning-free documented default) | +| People sensible fraction | `OccupancySensibleGainPerPerson` and `OccupancyLatentGainPerPerson` [W/person] | `PeopleDefinition.SensibleHeatFraction` | sensible/(sensible+latent) | either missing → EnergyPlus autocalculate | +| Lighting density | `Analytical.Query.CalculatedLightingGain(space)` [W] ÷ `SpaceParameter.Area` [m²] | `LightsDefinition.WattsperSpaceFloorArea` | direct [W/m²] | ≤ 0/NaN → no Lights objects | +| Lighting schedule | `LightingProfileName` | `Lights.Schedule` | fraction schedule | gains without profile → **error** SAM-OS-SCH-001 | +| Lighting radiant fraction | `LightingRadiantProportion` | `LightsDefinition.FractionRadiant` | direct | missing → 0.32 (LadybugTools parity) | +| Lighting visible fraction | `LightingViewCoefficient` | `LightsDefinition.FractionVisible` | direct | missing → 0.25 (LadybugTools parity) | +| Equipment density | `Analytical.Query.CalculatedEquipmentSensibleGain(space)` [W] ÷ area | `ElectricEquipmentDefinition.WattsperSpaceFloorArea` | direct [W/m²] | ≤ 0/NaN → no equipment objects | +| Equipment schedule | `EquipmentSensibleProfileName` | `ElectricEquipment.Schedule` | fraction schedule | gains without profile → **error** SAM-OS-SCH-001 | +| Equipment radiant fraction | `EquipmentRadiantProportion` | `ElectricEquipmentDefinition.FractionRadiant` | direct | missing → 0 (LadybugTools parity) | +| Equipment latent | `Analytical.Query.CalculatedEquipmentLatentGain(space)` [W] ÷ area; `EquipmentLatentProfileName` | dedicated `ElectricEquipment` instance, `FractionLatent = 1`, `FractionRadiant = 0` | separate instance so sensible/latent keep independent profiles (C2) | ≤ 0/NaN → no latent instance; gains without profile → **error** SAM-OS-SCH-001 | +| Infiltration (ACH, C2) | `InternalConditionParameter.InfiltrationAirChangesPerHour` [1/h] | `SpaceInfiltrationDesignFlowRate.AirChangesperHour` | direct | ACH present → native basis; ≤ 0/NaN → fallback below | +| Infiltration (fallback) | `Analytical.Query.CalculatedInfiltrationAirFlow(space)` [m³/s] ÷ Σ areas of sun-exposed panels (`AdjacencyCluster.ExposedToSun`) | `SpaceInfiltrationDesignFlowRate.FlowperExteriorSurfaceArea` [m³/s·m²] | LadybugTools formula parity | ≤ 0/NaN → no infiltration object | +| Infiltration schedule | `InfiltrationProfileName` | `SpaceInfiltrationDesignFlowRate.Schedule` | fraction schedule | flow without profile → **error** SAM-OS-SCH-001 | +| Outdoor air (C2) | `SupplyAirFlowPerPerson` [m³/s·p], `SupplyAirFlowPerArea` [m³/s·m²], `SupplyAirChangesPerHour` [1/h], `SupplyAirFlow` [m³/s] | SpaceType `DesignSpecificationOutdoorAir`, method **Sum** | direct | all ≤ 0/NaN → no SpaceType DSOA | +| Outdoor-air schedule (C2) | `VentilationProfileName` | `DesignSpecificationOutdoorAir.OutdoorAirFlowRateFractionSchedule` | fraction schedule | named but unresolved → **error** SAM-OS-SCH-001; unnamed → unscheduled (fraction 1) | +| Outdoor air (space override) | `SpaceParameter.OutsideSupplyAirFlow` [m³/s] (absolute) | per-space `DesignSpecificationOutdoorAir.OutdoorAirFlowRate` | direct; takes precedence over the SpaceType DSOA (EnergyPlus space-over-type rule) | missing/≤0 → SpaceType DSOA governs | +| Humidity control (C2) | `HumidificationProfileName` / `DehumidificationProfileName` [%RH] | `ZoneControlHumidistat` humidifying/dehumidifying schedules (Percent limits 0–100) + Ideal Loads `Humidification/DehumidificationControlType = Humidistat` when the matching schedule exists | profile → schedule; SAM carries setpoint *profiles*, not numeric setpoints | named but unresolved → **error** SAM-OS-SCH-001; absent → no humidity control (EnergyPlus defaults) | +| Pollutants | `PollutantGenerationPerPerson/PerArea`, `PollutantProfileName` | — | **unsupported** (generic contaminant modelling out of scope) | warning SAM-OS-IC-001 when present | +| Heating/Cooling setpoints | `HeatingProfileName` / `CoolingProfileName` [°C] | thermostat schedules (M6); single-mode when only one profile exists (C2 — EnergyPlus SingleHeating/SingleCooling, no invented setpoints) | temperature schedules | both missing on a conditioned zone → **error** SAM-OS-HVAC-001 | + +## Profile → ScheduleFixedInterval (MVP schedule policy) + +SAM `Profile` is an indexed value sequence (`Min`/`Max`, wrapping indexer), optionally composed of +daily sub-profiles (`GetProfiles()`, weekly semantics as in SAM_LadybugTools +`ScheduleRuleset.cs`). MVP expansion to **8760 hourly values** follows SAM's own expansion +semantics (`Profile.GetYearlyValues()` — cyclic tiling through the wrapping indexer): + +1. `Count` span == 8760 → used as-is (annual profile). +2. Span > 8760 (e.g. 8784 leap-year) → the first 8760 hours are used with a **warning** + (365-day non-leap schedule policy); the year is never averaged into one day. +3. `GetProfiles()` returns k ≥ 1 daily sub-profiles → extended to 7 by cycling (LadybugTools + parity), each expanded to 24 hourly values through the SAM indexer, tiled across 365 days + **rotated onto the run calendar**: sub-profile 0 is Monday per the LadybugTools + `ScheduleRuleset` convention, so the week is shifted by the 1-Jan day of week of the run — + derived from the EPW (`EpwFile.startDayOfWeek`, e.g. Sunday for the pinned Boston TMYx) in + the full-pipeline overload, or from `OpenStudioConversionOptions.FirstDayOfWeek` when set + explicitly; Monday-first is the fallback for weather-free conversions. +4. Any other flat profile → tiled hour-for-hour at its own period through the SAM indexer — + a 24-hour day repeats daily, a 168-hour week repeats weekly; values are never stretched, + held or block-averaged. +5. Gaps (indexes without values) are an **error** (`SAM-OS-SCH-001`) — NaN never reaches a + schedule; a missing profile is never silently replaced. + +Schedules are `ScheduleFixedInterval` (60-min interval, no timestep interpolation, +start 1 Jan). Type limits: `SAM_ScheduleTypeLimits_Fractional` (0–1, continuous, +dimensionless) for fraction profiles — values outside [0, 1] raise a warning, never +clamped; `SAM_ScheduleTypeLimits_Temperature` (continuous, temperature) for +heating/cooling; `SAM_ScheduleTypeLimits_Percent` (0–100, percent) for +humidification/dehumidification (C2) — values outside [0, 100] raise a warning, never +clamped; `SAM_ScheduleTypeLimits_ActivityLevel` for activity level. Leap years: +schedules are 365-day (EnergyPlus assumed non-leap year; TMYx weather is non-leap) — +documented MVP policy (leap-year calendar wiring arrives in C4). Schedules are cached per +(Profile Guid, ProfileType) — the same profile reused under a different type yields a +separate schedule with the correct type limits (C1); a missing profile is never +silently replaced (SAM-OS-SCH-001). diff --git a/docs/SAM_OPENSTUDIO_MATERIAL_MAPPING.md b/docs/SAM_OPENSTUDIO_MATERIAL_MAPPING.md new file mode 100644 index 0000000..2500e30 --- /dev/null +++ b/docs/SAM_OPENSTUDIO_MATERIAL_MAPPING.md @@ -0,0 +1,162 @@ +# SAM → OpenStudio material and construction mapping + +**Status:** Binding for the MVP (M4). Units verified against SAM sources and the +SAM_LadybugTools/SAM_Tas converters — never inferred from parameter names. + +## Layer-order convention (verified) + +SAM's own documentation (`SAM.Analytical\Classes\Construction.cs`, `ApertureConstruction.cs`, +`Query\Materials.cs`) states: + +> "Order of materials from inside to outside following the TAS approach." + +**SAM `ConstructionLayers[0]` is the INNERMOST layer; the last layer is OUTERMOST.** +EnergyPlus/OpenStudio constructions list layers **outside first** ("Outside Layer"). + +Therefore: + +| Variant | Cache key | Layer order | Used for | +| --- | --- | --- | --- | +| Forward | `:Forward` | reversed SAM list (outside → inside) | every external/ground/adiabatic surface; the primary side of an internal pair | +| Reverse | `:Reverse` | SAM list as stored (inside → outside) | the secondary side of an internal pair | + +The two sides of an internal panel therefore always carry exact layer reversals of each +other (EnergyPlus requirement for matched surfaces). Cross-check: SAM_Tas feeds +`ConstructionLayers` to TAS unchanged (TAS shares SAM's convention); SAM_LadybugTools +reverses for its default/external variant, consistent with honeybee's outside→inside order. + +Layer thickness comes from **`ConstructionLayer.Thickness`** (as in SAM_Tas), not from the +material's `DefaultThickness`; the material default is only a fallback (warning diagnostic) +when the layer thickness is missing or non-positive. One OpenStudio material instance is +created per **(SAM material Guid, thickness)** pair. + +## OpaqueMaterial → OS:Material (StandardOpaqueMaterial) + +| SAM source | Unit | OpenStudio field | Conversion | Missing-value policy | +| --- | --- | --- | --- | --- | +| `ConstructionLayer.Thickness` | m | Thickness | direct | fallback `MaterialParameter.DefaultThickness` (warning); error if still invalid | +| `ThermalConductivity` | W/m·K | Conductivity | direct | **error** SAM-OS-MAT-001 (≤0/NaN invalid) | +| `Density` | kg/m³ | Density | direct | **error** (≤0/NaN invalid) | +| `SpecificHeatCapacity` | J/kg·K | Specific Heat | direct | **error** (≤0/NaN invalid) | +| — | — | Roughness | fixed `MediumSmooth` | LadybugTools parity | +| `OpaqueMaterialParameter.ExternalEmissivity` | 0–1 | Thermal Absorptance | direct | warning; OpenStudio default 0.9 | +| `OpaqueMaterialParameter.ExternalSolarReflectance` | 0–1 | Solar Absorptance | `1 − x` | warning; OpenStudio default 0.7 | +| `OpaqueMaterialParameter.ExternalLightReflectance` | 0–1 | Visible Absorptance | `1 − x` | warning; OpenStudio default 0.7 | + +Validation ranges: conductivity > 0; density > 0; specific heat > 0; thickness > 0; +absorptances within [0, 1] (out-of-range → error, no clamping). + +## TransparentMaterial → OS:WindowMaterial:Glazing (StandardGlazing) + +EnergyPlus defines the glazing **Front side as "the side of the layer opposite the zone"** +(exterior-facing for exterior windows) and **Back side as the side closest to the zone** +(I/O Reference, *Materials for Glass Windows and Doors*). SAM `External*` is the +building-exterior-facing side and `Internal*` the room-facing side, therefore: + +**External → Front, Internal → Back.** + +Note: SAM_LadybugTools `EnergyWindowMaterialGlazing.cs` maps Internal → Front and External → +Back. Independent review (P1-04) found that assignment inverted relative to the EnergyPlus +definition above; this converter deliberately deviates from the LadybugTools reference here. +(Symmetric glass is unaffected either way — which is why the reference's tests never showed it.) + +| SAM source | Unit | OpenStudio field | Missing-value policy | +| --- | --- | --- | --- | +| `ConstructionLayer.Thickness` | m | Thickness | as opaque rule | +| `ThermalConductivity` | W/m·K | Conductivity | **error** if invalid | +| `TransparentMaterialParameter.SolarTransmittance` | 0–1 | Solar Transmittance at Normal Incidence | warning; OS default | +| `TransparentMaterialParameter.ExternalSolarReflectance` | 0–1 | Front Side Solar Reflectance | warning; OS default | +| `TransparentMaterialParameter.InternalSolarReflectance` | 0–1 | Back Side Solar Reflectance | warning; OS default | +| `TransparentMaterialParameter.LightTransmittance` | 0–1 | Visible Transmittance at Normal Incidence | warning; OS default | +| `TransparentMaterialParameter.ExternalLightReflectance` | 0–1 | Front Side Visible Reflectance | warning; OS default | +| `TransparentMaterialParameter.InternalLightReflectance` | 0–1 | Back Side Visible Reflectance | warning; OS default | +| — | — | Infrared Transmittance | fixed 0 (LadybugTools parity) | +| `TransparentMaterialParameter.ExternalEmissivity` | 0–1 | Front Side IR Hemispherical Emissivity | warning; OS default 0.84 | +| `TransparentMaterialParameter.InternalEmissivity` | 0–1 | Back Side IR Hemispherical Emissivity | warning; OS default 0.84 | +| — | — | Dirt Correction Factor | fixed 1 | +| — | — | Solar Diffusing | fixed No | + +## GasMaterial — usage-dependent (review P1-06) + +A SAM `GasMaterial` has **two different OpenStudio targets**, selected by an explicit +construction-usage context (`OpenStudioMaterialUsage`), never inferred from the material name: + +| Context | OpenStudio object | EnergyPlus object | +| --- | --- | --- | +| Layer of an opaque `Construction` (wall/floor/roof) | `OpenStudio.AirGap` | `OS:Material:AirGap` | +| Pane layer of an `ApertureConstruction` | `OpenStudio.Gas` | `OS:WindowMaterial:Gas` | + +`OS:WindowMaterial:Gas` inside an opaque construction makes EnergyPlus fail in +`InitConductionTransferFunctions` ("R Value below lowest allowed value", R = 0.000) — the exact +fatal failure observed in the first Rhino 8 smoke-test model (AR90UP 50 mm cavities). + +### Opaque cavity → OS:Material:AirGap + +| SAM source | Unit | OpenStudio field | Conversion | Missing-value policy | +| --- | --- | --- | --- | --- | +| `GasMaterialParameter.HeatTransferCoefficient` h | W/m²K | Thermal Resistance R [m²K/W] | **R = 1 / h** | **error** SAM-OS-MAT-001 when missing, NaN, infinite or ≤ 0; **error** when R < 0.001 m²K/W (EnergyPlus per-layer minimum from `InitConductionTransferFunctions`) | + +Authority for the property and units: SAM `Query.HeatTransferCoefficient` documents the value as +"Heat Transfer Coefficient (Thermal Conductance) [W/m2K]" (EDSL reference), and SAM's +`Query.UpdateHeatTransferCoefficients` computes it from gas type, thickness and tilt +(`AirspaceConvectiveHeatTransferCoefficient(tilt, thickness)` for opaque air cavities) and stores +it on the material via `GasMaterialParameter.HeatTransferCoefficient`. The companion SAM query +`Query.AirspaceThermalResistance` ("Thermal Resistance of airspace in Opaque Construction +according to BS EN ISO 6946:2017 [m2K/W]") confirms the opaque-cavity model is a resistive +layer — thickness alone is *not* a valid resistance model. + +(Reference note: SAM_LadybugTools' legacy opaque path computes R via +`AirspaceThermalResistance(angle, thickness)`; its `New` path feeds the parameter to Honeybee's +`rValue` directly. Neither is copied: the parameter is a conductance, so R = 1/h.) + +### Pane gas → OS:WindowMaterial:Gas (unchanged) + +| SAM source | Unit | OpenStudio field | Policy | +| --- | --- | --- | --- | +| `Analytical.Query.DefaultGasType(gasMaterial)` (parameter `GasMaterialParameter.DefaultGasType`, else name matching) | enum | Gas Type | Air/Argon/Krypton/Xenon direct; any other value (incl. Undefined, SulfurHexaFluoride) → **error** SAM-OS-MAT-001 | +| `ConstructionLayer.Thickness` | m | Thickness | as opaque rule | + +### Material-family validation + +* Opaque constructions accept only `StandardOpaqueMaterial`, `MasslessOpaqueMaterial` and + `AirGap` — an `OpenStudio.Gas` or a glazing material in an opaque layer set is rejected with + SAM-OS-CON-001/SAM-OS-MAT-001 before any CLI execution. +* Fenestration pane constructions accept `StandardGlazing`, `Gas` and `StandardOpaqueMaterial` + (opaque doors) — an `AirGap` in a pane set is rejected. +* A failed gas layer is never silently omitted: material conversion failure fails the whole + construction with an error diagnostic. +* Material cache keys include the usage: `:OpaqueAirGap:` and `:WindowGas:` + (other materials remain `:`). One SAM GasMaterial used in both contexts + produces two distinct OpenStudio objects — never shared. + +## Constructions + +* `Construction.ConstructionLayers` → `OS:Construction` with resolved material layers, + Forward/Reverse per the table above. Empty/missing layer list → **error** SAM-OS-CON-001. + A layer whose material name is not found in `AnalyticalModel.MaterialLibrary` → **error** + SAM-OS-CON-001 naming the material. No hidden default materials, ever. +* `ApertureConstruction.PaneConstructionLayers` → `OS:Construction` (`:Pane:Forward` / + `:Pane:Reverse` cache keys). +* `ApertureConstruction.FrameConstructionLayers` → `OS:WindowProperty:FrameAndDivider` (C3, + documented approximation): width from `ApertureConstructionParameter.DefaultFrameWidth` else + the SAM frame thickness; conductance U = 1/Σ(thickness/conductivity) over the frame layers + (no film coefficients); solar/visible absorptance = 1 − `External*Reflectance` of the + outermost frame layer. When a frame is applied the SubSurface polygon becomes the SAM **pane** + polygon (`Aperture.GetPaneFace3Ds()`), because EnergyPlus grows the frame outward from the + glass; area conservation (pane strictly inside the aperture) is validated. Any invalid or + incomplete frame data falls back to the full-polygon frameless conversion with a + SAM-OS-CON-002 warning — never wrong geometry. Frames on opaque doors are skipped + (information diagnostic). +* `PanelType.Air` → one shared `OS:Construction:AirBoundary` (no direction variants), + assigned to both sides of the panel. +* OpenStudio rejecting a layer set (`setLayers` returns false, e.g. mixed opaque and + fenestration layers) → **error** SAM-OS-CON-001. + +## Deduplication + +* Materials: cached per `(material Guid, thickness)`; gas materials additionally per usage + (`:OpaqueAirGap:` / `:WindowGas:`). The SAM Guid is registered once + in the object map (first variant). +* Constructions: cached per `(construction Guid, direction)`; Guid registered once + (Forward variant). +* Deduplication is by Guid, never by name alone. diff --git a/docs/SAM_OPENSTUDIO_RESULT_MAPPING.md b/docs/SAM_OPENSTUDIO_RESULT_MAPPING.md new file mode 100644 index 0000000..44ad24f --- /dev/null +++ b/docs/SAM_OPENSTUDIO_RESULT_MAPPING.md @@ -0,0 +1,125 @@ +# SAM → OpenStudio result mapping + +**Status:** Binding for C5. Covers extraction from the EnergyPlus SQLite output into the +engine-neutral `OpenStudioSimulationResultSet` and the mapping into SAM result classes. + +## Unit authority + +One converter family in `SAM.Core.OpenStudio.Query.ConvertUnit`: + +| Helper | Conversion | Used for | +| --- | --- | --- | +| `JoulesToKilowattHours` | J ÷ 3 600 000 → kWh | all annual energies | +| `JoulesPerIntervalToWatts` | J ÷ interval seconds → W | peaks (hour-average power) and at-peak gains | +| `ConvertUnit(DataTable, …)` | ReportDataDictionary.Units authority ("J" → `JoulesPerIntervalToWatts`) | the legacy SpaceSimulationResult DataTable path | + +No extraction path divides by a local constant. The historical divergence (÷3.6e6 vs ÷3600) +is resolved: ÷3.6e6 is kWh (annual), ÷3600 is hour-average watts (at-peak); both route through +the helpers above. + +## Zone identity + +EnergyPlus report keys vary by variable class: Ideal Loads variables key on the **system +name**, zone-level variables on the **ThermalZone name**, enclosure variables on the **Space +name**. All three carry the deterministic SAM Guid suffix (first 8 hex digits of the space +Guid), so extraction normalises every per-zone dictionary onto the Ideal Loads system key — +the result set has ONE zone identity, matched back to SAM spaces through +`Core.OpenStudio.Query.OpenStudioName` (case-insensitively). + +## Extraction (SQL, parameterised, weather-run environment only) + +All queries use parameterised `System.Data.SQLite` commands and are restricted to the +weather-run environment (`EnvironmentPeriods.EnvironmentType = 3`) — imported design days +never double-count into annual totals or peaks. + +| Result-set member | EnergyPlus source | Conversion | +| --- | --- | --- | +| AnnualHeating/CoolingEnergy | `Zone Ideal Loads Supply Air Total Heating/Cooling Energy` [J], SUM | J → kWh | +| PeakHeating/CoolingLoad + Hour | same variables, hourly series max | hour-average W → kW; hour-of-year from the Time table | +| PeakHeating/CoolingLoadTotal + HourTotal | hourly series summed across zones (coincident) | hour-average W → kW | +| UnmetHeating/CoolingHours | `Zone Heating/Cooling Setpoint Not Met Time` [h], SUM | none | +| PeopleGains | `Zone People Total Heating Energy` [J], SUM | J → kWh | +| LightingGains | `Zone Lights Total Heating Energy` [J], SUM | J → kWh | +| EquipmentGains | `Zone Electric Equipment Total Heating Energy` [J], SUM | J → kWh | +| WindowSolarGains | `Enclosure Windows Total Transmitted Solar Radiation Energy` [J], SUM (Enclosure-scoped in current EnergyPlus; the `Zone Windows …` name was retired) | J → kWh | +| InfiltrationGains | `Zone Infiltration Sensible Heat Gain/Loss Energy` [J], net (gain − loss) | J → kWh | +| VentilationHeating/CoolingEnergy | `Zone Ideal Loads Outdoor Air Sensible Heating/Cooling Energy` [J], SUM | J → kWh | +| TemperatureSeries / OperativeTemperatureSeries / RelativeHumiditySeries | `Zone Mean Air Temperature` / `Zone Operative Temperature` / `Zone Air Relative Humidity`, hourly | none; only when `OpenStudioRunOptions.ExtractTimeSeries` | +| RuntimeSeconds / WarningCount / SevereCount / FatalCount | CLI wall-clock; eplusout.err counts | none | + +Zero-vs-missing: a zone absent from the report (unconditioned, no Ideal Loads) is absent from +every dictionary — never zero-filled. A variable with no rows for a key produces no entry. + +## SAM mapping (`Convert/ToSAM/SimulationResults.cs`) + +| SAM slot | Source | Notes | +| --- | --- | --- | +| `AnalyticalModelSimulationResultParameter.ConsumptionHeating/Cooling` [kWh] | TotalAnnualHeating/Cooling | | +| `.PeakHeating/CoolingLoad` [kW] | coincident totals | | +| `.PeakHeating/CoolingHour` [h] | hour-of-year of the coincident peak | | +| `.FloorArea` / `.Volume` [m²/m³] | Σ `SpaceParameter.Area` / `.Volume` | Derived | +| `SpaceSimulationResultParameter.Load` [W] | per-zone peak load × 1000 | one result per LoadType (Heating/Cooling), SAM pattern | +| `.LoadIndex` [h] | hour-of-year of the zone peak | | +| `.UnmetHours` [h] | per-zone not-met hours | | + +At-peak gain slots (solar, lighting, equipment, occupancy, infiltration W-values) and surface +results stay with the established design-day `ZoneSizes` SQLite path +(`Create/SpaceSimulationResults.cs`, `Create/SurfaceSimulationResults.cs`), which requires +sizing runs (C4 DDY import). Time series do not fit SAM parameter bags; they live in the +result set only. + +## `SAMAnalytical.AddResultsBySQL` attachment rules (human-Rhino fix 3) + +`Modify.AddResults(AdjacencyCluster, path)` now combines both families: the annual +engine-neutral result set above (per-LoadType `SpaceSimulationResult` with Load [W], +LoadIndex, UnmetHours) and the design-day `ZoneSizes` family (DesignLoad) when sizing ran. + +**Why one conditioned space yields four `SpaceSimulationResult`s.** The two families are +distinct measurements of the same zone and are deliberately not merged — one space, one load +type, two answers to different questions: + +| Family | Source | Name | Carries | Answers | +|---|---|---|---|---| +| Annual | `ReportData` Ideal Loads series over the run period | SAM `Space.Name` (e.g. `Cell 1`) | `Load` [W], `LoadIndex` (peak hour-of-year), `UnmetHours` | "what did the zone actually peak at across the weather year" | +| Design day | `ZoneSizes` (sizing periods) | EnergyPlus zone name (e.g. `SAM_ThermalZone_Cell_1_`) | `DesignLoad` [W], `DesignDayName`, `DesignDayIndex`, `PeakDate` | "what would the plant be sized at on the ASHRAE design day" | + +Heating + cooling in each family = four results for one space. They differ in magnitude by +design (an annual peak is not a design-day load) and both reference the same SAM `Space` Guid, +so filter by which parameter is present — `Load` for annual, `DesignLoad` for design day — or by +`LoadType`. A run without sizing periods produces only the annual pair. + +- **Zone/panel resolution**: EnergyPlus names (`SAM___`) are matched to SAM + objects by their deterministic 8-hex Guid suffix, then by full-Guid reference, then by + sanitized name — never by display name alone. Unmatched SQL zones/surfaces and SAM + spaces/panels with no result are both reported as structured diagnostics (a reported zero + stays a valid result; only absence is diagnosed). +- **Surface aggregation rule**: one `SurfaceSimulationResult` per engine surface (identity: + SQL `SurfaceIndex`). An internal panel represented by two engine surfaces + receives two results related to the same panel — values are never summed across surfaces. + Surface values available without sizing runs: area, zone identity, panel linkage; inside/ + outside conduction at the space peak is added per load type when `ZoneSizes` data exists. +- **Subsurfaces**: the EnergyPlus `Surfaces` table lists subsurfaces alongside base surfaces, + and a `SAM_SubSurface__` name carries the **Aperture** Guid, never a panel Guid. + Apertures are not standalone `AdjacencyCluster` objects, so a window result is related to the + panel **hosting** that aperture, keeping its own SQL name and `SurfaceIndex`. A glazed panel + therefore carries one result for its opaque surface plus one per hosted aperture. Resolution + order: panel Guid suffix → aperture Guid suffix → **host base surface**. The last one is the + authoritative fallback: EnergyPlus records the base surface each subsurface sits in + (`Surfaces.BaseSurfaceIndex`), and that name carries the panel Guid, so a window resolves even + when its aperture Guid is no longer in the cluster — apertures are re-created (trimmed, merged, + re-hosted) and a Guid present at conversion time need not survive. `Surfaces.BaseSurfaceIndex` + is optional: without it only the first two routes apply. +- **`Reference` carries the SAM Guid**: after a result is matched, its `Reference` holds the + matched `Space`/`Panel` Guid (`"N"` format), so a consumer holding only the result list can map + back to the model without re-parsing EnergyPlus names. This is uniform across both space + families and all surface results. `Core.Result.Reference` is immutable, so the result is + rebuilt through its JSON form — Guid, name, source, timestamp and parameters all carry over. + The engine identity it replaces is preserved as parameters: `SurfaceIndex` (and + `HostSurfaceName`) on surface results, `ZoneIndex`/`ZoneName` on space results. An unmatched + result keeps its raw SQL reference. Two engine surfaces of one internal panel therefore share + a `Reference` and are told apart by `SurfaceIndex` — values are still never summed. +- **Rerun**: identical results (type, name, reference, load type) already present from the + same source are not duplicated; the space/panel relation is ensured. +- The Grasshopper output name `panelSimulationResults` is retained for compatibility; the SAM + class is `SurfaceSimulationResult`. The component clones the input before attaching results + (non-mutating convention). diff --git a/docs/SAM_OPENSTUDIO_TO_SAM_COVERAGE.md b/docs/SAM_OPENSTUDIO_TO_SAM_COVERAGE.md new file mode 100644 index 0000000..8b4320b --- /dev/null +++ b/docs/SAM_OPENSTUDIO_TO_SAM_COVERAGE.md @@ -0,0 +1,248 @@ +# OpenStudio → SAM Analytical Import Coverage + +Status: reviewed 2026-07-21 (branch `feature/openstudio-to-sam-analytical`). + +This document is the complete audit of what the reverse (OpenStudio → SAM) import covers. It is +**generated from and kept in lockstep with** the machine-readable manifest +[`tests/resources/openstudio-to-sam-coverage.json`](../tests/resources/openstudio-to-sam-coverage.json); +the `ReverseCoverageTests` enforce the manifest (never this Markdown). When coverage changes, +update the manifest first and regenerate the tables here. + +The forward direction has its own document, +[`SAM_OPENSTUDIO_ANALYTICAL_COVERAGE.md`](SAM_OPENSTUDIO_ANALYTICAL_COVERAGE.md). The two are +independent: a concept can be Native one way and Unsupported the other. + +## Classification scheme + +| Status | Meaning | +|---|---| +| **Native** | Direct SAM representation; values pass through. | +| **Derived** | Deterministically calculated from OpenStudio data (formula documented per row). | +| **Approximated** | Mapped under a documented assumption; a structured diagnostic names the approximation. | +| **Unsupported** | No safe SAM equivalent; a structured diagnostic is emitted when the source object is present. Nothing is silently dropped. | +| **Deferred** | Belongs to the detailed-HVAC programme. Reported through `SAM-OSI-HVAC-001`, never translated. | +| **NotApplicable** | No import semantics: run configuration, reporting, or a concept SAM re-derives on export. | + +## Totals + +| Status | Entries | +|---|---| +| Native | 57 | +| Derived | 11 | +| Approximated | 16 | +| Unsupported | 45 | +| Deferred | 9 | +| NotApplicable | 6 | +| **Total** | **144** | + +## Explicitly deferred domains + +AirLoopHVAC and PlantLoop translation into SAM Systems; zone equipment and control sequences; +service water heating and refrigeration; AirflowNetwork; daylighting controls; +EnergyManagementSystem; output requests and reporting configuration. + +## Coverage tables + +### Model, site and weather + +| OpenStudio concept | SAM target | Status | Diagnostic | Conversion / policy | +|---|---|---|---|---| +| `Model.Building.Name` | `AnalyticalModel.Name` | **Native** | - | The stamped SAM.Name feature takes precedence over the sanitised OpenStudio object name. | +| `Model.Building.NorthAxis` | `AnalyticalModelParameter.NorthAngle` | **Native** | - | radians = degrees * pi / 180 (exact inverse of the forward conversion) | +| `Model.Site` | `Core.Location` | **Native** | `SAM-OSI-WEA-001` | No Location is created when latitude, longitude and elevation are all exactly zero - the OpenStudio default means the site was never set. | +| `Model.Site.Terrain` | - | **Unsupported** | `SAM-OSI-WEA-001` | SAM Location carries no terrain class. | +| `Model.Site.TimeZone` | - | **Unsupported** | `SAM-OSI-WEA-001` | SAM Location carries no time zone. | +| `Model.WeatherFile` | `AnalyticalModelParameter.WeatherData + OpenStudioSourceParameter.WeatherFilePath` | **Derived** | `SAM-OSI-WEA-001` | When the referenced EPW is found on disk its hourly weather is loaded into SAM WeatherData and embedded (the slot the forward exporter reads back). When the file is absent, or ImportWeatherData is off, only the path is recorded - a reference is never presented as embedded weather. | +| `Model.SizingPeriod.DesignDay` | `AnalyticalModelParameter.Heating/CoolingDesignDays` | **Approximated** | `SAM-OSI-WEA-001` | Imported by name, date and heating/cooling role only: an EnergyPlus design day is parametric while a SAM DesignDay is an hourly weather day. | +| `Model.RunPeriod` | - | **Unsupported** | `SAM-OSI-SET-001` | SAM AnalyticalModel carries no run period; it is set by the forward conversion options. | +| `Model.Timestep` | - | **Unsupported** | `SAM-OSI-SET-001` | | +| `Model.ShadowCalculation` | - | **Unsupported** | `SAM-OSI-SET-001` | | +| `Model.YearDescription` | - | **NotApplicable** | - | Calendar configuration of the run, not of the building. | + +### Spaces and zones + +| OpenStudio concept | SAM target | Status | Diagnostic | Conversion / policy | +|---|---|---|---|---| +| `OS:Space` | `Space` | **Native** | - | Always 1:1; never collapsed by ThermalZone. | +| `OS:Space.Transformation` | - | **Native** | - | buildingTransformation applied to every surface vertex; SAM-authored OSMs have identity here. | +| `OS:Space.FloorArea` | `SpaceParameter.Area` | **Derived** | - | shell area of the imported bounding faces; OpenStudio floorArea() only when no closed shell exists | +| `OS:Space.Volume` | `SpaceParameter.Volume` | **Derived** | - | shell volume of the imported bounding faces; OpenStudio volume() only when no closed shell exists | +| `OS:Space.Location` | `Space.Location` | **Derived** | `SAM-OSI-ZONE-002` | internal point of the closed shell | +| `OS:BuildingStory` | `SpaceParameter.LevelName` | **Native** | - | | +| `OS:ThermalZone` | `OpenStudioSourceParameter.ThermalZoneName` | **Native** | - | Recorded per space; controls are applied from it. | +| `OS:ThermalZone.MultiSpace` | - | **Native** | `SAM-OSI-ZONE-001` | Each space stays a separate SAM Space and they share the zone's controls. | +| `OS:Space.Multiplier` | - | **Unsupported** | `SAM-OSI-ZONE-002` | SAM has no space multiplier. | +| `OS:SpaceInfiltration.DesignFlowRate.ACH` | `InternalConditionParameter.InfiltrationAirChangesPerHour` | **Native** | - | | +| `OS:SpaceInfiltration.DesignFlowRate.Other` | - | **Unsupported** | `SAM-OSI-LOAD-001` | Flow-based methods need per-space geometry a shared space type does not have. | +| `OS:SpaceInfiltration.EffectiveLeakageArea` | - | **Unsupported** | `SAM-OSI-LOAD-001` | | +| `OS:SpaceInfiltration.FlowCoefficient` | - | **Unsupported** | `SAM-OSI-LOAD-001` | | +| `OS:SpaceType` | `InternalCondition` | **Native** | - | One deduplicated internal condition per space type. | +| `OS:Space.SpaceLevelLoads` | - | **Unsupported** | `SAM-OSI-LOAD-002` | SAM has no per-space load layer on top of an internal condition. | + +### Surfaces + +| OpenStudio concept | SAM target | Status | Diagnostic | Conversion / policy | +|---|---|---|---|---| +| `OS:Surface.Wall.Outdoors` | `PanelType.WallExternal` | **Native** | - | | +| `OS:Surface.Wall.Surface` | `PanelType.WallInternal` | **Native** | - | | +| `OS:Surface.Wall.Adiabatic` | `PanelType.WallInternal + PanelParameter.Adiabatic` | **Native** | - | | +| `OS:Surface.Wall.Ground` | `PanelType.UndergroundWall` | **Native** | - | | +| `OS:Surface.Floor.Outdoors` | `PanelType.FloorExposed` | **Native** | - | | +| `OS:Surface.Floor.Surface` | `PanelType.FloorInternal` | **Native** | - | | +| `OS:Surface.Floor.Adiabatic` | `PanelType.FloorInternal + PanelParameter.Adiabatic` | **Native** | - | | +| `OS:Surface.Floor.Ground` | `PanelType.SlabOnGrade` | **Native** | - | | +| `OS:Surface.RoofCeiling.Outdoors` | `PanelType.Roof` | **Native** | - | | +| `OS:Surface.RoofCeiling.Surface` | `PanelType.Ceiling` | **Native** | - | | +| `OS:Surface.RoofCeiling.Adiabatic` | `PanelType.Ceiling + PanelParameter.Adiabatic` | **Native** | - | | +| `OS:Surface.RoofCeiling.Ground` | `PanelType.UndergroundCeiling` | **Native** | - | | +| `OS:Surface.Foundation` | `ground-contact PanelType` | **Native** | - | The whole Ground/Foundation/preprocessor family is treated as ground contact. | +| `OS:Surface.OtherSideCoefficients` | - | **Unsupported** | `SAM-OSI-BC-001` | Falls back to adiabatic; SAM cannot carry an externally specified surface temperature. | +| `OS:Surface.OtherSideConditionsModel` | - | **Unsupported** | `SAM-OSI-BC-001` | Falls back to adiabatic. | +| `OS:Surface.AdjacentSurface` | - | **Native** | - | Authoritative: the two surfaces of an interzone partition become ONE SAM Panel related to two Spaces. | +| `OS:Surface.AdjacencyByGeometry` | - | **Approximated** | `SAM-OSI-ADJ-001` | Only for a Surface boundary with no adjacency handle; requires coincident internal points, areas within 1 percent and opposed normals. | +| `OS:Surface.AdjacencyUnresolved` | - | **Approximated** | `SAM-OSI-ADJ-002` | Demoted to adiabatic, matching the forward direction's single-sided internal panel. | +| `OS:Surface.Geometry` | - | **Native** | `SAM-OSI-GEO-001` | Validated for vertex count, planarity, duplicates, self-intersection and minimum area; never repaired. | +| `OS:Surface.Geometry.VertexCleaning` | - | **Native** | `SAM-OSI-GEO-002` | Duplicate and collinear vertices are removed while normalising a boundary. Shape, area and normal are unchanged, so this is reported at Information severity and kept distinct from invalid geometry. | +| `OS:Surface.SunWindExposure` | - | **NotApplicable** | - | Derived by EnergyPlus from the boundary condition; SAM re-derives it on export. | + +### SubSurfaces and fenestration detail + +| OpenStudio concept | SAM target | Status | Diagnostic | Conversion / policy | +|---|---|---|---|---| +| `OS:SubSurface.FixedWindow` | `ApertureType.Window` | **Native** | - | | +| `OS:SubSurface.OperableWindow` | `ApertureType.Window` | **Approximated** | `SAM-OSI-APX-001` | SAM has no openability flag. | +| `OS:SubSurface.Skylight` | `ApertureType.Window` | **Native** | - | | +| `OS:SubSurface.Door` | `ApertureType.Door` | **Native** | - | | +| `OS:SubSurface.GlassDoor` | `ApertureType.Door` | **Native** | - | | +| `OS:SubSurface.OverheadDoor` | `ApertureType.Door` | **Approximated** | `SAM-OSI-APX-001` | | +| `OS:SubSurface.TubularDaylightDome` | `ApertureType.Window` | **Approximated** | `SAM-OSI-APX-001` | Imported as the glazed opening; SAM has no light pipe. | +| `OS:SubSurface.TubularDaylightDiffuser` | `ApertureType.Window` | **Approximated** | `SAM-OSI-APX-001` | | +| `OS:SubSurface.Unknown` | - | **Unsupported** | `SAM-OSI-SUB-001` | | +| `OS:SubSurface.Multiplier` | - | **Approximated** | `SAM-OSI-APX-001` | SAM apertures have no multiplier; the geometry is imported once. | +| `OS:SubSurface.Containment` | - | **Native** | `SAM-OSI-GEO-001` | Validated by Panel.AddAperture; a subsurface outside its host is reported, not attached. | +| `OS:WindowPropertyFrameAndDivider` | - | **Unsupported** | `SAM-OSI-CON-001` | Frame and divider live outside the construction; SAM frame layers are never fabricated from them. | +| `OS:ShadingControl` | - | **Unsupported** | `SAM-OSI-CON-001` | | +| `OS:DaylightingDeviceShelf` | - | **Unsupported** | `SAM-OSI-SUB-001` | | + +### Shading + +| OpenStudio concept | SAM target | Status | Diagnostic | Conversion / policy | +|---|---|---|---|---| +| `OS:ShadingSurface.Site` | `PanelType.Shade` | **Native** | - | | +| `OS:ShadingSurface.Building` | `PanelType.Shade` | **Native** | - | | +| `OS:ShadingSurface.Space` | `PanelType.Shade` | **Native** | - | Group transformation composed with the owning space's building transformation. | +| `OS:ShadingSurfaceGroup.Identity` | `OpenStudioSourceParameter.ShadingGroupType/Name` | **Native** | - | | +| `OS:ShadingSurfaceGroup.ShadedSurface` | - | **Approximated** | `SAM-OSI-APX-001` | SAM shade panels are free-standing; the association is metadata only. | + +### Materials + +| OpenStudio concept | SAM target | Status | Diagnostic | Conversion / policy | +|---|---|---|---|---| +| `OS:Material.StandardOpaqueMaterial` | `Core.OpaqueMaterial` | **Native** | - | | +| `OS:Material.MasslessOpaqueMaterial` | `Core.OpaqueMaterial` | **Approximated** | `SAM-OSI-APX-001` | conductivity = 0.025 m / R; resistance preserved exactly, near-zero thermal mass assigned | +| `OS:Material.AirGap` | `Core.GasMaterial` | **Derived** | - | HeatTransferCoefficient = 1 / thermalResistance (exact inverse of the forward R = 1/h) | +| `OS:WindowMaterial.Glazing` | `Core.TransparentMaterial` | **Native** | - | EnergyPlus Front/Back map to SAM External/Internal, matching the forward direction. | +| `OS:WindowMaterial.SimpleGlazingSystem` | `Core.TransparentMaterial` | **Approximated** | `SAM-OSI-APX-001` | conductivity = thickness * U; solar transmittance taken from SHGC (an overstatement, since SHGC includes inward-flowing absorbed radiation) | +| `OS:WindowMaterial.Gas` | `Core.GasMaterial` | **Native** | - | HeatTransferCoefficient = getThermalConductance(293.15 K) | +| `OS:WindowMaterial.GasMixture` | `Core.GasMaterial` | **Approximated** | `SAM-OSI-MAT-001` | Conductance preserved; composition lost - SAM carries a single gas type. | +| `OS:WindowMaterial.Blind` | - | **Unsupported** | `SAM-OSI-MAT-001` | Name-only placeholder; no properties substituted. | +| `OS:WindowMaterial.Shade` | - | **Unsupported** | `SAM-OSI-MAT-001` | | +| `OS:WindowMaterial.Screen` | - | **Unsupported** | `SAM-OSI-MAT-001` | | +| `OS:WindowMaterial.GlazingRefractionExtinctionMethod` | - | **Unsupported** | `SAM-OSI-MAT-001` | | +| `OS:MaterialProperty.PhaseChange` | - | **Unsupported** | `SAM-OSI-MAT-001` | SAM materials have no phase-change model. | + +### Constructions + +| OpenStudio concept | SAM target | Status | Diagnostic | Conversion / policy | +|---|---|---|---|---| +| `OS:Construction.Opaque` | `Construction` | **Native** | - | Layer order preserved outside-first. | +| `OS:Construction.Fenestration` | `ApertureConstruction` | **Native** | - | Pane layers only; frame layers are never fabricated. | +| `OS:Construction.AirBoundary` | `PanelType.Air` | **Native** | - | A layer-free SAM construction; the air behaviour is carried by the panel type. | +| `OS:Construction.InternalSource` | - | **Unsupported** | `SAM-OSI-CON-001` | | +| `OS:Construction.CfactorUndergroundWall` | - | **Unsupported** | `SAM-OSI-CON-001` | | +| `OS:Construction.FfactorGroundFloor` | - | **Unsupported** | `SAM-OSI-CON-001` | | +| `OS:Construction.WindowDataFile` | - | **Unsupported** | `SAM-OSI-CON-001` | | +| `OS:Construction.Missing` | - | **Unsupported** | `SAM-OSI-CON-001` | A surface with no construction gets a named, layer-free placeholder - never a default build-up. | +| `OS:Construction.UnreferencedPruning` | - | **Native** | - | Materials and profiles the imported topology does not reference are removed. | + +### Loads and controls + +| OpenStudio concept | SAM target | Status | Diagnostic | Conversion / policy | +|---|---|---|---|---| +| `OS:People` | `InternalConditionParameter.AreaPerPerson + Occupancy*GainPerPerson` | **Derived** | `SAM-OSI-LOAD-001` | areaPerPerson = 1 / peopleperSpaceFloorArea; sensible = activityLevel * sensibleHeatFraction; latent = activityLevel * (1 - sensibleHeatFraction) | +| `OS:People.AutocalculatedSensibleFraction` | - | **Approximated** | `SAM-OSI-APX-001` | No fixed split exists; the whole metabolic rate is imported as sensible. | +| `OS:People.NumberOfPeopleMethod` | - | **Unsupported** | `SAM-OSI-LOAD-001` | An absolute count cannot become a density on a shared space type without inventing an area. | +| `OS:Lights` | `InternalConditionParameter.LightingGainPerArea + LightingProfileName` | **Native** | - | | +| `OS:Lights.RadiantVisibleFractions` | `InternalConditionParameter.LightingRadiantProportion / LightingViewCoefficient` | **Native** | - | | +| `OS:ElectricEquipment` | `InternalConditionParameter.EquipmentSensibleGainPerArea / EquipmentLatentGainPerArea` | **Native** | - | | +| `OS:ElectricEquipment.PartLatent` | - | **Approximated** | `SAM-OSI-APX-001` | A single part-latent instance is apportioned; the two halves then share one schedule. | +| `OS:GasEquipment` | - | **Unsupported** | `SAM-OSI-LOAD-001` | | +| `OS:SteamEquipment` | - | **Unsupported** | `SAM-OSI-LOAD-001` | | +| `OS:HotWaterEquipment` | - | **Unsupported** | `SAM-OSI-LOAD-001` | | +| `OS:OtherEquipment` | - | **Unsupported** | `SAM-OSI-LOAD-001` | | +| `OS:Luminaire` | - | **Unsupported** | `SAM-OSI-LOAD-001` | | +| `OS:ElectricEquipment.ITE.AirCooled` | - | **Unsupported** | `SAM-OSI-LOAD-001` | | +| `OS:InternalMass` | - | **Unsupported** | `SAM-OSI-LOAD-001` | | +| `OS:DesignSpecification.OutdoorAir` | `InternalConditionParameter.SupplyAirFlow*` | **Derived** | - | each populated outdoor-air field maps to its SAM counterpart: perPerson -> SupplyAirFlowPerPerson, perFloorArea -> SupplyAirFlowPerArea, airChangesPerHour -> SupplyAirChangesPerHour, flowRate -> SupplyAirFlow | +| `OS:ThermostatSetpoint.DualSetpoint` | `InternalConditionParameter.Heating/CoolingProfileName` | **Native** | - | SAM stores setpoints as profiles whose values are the temperatures, so setback schedules survive. | +| `OS:ZoneControl.Humidistat` | `InternalConditionParameter.Humidification/DehumidificationProfileName` | **Native** | - | | + +### Schedules + +| OpenStudio concept | SAM target | Status | Diagnostic | Conversion / policy | +|---|---|---|---|---| +| `OS:Schedule.Constant` | `Profile` | **Native** | - | 8760 identical hourly values | +| `OS:Schedule.Ruleset` | `Profile` | **Derived** | - | getDaySchedules over the whole year, sampled at the end of each hour; weekday/weekend rules, seasonal ranges and rule priority resolved by OpenStudio | +| `OS:Schedule.Day` | - | **Derived** | - | Read through the ruleset expansion. | +| `OS:Schedule.Rule` | - | **Derived** | - | Applied by the ruleset expansion; never flattened away. | +| `OS:Schedule.FixedInterval.Hourly` | `Profile` | **Native** | - | | +| `OS:Schedule.FixedInterval.SubHourly` | - | **Approximated** | `SAM-OSI-SCH-001` | Averaged into hourly means so the daily total is preserved. | +| `OS:Schedule.Compact` | - | **Unsupported** | `SAM-OSI-SCH-001` | The load is imported without a profile; no constant is substituted. | +| `OS:Schedule.File` | - | **Unsupported** | `SAM-OSI-SCH-001` | | +| `OS:Schedule.VariableInterval` | - | **Unsupported** | `SAM-OSI-SCH-001` | | +| `OS:ScheduleTypeLimits` | - | **NotApplicable** | - | SAM ProfileType carries the semantic instead. | + +### HVAC and deferred domains + +| OpenStudio concept | SAM target | Status | Diagnostic | Conversion / policy | +|---|---|---|---|---| +| `OS:ZoneHVAC.IdealLoadsAirSystem` | - | **Derived** | - | Recognised as the conditioned state; SAM's own export targets Ideal Loads. | +| `OS:AirLoopHVAC` | - | **Deferred** | `SAM-OSI-HVAC-001` | | +| `OS:PlantLoop` | - | **Deferred** | `SAM-OSI-HVAC-001` | | +| `OS:ZoneHVAC.Equipment` | - | **Deferred** | `SAM-OSI-HVAC-001` | | +| `OS:AvailabilityManager` | - | **Deferred** | `SAM-OSI-HVAC-001` | | +| `OS:WaterUseEquipment` | - | **Deferred** | `SAM-OSI-HVAC-001` | | +| `OS:Refrigeration` | - | **Deferred** | `SAM-OSI-HVAC-001` | | +| `OS:AirflowNetwork` | - | **Deferred** | `SAM-OSI-HVAC-001` | | +| `OS:Daylighting.Controls` | - | **Deferred** | `SAM-OSI-HVAC-001` | | +| `OS:EnergyManagementSystem` | - | **Deferred** | `SAM-OSI-HVAC-001` | | +| `OS:Output.Variable` | - | **NotApplicable** | - | Reporting configuration, not building data. | + +### Identity + +| OpenStudio concept | SAM target | Status | Diagnostic | Conversion / policy | +|---|---|---|---|---| +| `Identity.SAM.Guid` | - | **Native** | `SAM-OSI-ID-001` | Full SAM Guid restored from OS:AdditionalProperties. | +| `Identity.SAM.Type` | - | **Native** | `SAM-OSI-ID-001` | Rejects identity metadata belonging to a different SAM object kind. | +| `Identity.SAM.Name` | - | **Native** | - | The unsanitised SAM name, unavailable from the sanitised object name. | +| `Identity.NameGuidSuffix` | - | **NotApplicable** | - | 8 hex characters of a 128-bit Guid: a matching and diagnostic key only, never a restorable identity. | +| `Identity.ThirdPartyModel` | - | **Native** | - | No metadata is the normal third-party case and is never reported as a problem. | +| `Identity.OpenStudioHandle` | `OpenStudioSourceParameter.SourceHandle` | **Native** | - | | + +### Input and workflow + +| OpenStudio concept | SAM target | Status | Diagnostic | Conversion / policy | +|---|---|---|---|---| +| `Input.PathInvalid` | - | **Unsupported** | `SAM-OSI-IN-001` | | +| `Input.ExtensionUnsupported` | - | **Unsupported** | `SAM-OSI-IN-002` | | +| `Input.OsmLoadFailure` | - | **Unsupported** | `SAM-OSI-OSM-001` | Never returns an empty AnalyticalModel. | +| `Input.OsmVersionTranslation` | - | **Native** | `SAM-OSI-OSM-002` | Older OSMs are upgraded on load; translator messages are surfaced. | +| `Osw.Parse` | - | **Native** | `SAM-OSI-OSW-001` | | +| `Osw.SeedMissing` | - | **Unsupported** | `SAM-OSI-OSW-002` | Blocking when execution is disabled. | +| `Osw.SeedNotFound` | - | **Unsupported** | `SAM-OSI-OSW-003` | | +| `Osw.SeedOnlyImport` | - | **Approximated** | `SAM-OSI-OSW-004` | The seed is imported and the unapplied measures are stated. | +| `Osw.ExecutionFailure` | - | **Unsupported** | `SAM-OSI-OSW-005` | | +| `Osw.FinalOsmNotFound` | - | **Unsupported** | `SAM-OSI-OSW-006` | | +| `Osw.EnergyPlusMeasure` | - | **Unsupported** | `SAM-OSI-OSW-007` | IDF-only changes cannot be represented in the OSM. | +| `Osw.WorkflowExecuted` | - | **Native** | `SAM-OSI-OSW-008` | The workflow ran and its final post-model-measure OSM was located and imported. | +| `Osw.NoSimulationResults` | - | **NotApplicable** | `SAM-OSI-OSW-009` | A workflow of model measures with no simulation step produces a model but no EnergyPlus results. An import needs the model, not the results, so the simulation runner's failure verdict is downgraded to information and never invalidates the imported model. | diff --git a/docs/SAM_OpenStudio_MVP_Implementation_Plan.md b/docs/SAM_OpenStudio_MVP_Implementation_Plan.md new file mode 100644 index 0000000..f15bc80 --- /dev/null +++ b/docs/SAM_OpenStudio_MVP_Implementation_Plan.md @@ -0,0 +1,581 @@ +# SAM → OpenStudio MVP Implementation Plan + +**Status:** Approved for execution +**Last reviewed:** 2026-07-18 +**Repository:** `SAM-BIM/SAM_OpenStudio` +**Base branch:** `sow/2026-Q3` (always branch off this; PRs target this) +**Feature branch:** `feature/analytical-model-to-openstudio-mvp` +**Related:** [SAM_Simulation_Engine_Roadmap.md](SAM_Simulation_Engine_Roadmap.md) — this plan executes Roadmap **Phase 1** and the adapter-structure part of **Phase 2**. + +--- + +## 1. Technical direction + +Implement a direct native conversion using the OpenStudio C# SDK: + +```text +SAM.Analytical.AnalyticalModel + │ + ▼ +SAM.Analytical.OpenStudio.Convert.ToOpenStudio(...) + │ + ▼ +OpenStudio.Model.Model + │ + ├── .osm + ├── .osw + ├── EnergyPlus simulation (OpenStudio CLI) + ├── diagnostics + └── heating/cooling load results (existing SQL readers) +``` + +Do **not** implement `SAM → Honeybee → OpenStudio`. `SAM_LadybugTools` is a **semantic reference only** — no Honeybee/Ladybug runtime dependency may be added to this repository. It documents, in working code, how SAM handles: + +* geometry preparation and space-facing orientation; +* surface adjacency from the `AdjacencyCluster`; +* forward and reversed constructions; +* aperture conversion; +* material conversion; +* internal-condition deduplication; +* schedules and program types; +* conditioned versus unconditioned spaces. + +Reference implementations (read-only), all under +`..\SAM_LadybugTools\SAM_LadybugTools\SAM_LadybugTools.Analytical\Convert\ToLadybugTools\`: + +| Concern | File | +| --- | --- | +| Top-level model assembly | `Model.cs` | +| Space → Room, space-facing panels | `Room.cs`, `Face.cs` | +| Boundary conditions incl. adjacency pairing | `BoundaryCondition.cs` | +| Apertures and doors | `Aperture.cs`, `Door.cs` | +| Opaque / massless / gas / glazing materials | `EnergyMaterial.cs`, `EnergyMaterialNoMass.cs`, `EnergyWindowMaterialGas.cs`, `EnergyWindowMaterialGlazing.cs` | +| Constructions (incl. reversed) | `OpaqueConstructionAbridged.cs`, `WindowConstructionAbridged.cs` | +| Internal conditions → program types | `ProgramType.cs` | +| Profiles → schedules | `ScheduleDay.cs`, `ScheduleFixedInterval.cs`, `ScheduleRuleset.cs`, `HourlyContinous.cs` | +| Shading | `Shades.cs` | + +--- + +## 2. Current repository state (audited 2026-07-18) + +The implementation extends an **existing** solution — do not scaffold new projects. + +| Project | Target | State | +| --- | --- | --- | +| `SAM_OpenStudio\SAM.Core.OpenStudio` | netstandard2.0, x64 | **Exists.** SQL result reading: `Create\SqlFile.cs`, `Create\Model.cs`, `Query\ReportData*.cs`, `Query\AvailableTimeSeriesNames.cs`, `Query\ConvertUnit.cs`, `Classes\ShortDateTime.cs`, `Enums\ReportingFrequency.cs` — **keep and reuse** | +| `SAM_OpenStudio\SAM.Geometry.OpenStudio` | netstandard2.0, x64 | **Exists, empty stub** (`Classes\Test.cs` placeholder — remove during M0 audit) | +| `SAM_OpenStudio\SAM.Analytical.OpenStudio` | netstandard2.0, x64 | **Exists.** Results import: `Convert\ToSAM\SpaceSimulationResults.cs`, `Convert\ToSAM\PanelSimulationResults.cs`, `Create\DesignDays.cs`, `Create\*SimulationResults.cs`, `Query\DesignDays.cs`, `Modify\AddResults.cs`, result-parameter enums — **keep and reuse** | +| `Grasshopper\SAM.Core.Grasshopper.OpenStudio` | net8.0, x64 | **Exists** (Rhino 8) | +| `Grasshopper\SAM.Analytical.Grasshopper.OpenStudio` | net8.0, x64 | **Exists.** Components `OpenStudioCreateDesignDaysBySQL`, `OpenStudioCreateSpaceSimulationResultsBySQL`, `SAMAnalyticalAddResultsBySQL` — **keep** | + +Facts that bind the implementation: + +1. **Results import already works.** The MVP load-extraction step (§11) reuses the existing SQL layer and `ToSAM_SpaceSimulationResult` path instead of writing a new one. +2. **OpenStudio SDK**: NuGet `OpenStudio` **3.8.0** referenced by both non-Grasshopper libraries. Installed CLI + EnergyPlus is **3.10.0** at `C:\Program Files\ladybug_tools\openstudio` (that bundle also ships C# bindings under `CSharp\`). §11.1 defines the version gate. +3. **Conventions**: static partial classes `Convert` / `Query` / `Create` / `Modify` in folder-per-method layout; output to `..\..\build\`; x64; DLL `HintPath` references to prebuilt sibling repos (`..\..\..\SAM\build\SAM.Core.dll` etc. — all present). Follow these exactly. +4. **Sibling repos are read-only** (`SAM`, `SAM_LadybugTools`, `SAM_SQLite`). Consume SAM DLLs from `SAM\build\`; never edit or rebuild siblings as part of this work. +5. **No test project exists** — created in M0 (`tests/`, net8.0, x64, NUnit unless an ecosystem convention dictates otherwise). +6. **No SPDX headers exist** in current sources — add SPDX headers to **new files only**; do not churn existing files. +7. **No EPW files exist** anywhere in the workspace — see §11.3 weather fixture policy. +8. Workspace root on this machine: `\Documents\GitHub\SAM-BIM`. +9. **Existing public APIs are preserved** unless a change is explicitly justified in the audit doc (`docs/openstudio-mvp-audit.md`). + +Naming alignment with the Roadmap (§6.2 of the roadmap): this plan's `OpenStudioConversionOptions` / `OpenStudioConversionResult.Diagnostics` / `OpenStudioSimulationRunner` fulfil the roadmap's `OpenStudioTranslationOptions` / `OpenStudioTranslationReport` / `OpenStudioSimulationRunner` intent. The diagnostics list serialised to JSON **is** the translation report. + +--- + +## 3. MVP definition + +### Input + +```csharp +AnalyticalModel analyticalModel +string epwPath +OpenStudioConversionOptions options +``` + +### Output + +```csharp +OpenStudioConversionResult +``` + +containing: + +```csharp +OpenStudio.Model.Model Model +string OsmPath +string OswPath +OpenStudioRunResult RunResult +IReadOnlyList Diagnostics +IReadOnlyDictionary ObjectMap +bool IsValid +``` + +### MVP capabilities + +1. SAM spaces and thermal-zone geometry. +2. External and internal panels. +3. Surface adjacency. +4. Windows and doors. +5. Opaque, transparent, and gas materials. +6. Opaque and aperture constructions. +7. Occupancy, lighting and equipment gains. +8. Infiltration and outdoor-air requirements. +9. Heating and cooling setpoint schedules. +10. OpenStudio thermal zones. +11. Ideal Loads HVAC. +12. EPW weather assignment. +13. Annual EnergyPlus simulation via the OpenStudio CLI. +14. Heating and cooling load extraction **reusing the existing SQL readers** (`SAM.Core.OpenStudio` `SqlFile`/`ReportData`; `SAM.Analytical.OpenStudio` `ToSAM_SpaceSimulationResult`). +15. Detailed conversion and simulation diagnostics. + +### Explicitly deferred + +* SAM AirSystem conversion; detailed HVAC plant and air loops; water systems; controls; +* daylight simulation; natural ventilation algorithms; dynamic glazing; complex shading controls; moisture transport; +* results import **richer than** the existing `SpaceSimulationResult`/`PanelSimulationResult` path; +* automatic repair of seriously invalid SAM geometry. + +--- + +## 4. Definition of success + +The MVP is complete when a representative `AnalyticalModel` can: + +1. convert to an OpenStudio `Model`; +2. save a valid `.osm`; +3. generate an `.osw`; +4. run through the OpenStudio CLI (3.10.0 at the ladybug_tools path or a discovered install); +5. complete EnergyPlus with no fatal errors; +6. produce heating and cooling results satisfying the M6 gate (§13): annual heating ≥ 0 **and** annual cooling ≥ 0 **and** at least one > 0 for the conditioned fixture; zone-level result count equals conditioned-zone count; SQL units validated and documented; +7. preserve SAM floor area and volume within agreed tolerances; +8. preserve internal surface relationships; +9. preserve construction layer order; +10. reproduce SAM schedules and internal gains; +11. return actionable diagnostics rather than silently substituting data. + +--- + +## 5. Object mapping + +| SAM object | OpenStudio object | MVP rule | +| --- | --- | --- | +| `AnalyticalModel` | `Model` | One OpenStudio model | +| `AdjacencyCluster` | model geometry graph | Primary topology source | +| `Space` | `Space` | One-to-one | +| `Space` | `ThermalZone` | One thermal zone per SAM space | +| SAM level/elevation | `BuildingStory` | Group by floor elevation tolerance | +| `Panel` | `Surface` | One surface for each space-facing side | +| Internal `Panel` | two matched `Surface` objects | One outward-facing surface per space | +| External `Panel` | `Surface` | Outdoors, Ground or Adiabatic | +| `Aperture` | `SubSurface` | Window, door or glass door | +| Shading panel | `ShadingSurface` | Optional MVP extension | +| `OpaqueMaterial` | `StandardOpaqueMaterial` | Preserve physical properties | +| Massless material | `MasslessOpaqueMaterial` | Where SAM data supports it | +| `TransparentMaterial` | glazing material | Detailed glazing where properties exist | +| Aggregate glazing | `SimpleGlazingSystem` | Controlled fallback only | +| `GasMaterial` | `Gas` | Preserve type and thickness | +| `Construction` | `Construction` | Ordered material layers | +| `ApertureConstruction` | `Construction` | Pane layers initially | +| `InternalCondition` | `SpaceType` or direct space loads | Deterministically deduplicated | +| Occupancy profile | `People` and schedule | Preserve density and profile | +| Lighting profile | `Lights` and schedule | Preserve W/m² where available | +| Equipment profile | `ElectricEquipment` and schedule | Preserve W/m² where available | +| Infiltration | `SpaceInfiltrationDesignFlowRate` | Use explicit SAM basis | +| Ventilation | `DesignSpecificationOutdoorAir` | Per-person/per-area values | +| Heating profile | heating setpoint schedule | Applied to thermostat | +| Cooling profile | cooling setpoint schedule | Applied to thermostat | +| Conditioned space | `ZoneHVACIdealLoadsAirSystem` | MVP load calculation | +| Unconditioned space | no Ideal Loads system | Geometry and gains retained | +| SAM weather/location | site and EPW | EPW is explicit input | + +--- + +## 6. Code architecture (additions to the existing projects) + +### `SAM.Core.OpenStudio` — add + +```text +Classes/ + OpenStudioDiagnostic.cs + OpenStudioDiagnosticSeverity.cs + OpenStudioConversionOptions.cs + OpenStudioRunOptions.cs + OpenStudioRunResult.cs + OpenStudioObjectReference.cs + OpenStudioObjectMap.cs + +Query/ + SanitizeName.cs + OpenStudioVersion.cs + OpenStudioCliPath.cs // discovery order — see §11.2 +``` + +Diagnostic shape (note the enum type is `OpenStudioDiagnosticSeverity` — one name, used consistently): + +```csharp +public sealed class OpenStudioDiagnostic +{ + public string Code { get; } + public OpenStudioDiagnosticSeverity Severity { get; } + public string Message { get; } + public Guid? SamGuid { get; } + public string SamObjectType { get; } + public string OpenStudioObjectName { get; } +} +``` + +Diagnostic codes: + +```text +SAM-OS-GEO-001 Invalid or non-planar boundary +SAM-OS-GEO-002 Duplicate or collinear vertices removed +SAM-OS-ADJ-001 Missing adjacent surface +SAM-OS-MAT-001 Unsupported material +SAM-OS-CON-001 Missing construction layer +SAM-OS-SCH-001 Missing profile +SAM-OS-IC-001 Unsupported internal-condition parameter +SAM-OS-HVAC-001 Conditioned zone missing setpoints +SAM-OS-RUN-001 OpenStudio CLI failed +SAM-OS-EPLUS-001 EnergyPlus severe error +``` + +### `SAM.Geometry.OpenStudio` — add (remove `Classes\Test.cs` placeholder) + +```text +Convert/ + ToOpenStudioPoint3d.cs + ToOpenStudioPoint3dVector.cs + ToOpenStudioPolygon.cs + +Query/ + CleanVertices.cs + IsPlanar.cs + SignedArea.cs + IsClockwise.cs + Normal.cs + ValidatePolygon.cs +``` + +Geometry primitives only — this project must not know about spaces, materials, schedules or simulations. + +### `SAM.Analytical.OpenStudio` — add (alongside the existing `Convert\ToSAM\`, `Create\`, `Query\`, `Modify\`) + +```text +Classes/ + OpenStudioConversionContext.cs + OpenStudioConversionResult.cs + OpenStudioModelBuilder.cs + OpenStudioSimulationRunner.cs + OpenStudioLoadSummary.cs + +Convert/ + ToOpenStudio/ + AnalyticalModel.cs + BuildingStory.cs + Space.cs + ThermalZone.cs + Panel.cs + Aperture.cs + Material.cs + Construction.cs + Profile.cs + InternalCondition.cs + SpaceLoads.cs + Thermostat.cs + IdealLoads.cs + Weather.cs + SimulationSettings.cs + +Query/ + OutsideBoundaryCondition.cs + SurfaceType.cs + SubSurfaceType.cs + IsConditioned.cs + ConstructionOrientation.cs + ProfileValues.cs +``` + +### `SAM.Analytical.Grasshopper.OpenStudio` — add (keep existing SQL components) + +```text +AnalyticalModelToOpenStudio +RunOpenStudioModel +OpenStudioLoadResults +``` + +Thin components only: no conversion rules in Grasshopper code. + +### `tests/` — new + +```text +tests/ + SAM.Analytical.OpenStudio.Tests/ // net8.0, x64, NUnit (confirm at M0) + resources/ + weather/ // pinned EPW + DDY, see §11.3 + fixtures/ // serialized SAM fixture models +``` + +--- + +## 7. Conversion context and naming + +Every mapper receives the same context: + +```csharp +public sealed class OpenStudioConversionContext +{ + public AnalyticalModel Source { get; } + public OpenStudio.Model.Model Target { get; } + public OpenStudioConversionOptions Options { get; } + + public IDictionary ObjectMap { get; } + public IDictionary PrimarySurfaceMap { get; } + public IDictionary MaterialMap { get; } + public IDictionary ConstructionMap { get; } + public IDictionary ScheduleMap { get; } + + public IList Diagnostics { get; } +} +``` + +This prevents repeated conversion, duplicate objects, unstable naming, difficult reference resolution, and warnings lost inside extension methods. + +Deterministic names, never OpenStudio-generated handles: + +```text +SAM___ + +SAM_Space_Office_04_72a6f932 +SAM_Surface_Wall_External_b42bd811 +SAM_Construction_ExtWall_2015_195f1c74 +``` + +--- + +## 8. Geometry strategy + +### Coordinates + +* retain SAM global coordinates; metres; no local space transformations; +* all OpenStudio space origins at zero; preserve north separately at building level. + +### Vertex preparation (before creating any surface) + +1. remove consecutive duplicate vertices; +2. remove duplicate closing vertex; +3. remove collinear vertices within tolerance; +4. confirm at least three valid vertices; +5. confirm planarity; +6. check polygon area; +7. orient vertices relative to the SAM space; +8. record every modification as a diagnostic. + +Do not triangulate. Do not auto-repair non-planar polygons — reject with a diagnostic. All tolerances come from `OpenStudioConversionOptions`. + +### Internal panels + +```text +Space A → Surface A +Space B → Surface B +Surface A.adjacentSurface = Surface B +Surface B.adjacentSurface = Surface A +``` + +Reversed vertex order on the opposite side (each normal points out of its own space). **SAM adjacency is the source of truth** — OpenStudio geometric matching may be used only as a validation check. This mirrors the LadybugTools approach (`Room.cs` + `BoundaryCondition.cs`). + +### Two passes + +* **Pass 1 — create**: BuildingStories, Spaces, ThermalZones, Surfaces, SubSurfaces. +* **Pass 2 — resolve**: adjacent surfaces/subsurfaces, boundary conditions, constructions, thermal zones, shading groups. + +Never resolve references while only half the objects exist. + +--- + +## 9. Construction orientation + +Layer convention to verify against SAM (do not assume): `external side → internal side`. + +* External panel → forward construction. +* Internal panel: Surface A → forward; Surface B → reversed. +* Create and cache reversed constructions only when required, keyed: + +```text +ConstructionGuid + ":Forward" +ConstructionGuid + ":Reverse" +``` + +`SAM_LadybugTools` generates both directions (`OpaqueConstructionAbridged.cs`) — read it before implementing, and document SAM's actual layer-order convention in the material mapping doc before coding M4. + +--- + +## 10. Internal conditions, profiles, schedules + +For each unique `InternalCondition`: retrieve scalar parameters and referenced profiles (by `ProfileType` from the model `ProfileLibrary`), convert and cache schedules, create a `SpaceType` with people/lights/equipment definitions plus ventilation and infiltration, assign to every space using that condition; thermostats are assigned per thermal zone. + +**Before coding**, author `docs/SAM_OPENSTUDIO_INTERNAL_CONDITION_MAPPING.md`; for each parameter record: SAM parameter, SAM unit, OpenStudio object, OpenStudio field, conversion formula, missing-value policy, validation range, MVP status. **Units must come from SAM source inspection, never inferred from parameter names.** Same requirement for `docs/SAM_OPENSTUDIO_MATERIAL_MAPPING.md` before M4. + +### Schedule policy (MVP) + +```text +SAM Profile → expanded annual values → OpenStudio ScheduleFixedInterval +``` + +* preserve source timestep; explicitly handle leap years; validate expected value counts; +* assign schedule type limits; cache by profile GUID + semantic usage; +* never silently replace a missing profile with AlwaysOn — diagnostic `SAM-OS-SCH-001`. +* `ScheduleRuleset` compression is a post-MVP optimisation. + +--- + +## 11. Simulation strategy and toolchain + +For each conditioned zone: `ThermostatSetpointDualSetpoint` + `ZoneHVACIdealLoadsAirSystem`. Unconditioned/external zones: thermal zone only, no thermostat, no Ideal Loads. The conditioned-space decision matches existing SAM behaviour (including current treatment of internal-condition names containing `unconditioned`/`external`), centralised in one `Query.IsConditioned`. + +Requested outputs (verify exact names against the EnergyPlus bundled with the selected CLI): + +```text +Zone Ideal Loads Supply Air Total Heating Energy +Zone Ideal Loads Supply Air Total Cooling Energy +Zone Ideal Loads Supply Air Sensible Heating Energy +Zone Ideal Loads Supply Air Sensible Cooling Energy +Zone Mean Air Temperature +Zone Operative Temperature +``` + +Run result: + +```csharp +public sealed class OpenStudioRunResult +{ + public bool Success { get; } + public int ExitCode { get; } + public string OsmPath { get; } + public string OswPath { get; } + public string SqlPath { get; } + public string ErrorFilePath { get; } + public IReadOnlyList SevereErrors { get; } + public IReadOnlyList FatalErrors { get; } + public OpenStudioLoadSummary Loads { get; } +} +``` + +Runner requirements: EPW validation, site from EPW, annual `RunPeriod`, timestep, documented MVP shadow/convection defaults, optional DDY design-day import, OSM save, OSW generation, CLI process execution with timeout and cancellation, run-directory isolation, `eplusout.err` parsing, SQL discovery, structured result. No Rhino/Grasshopper dependency. + +### 11.1 SDK/CLI version gate (decided at M0, recorded in the audit doc) + +Current state: NuGet SDK **3.8.0**; installed CLI+EnergyPlus **3.10.0** (`C:\Program Files\ladybug_tools\openstudio`, bundled C# bindings in `CSharp\`). + +1. **Preferred**: bump NuGet to `OpenStudio 3.10.0` (if published) so SDK matches CLI; rebuild existing results code; run smoke test. +2. **Fallback**: stay on 3.8.0 and rely on the CLI's VersionTranslator (a newer CLI opens an older OSM; the reverse is not true). The M0 smoke test must prove the 3.8.0-SDK-generated OSM round-trips through the 3.10.0 CLI. +3. Local `CSharp\` bindings from the ladybug_tools bundle are a last resort only (hurts CI reproducibility). + +### 11.2 CLI discovery order (implemented in `Query.OpenStudioCliPath`) + +1. Explicit path in `OpenStudioRunOptions`; +2. direct OpenStudio installation (`openstudio` on PATH, then standard install locations); +3. `C:\Program Files\ladybug_tools\openstudio\bin\openstudio.exe` (present on this machine, v3.10.0). + +Missing CLI → structured error `SAM-OS-RUN-001` naming the paths searched — never a silent skip. + +### 11.3 Weather fixture policy (pinned at M0) + +* Location: `tests/resources/weather/` — one EPW + matching DDY (official energyplus.net source; e.g. London Gatwick, ~1.5 MB). +* The audit doc records: exact EPW URL, exact DDY URL, SHA-256 checksums, source and licence, and whether files are committed to the repo (default) or fetched by a setup script. +* Tests must never depend on a mutable external file. + +--- + +## 12. Validation fixtures and semantic assertions + +| Fixture | Purpose | +| --- | --- | +| Single-zone box | Basic geometry and annual run | +| Two adjacent boxes | Internal surface matching | +| Box with window and door | SubSurface conversion | +| Two-level model | BuildingStory assignment | +| Multilayer external wall | Material and layer order | +| Glazed façade | Transparent and gas materials | +| Occupied office | People, lights and equipment | +| Conditioned/unconditioned pair | HVAC assignment rules | +| Irregular planar room | Polygon cleaning | +| Invalid non-planar panel | Diagnostics and failure policy | + +Never compare `.osm` byte-for-byte (handles change). Assert semantics: + +```text +space count · thermal-zone count · surface count · subsurface count +matched-surface count · material count · construction count +floor area · volume · construction layers · schedule values +load densities · setpoint values · weather file · run period +simulation exit code · fatal/severe error count · heating and cooling results +``` + +Plus: conversion-report snapshots, diagnostic-code assertions, deterministic-name assertions, proof that repeated conversion does not mutate the source `AnalyticalModel`, and memory/disposal checks for repeated OpenStudio model creation. + +--- + +## 13. Milestones + +Every milestone ends with: **solution builds + all tests pass + commit + update of `docs/openstudio-mvp-status.md`**. The status file records: current milestone completed, commit SHA, tests executed, known limitations, next milestone, and the SDK and CLI versions selected. + +| M | Scope | Exit gate | +| --- | --- | --- | +| **M0** | Audit existing code (keep/reuse map); SDK/CLI version gate (§11.1); CLI discovery (§11.2); smoke test: instantiate `Model` + `Space` + `ThermalZone` → save OSM → reload → installed CLI opens it, outside Rhino; create `tests/` project; pin weather fixture (§11.3); write `docs/openstudio-mvp-audit.md`; create `docs/openstudio-mvp-status.md` | Smoke test green including CLI round-trip | +| **M1** | Contracts: options, diagnostics, severity, object map, context, result, deterministic naming | Naming/dedup/diagnostic-aggregation/IsValid tests | +| **M2** | Geometry primitives: point/vector/polygon conversion, vertex cleaning, planarity, area, orientation validation | 9 cases: floor, wall, sloped roof, reversed, duplicate vertices, collinear, too-few, non-planar, near-zero area | +| **M3** | Stories, spaces, zones; surfaces in passes A/B/C (create → space-facing panels via `AdjacencyCluster` → explicit adjacency + boundary conditions); apertures/doors/shading (`SubSurface` types, host containment validation, paired internal subsurfaces, optional edge offset per LadybugTools rationale) | Two-box fixture: counts, area/volume vs SAM, paired reversed normals, Outdoors/Ground/Adiabatic/Surface assignment; aperture-in-host tests | +| **M4** | `SAM_OPENSTUDIO_MATERIAL_MAPPING.md` first; opaque/massless/gas/glazing materials (GUID-deduplicated, validated physical values, no hidden defaults); constructions with layer resolution via `MaterialLibrary`, forward/reverse caching, air-boundary handling | Every mapped field unit-tested; layer sequence proven correct on **both** sides of an internal panel | +| **M5** | `SAM_OPENSTUDIO_INTERNAL_CONDITION_MAPPING.md` first; profiles → `ScheduleFixedInterval` (timestep, leap years, type limits, caching); `SpaceType` per unique `InternalCondition`; People/Lights/ElectricEquipment (+definitions), infiltration, outdoor air | Annual-value spot checks across the year; SpaceType dedup (two spaces share one); missing profile → error not AlwaysOn | +| **M6** | Central `IsConditioned`; dual-setpoint thermostats; Ideal Loads per conditioned zone; EPW/site/RunPeriod/timestep/outputs; OSM+OSW save; CLI runner (timeout, isolation, err parsing, SQL discovery); wire existing SQL readers for load extraction | **First E2E** on one-zone fixture: exit 0; no fatal/severe errors; annual heating ≥ 0 AND cooling ≥ 0 AND at least one > 0; zone-level result count == conditioned-zone count; SQL units validated and documented. Zeros-only output **fails** this gate | +| **M7** | Full 10-fixture regression suite (§12) with semantic assertions; no-source-mutation and disposal checks | All fixtures green | +| **M8** | Thin Grasshopper components (`AnalyticalModelToOpenStudio`, `RunOpenStudioModel`, `OpenStudioLoadResults`); native-DLL packaging for net8; workflow docs; self-check against §4 | Solution + components build; MVP checklist table completed in status file | + +### Mandatory pre-PR gate — Rhino 8 smoke test + +```text +Rhino 8 starts +Grasshopper loads the GHA +The OpenStudio components appear +A one-zone model converts without native-DLL loading errors +``` + +A solution build alone does not prove x64 native deployment — this is one of the largest project risks. Comprehensive Rhino 8/9 testing remains follow-up after the PR. + +Before the PR into `sow/2026-Q3`: the full test suite passes, at least three complete EnergyPlus simulations have run from the fixture set, and the smoke test above has passed. + +--- + +## 14. Branch and commit structure + +```text +base: sow/2026-Q3 (always; also the PR target) +feature: feature/analytical-model-to-openstudio-mvp +``` + +One commit per milestone (each must build and pass all tests introduced so far): + +```text +M0 docs: audit OpenStudio toolchain and existing conversion code +M1 feat: add OpenStudio conversion contracts and diagnostics +M2 feat: convert SAM geometry primitives to OpenStudio +M3 feat: convert spaces zones stories surfaces and apertures +M4 feat: convert analytical materials and constructions +M5 feat: convert profiles internal conditions and space loads +M6 feat: assign thermostats ideal loads and add simulation runner +M7 test: add SAM OpenStudio MVP regression fixtures +M8 feat: expose OpenStudio conversion in Grasshopper and document workflow +``` + +Review-fix commits: `fix: (review P0/P1-)`, each with its regression test. + +--- + +## 15. Estimates, risks, follow-ups + +* Estimate ≈ **2–4 days** calendar, including independent review and the fix round — replacing the original 25–36 engineering-day phased estimate. +* Highest risks: SDK/CLI version gate outcome (§11.1); x64 native deployment into Rhino 8 (mitigated by the mandatory smoke test); SAM internal-condition units (mitigated by mapping docs); profile calendar semantics (leap years, timestep). +* Follow-on projects (unchanged): AirSystem/detailed HVAC (Roadmap Phase 5), TAS-vs-OpenStudio validation harness (Roadmap Phase 3), AI-assisted QA (Roadmap Phase 4), richer results import, `ScheduleRuleset` compression. diff --git a/docs/SAM_Simulation_Engine_Roadmap.md b/docs/SAM_Simulation_Engine_Roadmap.md new file mode 100644 index 0000000..6311894 --- /dev/null +++ b/docs/SAM_Simulation_Engine_Roadmap.md @@ -0,0 +1,1097 @@ +# SAM Simulation Engine Roadmap + +**Status:** Draft +**Last reviewed:** 2026-07-01 +**Repository:** `SAM-BIM/SAM_OpenStudio` +**Target branch:** `sow/2026-Q3` +**Audience:** SAM contributors, computational engineering team, MEP simulation developers +**Scope:** Strategic roadmap for extending SAM beyond the current TAS EDSL simulation route while keeping TAS as the production-grade engine. + +--- + +## 1. Executive Summary + +SAM currently benefits from a strong integration with **TAS EDSL**, mainly because TAS is fast, mature, practical to automate from C#, and already aligned with established project workflows. + +The recommendation is **not** to replace TAS. Instead, SAM should move toward a **multi-engine simulation architecture**: + +```text +SAM AnalyticalModel + | + v +SAM Simulation Abstraction + | + v + +-------------+----------------+---------------------+ + | SAM_Tas | SAM_OpenStudio | Future: Modelica/FMI | + | production | open validation| controls / MPC | + +-------------+----------------+---------------------+ +``` + +The strategic goal is to make SAM **engine-independent**. + +TAS should remain the main production route. OpenStudio and EnergyPlus should become the open, research-aligned, AI-friendly, validation-capable route. Modelica/FMI-based workflows should be monitored and prepared for longer-term advanced HVAC, controls, model predictive control, and digital twin use cases. + +--- + +## 2. Strategic Position + +### 2.1 Keep TAS as the production engine + +TAS should remain the main production simulation backend for SAM where the priority is: + +- speed; +- reliability; +- established project workflows; +- UK compliance familiarity; +- current SAM integration; +- direct API access from C#; +- practical model exchange with existing engineering processes. + +### 2.2 Add OpenStudio/EnergyPlus as a second simulation backend + +OpenStudio and EnergyPlus should be introduced as a parallel route where the priority is: + +- open-source transparency; +- academic and research alignment; +- repeatable validation; +- AI-assisted model generation and QA; +- public benchmark comparisons; +- easier collaboration with external research partners; +- support for OpenStudio Measures and parametric workflows. + +OpenStudio is especially relevant for this repository because the OpenStudio SDK exposes model workflows through C#, while EnergyPlus provides the underlying whole-building simulation engine. + +### 2.3 Prepare for Modelica/FMI later + +Modelica/FMI should not be the first implementation priority, but SAM should be designed so that this route remains possible later. + +This matters for: + +- detailed HVAC system dynamics; +- control strategy testing; +- model predictive control; +- digital twins; +- co-simulation; +- advanced plant and control logic; +- integration with BOPTEST-style benchmarking. + +--- + +## 3. Recommended Architecture + +SAM should define a neutral simulation contract that sits above individual engines. + +```text +SAM AnalyticalModel + | + v +SAM Simulation Intent + | + v +Engine Adapter + | + v +Simulation Engine + | + v +SAM Results +``` + +### 3.1 Core simulation contract + +The engine-neutral contract should describe the engineering intent before it is translated into engine-specific objects. + +Minimum contract: + +- analytical model; +- location and weather; +- spaces and zones; +- geometry; +- constructions; +- apertures; +- shading; +- schedules; +- internal gains; +- infiltration; +- ventilation; +- HVAC intent; +- simulation settings; +- output requests; +- warnings and errors; +- result schema. + +### 3.2 Adapter responsibilities + +Each engine adapter should be responsible for: + +- translating SAM objects into engine-specific inputs; +- recording assumptions made during translation; +- exposing unsupported features clearly; +- running or preparing simulations; +- collecting results; +- mapping results back into SAM result objects; +- producing QA/QC messages. + +### 3.3 Proposed adapters + +```text +SAM_Tas + Current production adapter. + +SAM_OpenStudio + Higher-level OpenStudio SDK route using model objects, measures, standards workflows, + and EnergyPlus translation. + +SAM_EnergyPlus + Lower-level direct EnergyPlus route using IDF or epJSON where direct control is better. + +SAM_FMI / SAM_Modelica + Future route for controls, dynamic systems, co-simulation, and model predictive control. +``` + +--- + +## 4. Roadmap Summary + +| Phase | Theme | Main outcome | +|---|---|---| +| Phase 1 | Minimal OpenStudio/EnergyPlus proof of concept | Generate a valid OpenStudio/EnergyPlus model from SAM for simple zone loads — **done (MVP, PR #7)** | +| Phase 2 | OpenStudio adapter structure | Establish reusable C# adapter classes and model translation rules — **done (analytical completeness programme, see `openstudio-analytical-completeness-status.md`: full non-HVAC `AnalyticalModel` translation with enforced coverage, results mapping and cancellable execution)** | +| Phase 3 | Validation harness | Compare SAM_Tas and SAM_OpenStudio/EnergyPlus results consistently | +| Phase 4 | AI-assisted QA and model intelligence | Use AI to inspect, explain, repair, and document simulation models safely | +| Phase 5 | Advanced HVAC, controls, Modelica/FMI | Prepare SAM for dynamic controls, co-simulation, MPC, and digital twin workflows | + +--- + +## 5. Phase 1 - SAM_OpenStudio / EnergyPlus Proof of Concept + +### Goal + +Create a minimal working route from SAM AnalyticalModel to an OpenStudio/EnergyPlus simulation. + +### Scope + +Start deliberately small. Avoid detailed HVAC initially. + +Include: + +- one or more spaces/zones; +- basic geometry; +- opaque constructions; +- windows and doors; +- weather file reference; +- simple internal gains; +- simple schedules; +- infiltration or outdoor air assumptions; +- ideal loads air system; +- annual heating and cooling load outputs. + +### Deliverables + +- `SAM AnalyticalModel -> OpenStudio Model` prototype. +- EnergyPlus simulation run from generated OpenStudio model. +- Basic result extraction back to SAM objects. +- Clear assumptions report. +- Minimal validation example. + +### Acceptance criteria + +- A simple SAM test model can generate a valid OpenStudio model. +- The generated model can be translated and simulated by EnergyPlus. +- Annual heating and cooling loads can be read back into SAM. +- Translation assumptions are visible to the user or developer. + +### Risks + +- Geometry translation mismatches. +- Difference between TAS and EnergyPlus thermal assumptions. +- Oversimplified HVAC leading to misleading comparison. +- Weather and design-day handling differences. + +--- + +## 6. Phase 2 - Adapter Structure and OpenStudio SDK Integration + +### Goal + +Move from proof of concept to a maintainable adapter structure. + +### Scope + +Define a clear C# architecture for OpenStudio model generation. + +Suggested namespaces/classes: + +```text +SAM.OpenStudio +SAM.OpenStudio.Convert +SAM.OpenStudio.Create +SAM.OpenStudio.Query +SAM.OpenStudio.Run +SAM.OpenStudio.Results +SAM.OpenStudio.Validation +``` + +Possible high-level classes: + +```text +OpenStudioSimulationSettings +OpenStudioTranslationOptions +OpenStudioTranslationReport +OpenStudioUnsupportedFeature +OpenStudioResult +OpenStudioResultReader +OpenStudioSimulationRunner +``` + +### Work packages + +#### 6.1 Translation options + +Define options for: + +- simulation period; +- timestep; +- design-day handling; +- weather file path; +- ideal loads vs detailed HVAC; +- solar distribution; +- surface matching tolerance; +- output variables; +- result frequency. + +#### 6.2 Translation report + +Every export should produce a report containing: + +- created OpenStudio objects; +- skipped SAM objects; +- approximated assumptions; +- unsupported features; +- warnings; +- fatal errors. + +#### 6.3 Model generation conventions + +Define stable naming conventions for generated objects: + +```text +SAM Space -> OpenStudio Space +SAM Zone -> OpenStudio ThermalZone +SAM Panel -> OpenStudio Surface +SAM Aperture -> OpenStudio SubSurface +SAM Material -> OpenStudio Material +SAM Construction -> OpenStudio Construction +``` + +#### 6.4 Result schema + +Define a SAM result schema that is independent of OpenStudio/EnergyPlus output file formats. + +Minimum outputs: + +- annual heating load; +- annual cooling load; +- peak heating load; +- peak cooling load; +- zone air temperature; +- zone operative temperature, if available; +- unmet hours; +- solar gains; +- ventilation/infiltration load contribution, where available. + +### Deliverables + +- Reusable adapter classes. +- Translation report object. +- Result object model. +- Unit tests for translation of geometry, constructions, schedules, and loads. +- Example model committed to the repository. + +### Acceptance criteria + +- The adapter can translate repeated test cases without manual intervention. +- Unsupported features are reported rather than silently ignored. +- Generated names are stable between runs. +- Results can be compared across simulation engines through a common SAM schema. + +--- + +## 7. Phase 3 - Validation Harness + +### Goal + +Create a repeatable comparison framework between SAM_Tas and SAM_OpenStudio/EnergyPlus. + +### Scope + +The validation harness should compare selected models using controlled assumptions. + +Initial comparison set: + +```text +Case 01 - Single box, no windows +Case 02 - Single box with glazing +Case 03 - Multi-zone model +Case 04 - Shading-sensitive model +Case 05 - Lightweight vs heavyweight construction +Case 06 - High infiltration case +Case 07 - Internal gains and schedules +Case 08 - Weather sensitivity case +``` + +### Comparison metrics + +- annual heating load; +- annual cooling load; +- peak heating load; +- peak cooling load; +- hourly zone temperature; +- unmet hours; +- solar gains; +- ventilation loads; +- simulation runtime; +- warning/error count. + +### Deliverables + +- Validation test models. +- Automated comparison runner. +- Tolerance definition by metric. +- Result dashboard or Markdown report. +- Regression baseline. + +### Acceptance criteria + +- Validation can be run by developers without manual setup beyond documented dependencies. +- Differences between engines are classified as expected, suspicious, or failing. +- Each comparison includes an explanation of known modelling differences. + +--- + +## 8. Phase 4 - AI-Assisted QA and Model Intelligence + +### Goal + +Use AI to make simulation workflows more transparent, faster to debug, and easier to validate, while keeping deterministic SAM validation as the source of truth. + +AI should assist the engineer. It should not become the authority that decides whether a model is correct. + +Recommended control pattern: + +```text +AI proposes -> SAM validates -> Engine runs -> Tests compare -> Engineer approves +``` + +### 8.1 Why this phase matters + +OpenStudio and EnergyPlus are well suited to AI-assisted workflows because their inputs and outputs are highly structured and text/schema based. This makes it realistic to ask AI to inspect generated models, read warnings, propose corrections, generate reports, and explain differences between simulation engines. + +For SAM, this phase could become a major differentiator: engineers would not only run simulations, they would receive an explainable QA report describing the model, assumptions, risks, warnings, and likely reasons for unexpected results. + +### 8.2 Core AI use cases + +#### 8.2.1 Model QA summary + +Generate a human-readable summary of the model before simulation: + +- number of spaces and zones; +- floor area; +- exposed facade area; +- glazing ratio; +- construction assumptions; +- internal gains; +- schedules; +- ventilation and infiltration assumptions; +- HVAC simplifications; +- simulation period; +- missing or defaulted inputs. + +Expected output: + +```text +This model contains 24 SAM spaces mapped to 18 OpenStudio thermal zones. +12 apertures have no explicit frame construction and will use the default glazing assumption. +5 internal partitions were treated as adiabatic because no adjacent zone was resolved. +``` + +#### 8.2.2 Translation QA + +AI can review the `OpenStudioTranslationReport` and produce a clearer engineering explanation. + +Examples: + +- explain unsupported features; +- highlight approximations; +- group repeated warnings; +- separate fatal issues from acceptable assumptions; +- suggest what the engineer should check before trusting results. + +This should sit on top of deterministic validation rules, not replace them. + +#### 8.2.3 EnergyPlus warning and error interpretation + +EnergyPlus often produces detailed warnings that are useful but hard to interpret quickly. + +AI can help by: + +- grouping repeated warnings; +- identifying likely root causes; +- identifying whether warnings are geometry, material, weather, sizing, HVAC, or output related; +- suggesting likely SAM-side fixes; +- linking warnings back to SAM object names where possible. + +Example categories: + +```text +Geometry issue +Construction/material issue +Schedule issue +Weather/design-day issue +HVAC sizing issue +Output request issue +Simulation convergence issue +``` + +#### 8.2.4 Result explanation + +AI can compare results and explain them in engineering language: + +- why one zone has high peak cooling; +- why heating demand increased after a construction change; +- why TAS and EnergyPlus results diverge; +- whether a result looks plausible compared with model inputs; +- which assumptions are most likely driving the result. + +#### 8.2.5 Automatic assumptions report + +Generate a report suitable for project records: + +- model source; +- simulation engine; +- assumptions made during translation; +- limitations; +- outputs requested; +- known unsupported features; +- validation status; +- warnings requiring engineering review. + +#### 8.2.6 Model repair suggestions + +AI can propose fixes, but SAM should apply them only through controlled rules or explicit engineer approval. + +Examples: + +- assign missing default construction; +- fix missing schedule reference; +- detect orphan spaces; +- detect invalid surface orientation; +- detect unrealistic infiltration values; +- suggest grouping tiny zones; +- suggest adding design days. + +The repair workflow should be explicit: + +```text +Detect issue -> Propose fix -> Show impact -> Apply only if approved -> Re-run validation +``` + +#### 8.2.7 Prompt-to-study workflows + +Enable natural-language study setup while keeping structured SAM settings underneath. + +Example prompts: + +```text +Run three glazing ratios: 30%, 40%, and 50%. +Compare annual cooling load and peak cooling. +Keep all other assumptions unchanged. +``` + +SAM should convert this to structured parametric instructions, not rely on free-form text during execution. + +#### 8.2.8 Regression and change explanation + +When a pull request changes model generation logic, AI can summarize: + +- what changed in generated OpenStudio objects; +- which validation cases moved; +- whether changes are expected; +- which tests need review. + +This is especially useful when comparing generated `.osm`, `.idf`, `.epJSON`, `.sql`, or result summaries. + +### 8.3 Proposed technical design + +#### 8.3.1 Structured first, AI second + +Create machine-readable outputs first: + +```text +OpenStudioTranslationReport.json +SimulationWarnings.json +SimulationResultsSummary.json +ValidationComparison.json +Assumptions.json +``` + +AI should consume these structured files and generate explanations. + +This avoids asking AI to infer everything from raw simulation files. + +#### 8.3.2 Deterministic validation layer + +Before AI interpretation, SAM should run deterministic checks: + +- missing weather; +- zero or negative area; +- unassigned construction; +- invalid schedule values; +- duplicated names; +- disconnected thermal zones; +- apertures without host surfaces; +- impossible infiltration values; +- suspicious glazing ratios; +- missing output requests. + +#### 8.3.3 AI explanation layer + +AI can then produce: + +- engineering summary; +- warning digest; +- assumptions report; +- likely cause analysis; +- suggested next actions; +- comparison commentary. + +#### 8.3.4 Human approval layer + +Any automated model repair should require: + +- list of proposed changes; +- affected SAM objects; +- previous value; +- proposed value; +- reason; +- expected impact; +- approval before application. + +### 8.4 Suggested implementation work packages + +#### WP4.1 - Translation report schema + +Create a stable schema for all assumptions, warnings, skipped objects, approximations, and unsupported features. + +Deliverables: + +- `OpenStudioTranslationReport` object; +- JSON export; +- Markdown export; +- unit tests. + +#### WP4.2 - Warning parser + +Parse EnergyPlus/OpenStudio warnings and map them back to SAM/OpenStudio objects where possible. + +Deliverables: + +- warning parser; +- warning categories; +- severity classification; +- object-name matching strategy; +- example warning library. + +#### WP4.3 - QA rules engine + +Create deterministic QA checks before and after simulation. + +Deliverables: + +- pre-simulation checks; +- post-simulation checks; +- severity levels; +- developer-facing test cases; +- engineer-facing report output. + +#### WP4.4 - AI report generator + +Generate a readable report from structured QA data. + +Deliverables: + +- model summary report; +- assumptions report; +- warning explanation report; +- result interpretation report; +- validation comparison report. + +#### WP4.5 - Safe model repair workflow + +Allow AI-suggested repairs only when they can be represented as explicit structured changes. + +Deliverables: + +- proposed-change object model; +- approval workflow; +- before/after diff; +- revalidation trigger; +- audit trail. + +#### WP4.6 - Pull request QA assistant + +For repository changes, generate a simulation-impact summary. + +Deliverables: + +- changed test cases summary; +- generated model diff summary; +- result movement summary; +- suspected cause commentary; +- checklist for reviewer. + +### 8.5 Example Phase 4 outputs + +```text +/qa/model-summary.md +/qa/translation-report.json +/qa/translation-report.md +/qa/energyplus-warnings.json +/qa/energyplus-warnings.md +/qa/simulation-assumptions.md +/qa/validation-comparison.md +/qa/proposed-repairs.json +``` + +### 8.6 Acceptance criteria + +- AI reports are generated only from structured SAM/OpenStudio/EnergyPlus outputs. +- Deterministic validation runs before AI interpretation. +- Unsupported features are never hidden. +- AI suggestions are labelled as suggestions, not facts. +- Any model repair requires explicit approval or a deterministic rule. +- Reports are useful to MEP engineers and avoid unnecessary developer jargon. +- The same input model produces repeatable structured QA outputs. + +### 8.7 Risks and mitigations + +| Risk | Mitigation | +|---|---| +| AI invents unsupported assumptions | AI consumes structured reports only; deterministic checks remain source of truth | +| Engineers over-trust AI explanations | Reports clearly separate measured result, deterministic warning, and suggested interpretation | +| Warning parsing is brittle | Maintain a warning library with regression tests | +| Model repair changes results unexpectedly | Use before/after diff, approval, and automatic revalidation | +| Reports become too verbose | Provide summary, detailed, and developer modes | + +--- + +## 9. Phase 5 - Advanced HVAC, Controls, Modelica/FMI, and Digital Twin Readiness + +### Goal + +Prepare SAM for advanced simulation workflows beyond static annual loads and idealised HVAC, including detailed HVAC, dynamic controls, co-simulation, model predictive control, and digital twin workflows. + +This phase should begin only after the core OpenStudio/EnergyPlus route and validation framework are stable. + +### 9.1 Why this phase matters + +Most early building energy workflows focus on geometry, fabric, internal gains, schedules, and ideal loads. That is enough for early design, benchmarking, and many comparative studies. + +However, future workflows will increasingly need: + +- control logic; +- plant behaviour; +- transient system response; +- operational calibration; +- sensor feedback; +- demand response; +- grid interaction; +- model predictive control; +- fault detection; +- digital twin integration. + +These topics are difficult to represent cleanly in a simple static export. SAM should therefore separate **building simulation intent** from **control/system simulation intent**. + +### 9.2 Strategic direction + +Phase 5 should not try to implement everything directly inside SAM. Instead, SAM should become the coordinator that can prepare, connect, and validate models across specialist engines. + +Recommended future structure: + +```text +SAM AnalyticalModel + | + +--> OpenStudio/EnergyPlus envelope and zone loads + | + +--> Modelica/FMI system and control model + | + +--> BOPTEST-style control benchmark + | + +--> Operational data / digital twin feedback + | + v +SAM Results and QA +``` + +### 9.3 Candidate technology routes + +#### 9.3.1 Detailed OpenStudio/EnergyPlus HVAC + +Use OpenStudio/EnergyPlus for more detailed HVAC where it is sufficient and practical. + +Candidate scope: + +- air loops; +- plant loops; +- coils; +- heat pumps; +- boilers; +- chillers; +- heat recovery; +- terminal units; +- setpoint managers; +- sizing parameters; +- HVAC templates or standards-based generation. + +This is likely the most practical next step after ideal loads. + +#### 9.3.2 Modelica and FMI + +Use Modelica/FMI where dynamic systems and controls are more important than conventional annual energy simulation. + +Candidate scope: + +- plant-room dynamics; +- control sequences; +- thermal storage; +- heat pump behaviour; +- district energy networks; +- supervisory control; +- co-simulation; +- model predictive control testing. + +SAM should not need to become a Modelica authoring tool. It should provide enough structured information to generate or parameterise external system models. + +#### 9.3.3 Spawn-style workflows + +Monitor Spawn-style workflows where EnergyPlus envelope/zone simulation is coupled with Modelica-based HVAC and controls. + +Potential value: + +- keep EnergyPlus strengths for building envelope and loads; +- use Modelica strengths for system dynamics and controls; +- support co-simulation and control experiments. + +#### 9.3.4 BOPTEST-style benchmarking + +BOPTEST-style workflows are relevant for control testing and comparison. + +Potential SAM use: + +- prepare benchmark model metadata; +- define control inputs and outputs; +- run controller tests; +- compare control strategies; +- document reproducible control experiments. + +#### 9.3.5 Operational data and digital twins + +Longer term, SAM could help connect simulation models to measured data. + +Candidate scope: + +- sensor mapping; +- metered data mapping; +- weather normalisation; +- calibration inputs; +- fault detection context; +- performance drift reporting; +- comparison between simulated and measured behaviour. + +### 9.4 Required SAM abstractions + +Before implementing advanced engines, SAM should define additional abstractions. + +#### 9.4.1 HVAC intent model + +Describe HVAC intent without binding it immediately to a specific engine. + +Possible concepts: + +```text +System type +Served zones +Heating source +Cooling source +Ventilation strategy +Heat recovery +Terminal type +Control setpoints +Operating schedules +Sizing assumptions +Efficiency assumptions +``` + +#### 9.4.2 Control intent model + +Describe controls as structured intent. + +Possible concepts: + +```text +Controlled variable +Sensor location +Actuator +Setpoint +Deadband +Schedule +Priority +Fallback condition +Control mode +``` + +#### 9.4.3 Co-simulation interface + +Define how SAM would exchange information with external engines. + +Possible concepts: + +```text +Input variables +Output variables +Units +Time step +Warm-up period +Simulation horizon +Initial conditions +Error handling +Result synchronisation +``` + +#### 9.4.4 Operational data mapping + +Define how measured data relates to SAM simulation objects. + +Possible concepts: + +```text +Sensor ID +Measured quantity +Unit +SAM object reference +Location +Aggregation interval +Data quality flag +Time zone +Source system +``` + +### 9.5 Suggested implementation work packages + +#### WP5.1 - HVAC intent schema + +Create a neutral HVAC intent schema that can later be translated into OpenStudio, EnergyPlus, Modelica, or other engines. + +Deliverables: + +- HVAC intent object model; +- supported system taxonomy; +- mapping to ideal loads; +- mapping to simple OpenStudio HVAC; +- unsupported feature reporting. + +#### WP5.2 - Detailed OpenStudio HVAC prototype + +Extend the OpenStudio adapter beyond ideal loads. + +Candidate first systems: + +- ideal loads air system with enhanced reporting; +- packaged single-zone system; +- simple variable air volume system; +- heat pump loop, if aligned with project needs; +- heat recovery ventilation, if aligned with project needs. + +Deliverables: + +- system selection options; +- generated OpenStudio HVAC objects; +- HVAC sizing settings; +- HVAC result extraction; +- validation cases. + +#### WP5.3 - Control intent schema + +Define how controls are represented in SAM before mapping to any specific simulation tool. + +Deliverables: + +- control intent object model; +- setpoint schedule model; +- sensor/actuator references; +- rule-based control examples; +- limitations report. + +#### WP5.4 - FMI feasibility study + +Create a small feasibility test for exchanging data with an FMI-compatible workflow. + +Deliverables: + +- candidate use case; +- input/output variable list; +- data exchange test; +- time-step sensitivity notes; +- recommendation on whether to continue. + +#### WP5.5 - Modelica/Spawn feasibility study + +Assess whether SAM should generate, parameterise, or simply reference Modelica-based models. + +Deliverables: + +- candidate system model; +- parameter mapping from SAM; +- result mapping back to SAM; +- comparison with EnergyPlus HVAC route; +- recommendation for next stage. + +#### WP5.6 - BOPTEST-style controller benchmark + +Investigate whether SAM can prepare model metadata and result comparison for controller benchmarking. + +Deliverables: + +- control benchmark use case; +- input/output mapping; +- baseline controller; +- comparison metrics; +- report template. + +#### WP5.7 - Digital twin data mapping prototype + +Prepare a minimal link between SAM model objects and measured operational data. + +Deliverables: + +- sensor-to-SAM mapping schema; +- measured vs simulated comparison output; +- data quality flags; +- calibration notes; +- drift report example. + +### 9.6 Phase 5 validation metrics + +Additional metrics beyond Phase 3: + +- HVAC energy by end use; +- fan and pump energy; +- plant efficiency; +- heat recovery effectiveness; +- unmet hours by control mode; +- control stability; +- actuator movement/count; +- peak demand; +- demand response performance; +- measured vs simulated error; +- calibration error metrics, where relevant. + +### 9.7 Acceptance criteria + +- SAM can describe HVAC intent without locking the model to one engine. +- A simple detailed HVAC OpenStudio example can run and return results. +- Unsupported HVAC/control features are reported clearly. +- At least one co-simulation or FMI feasibility test is documented. +- Control inputs and outputs are represented with explicit units and time steps. +- Digital twin work remains separate from core design simulation until proven. +- Phase 5 features do not destabilise the simpler Phase 1 to 3 workflows. + +### 9.8 Risks and mitigations + +| Risk | Mitigation | +|---|---| +| Detailed HVAC scope becomes too large | Start with a small number of common systems and keep unsupported reporting explicit | +| Engine-specific HVAC logic pollutes SAM core | Keep HVAC intent neutral and place engine mapping inside adapters | +| Controls require dynamic simulation expertise | Treat Modelica/FMI/BOPTEST as specialist routes with feasibility gates | +| Co-simulation is hard to test | Begin with one small benchmark case and strict input/output definitions | +| Digital twin ambition grows too early | Keep operational-data mapping as a separate prototype until validated | +| Results from different engines diverge | Use documented assumptions, validation cases, and metric-specific tolerances | + +--- + +## 10. Suggested Repository Structure + +Possible structure for this repository as the roadmap matures: + +```text +/docs + SAM_Simulation_Engine_Roadmap.md + OpenStudio_Translation_Assumptions.md + OpenStudio_Validation_Methodology.md + +/examples + single-zone-box + glazing-ratio-study + multi-zone-model + +/src + SAM.OpenStudio + SAM.OpenStudio.Grasshopper + SAM.OpenStudio.Tests + +/validation + cases + baselines + reports +``` + +--- + +## 11. Near-Term Recommendations + +Recommended next actions: + +1. Keep TAS as the production route. +2. Build a minimal `SAM -> OpenStudio -> EnergyPlus -> SAM Results` path. +3. Limit the first scope to ideal loads and simple zone-level outputs. +4. Create translation reports from day one. +5. Create validation cases before adding detailed HVAC. +6. Add AI only after structured reports and deterministic checks exist. +7. Prepare HVAC/control abstractions before committing to Modelica/FMI. + +--- + +## 12. Decision Log + +| Decision | Recommendation | Reason | +|---|---|---| +| Replace TAS? | No | TAS remains fast and practical for current SAM workflows | +| Add OpenStudio/EnergyPlus? | Yes | Open, research-aligned, AI-friendly, validation-capable | +| Start with detailed HVAC? | No | Too much complexity before geometry, loads, and validation are stable | +| Use AI directly to modify models? | No | AI should propose; SAM should validate; engineers should approve | +| Prepare for Modelica/FMI? | Yes, later | Important for controls, MPC, digital twins, and co-simulation | + +--- + +## 13. External References + +Reference links to review while implementing this roadmap: + +- OpenStudio website: +- OpenStudio SDK repository: +- OpenStudio Measure Writer's Reference Guide: +- EnergyPlus documentation: +- EnergyPlus C API: +- EnergyPlus Python API: +- EnergyPlus epJSON schema: + +--- + +## 14. Bottom Line + +The strategic position should be: + +> TAS remains SAM's fast production simulation route. OpenStudio/EnergyPlus becomes SAM's open, research-aligned, AI-friendly, validation-capable second engine. The real asset is not either engine; the real asset is SAM's neutral analytical model and simulation abstraction. + +This gives SAM resilience: commercial reliability from TAS, academic credibility from EnergyPlus/OpenStudio, and a future route toward AI-assisted simulation, advanced controls, and digital-twin workflows. diff --git a/docs/openstudio-analytical-completeness-review.md b/docs/openstudio-analytical-completeness-review.md new file mode 100644 index 0000000..d98e9e9 --- /dev/null +++ b/docs/openstudio-analytical-completeness-review.md @@ -0,0 +1,498 @@ +# SAM → OpenStudio Analytical Completeness v1 — independent review + +**Reviewer:** independent senior C# building-performance engineer (correction engineer for confirmed findings) +**Date:** 2026-07-20 +**Branch:** `feature/openstudio-analytical-completeness` (base `sow/2026-Q3` @ `bf75bf3`, merged MVP) +**Milestones under review:** C0 `b138a65` … C7 `d1fc7fd` (eight commits, inspected individually) +**Method:** every claim in [openstudio-analytical-completeness-status.md](openstudio-analytical-completeness-status.md) +treated as unverified until reproduced. All changed production and test files read in full; the +279-entry coverage manifest re-counted and cross-checked against the Markdown document and the +live SAM enums; SAM sibling sources (READ-ONLY) consulted for units, load-query semantics and +the TAS north-angle convention; five complete EnergyPlus simulation scenarios (eight CLI runs) +reproduced independently of the test suite through a standalone console driver. + +--- + +## 1. Executive summary + +The programme substantially delivers what it claims: the build and the 146/146 suite reproduce +exactly, the coverage manifest counts are correct and in lockstep with the Markdown document, +the fenestration/frame geometry is numerically exact against EnergyPlus output, the annual +environment-period filter provably excludes sizing days, north rotation behaves per the +SAM_Tas convention, the humidistat wiring has a material and physically correct effect on +results, and the cancellation/process-tree-kill machinery is real. + +Three P1 findings were confirmed by reproduction — all three in the newest (C2–C5) layers: + +| ID | Priority | Finding | Status | +| --- | --- | --- | --- | +| P1-01 | P1 | Eighteen coverage-manifest rows declare structured diagnostics that no converter ever emits (false completeness: view coefficients, lighting control function, internal-shadow flags, panel feature shades, vapour diffusion factor, opaque internal-optics divergence, emitter and exhaust parameters) | **Fixed** (Stage L, §8) | +| P1-02 | P1 | The default DDY design-day filter (`"99.6%"`/`"0.4%"`) imports **no cooling design day** (ASHRAE DDYs name them `Ann Clg .4% …`) and wrongly imports humidification (`Hum_n`) and wind (`Htg Wind`) 99.6% days | **Fixed** (Stage L, §8) | +| P1-03 | P1 | Leap-year runs: SQL hour-of-year uses a fixed non-leap reference year, so Feb 29 rows clamp onto Feb 28 (duplicate hour keys double-count the coincident peak) and all post-February peak hours shift by one day | **Fixed** (Stage L, §8) | +| P2-01 | P2 | The C7 completeness test does not implement the stale-manifest-id detection the coverage document claims | **Fixed** (Stage L, §8) — the new check immediately caught 2 real stale rows | +| P2-02 | P2 | `OutputVariableFrequency` ≠ Hourly silently mis-scales extracted peaks (fixed 3600 s interval assumption) | **Mitigated** (Stage L, §8); frequency-aware extraction stays follow-up | +| P2-03 | P2 | SAM `Location` site override writes non-finite/out-of-range coordinates into `OS:Site` unvalidated | **Fixed** (Stage L, §8) | +| P2-04 | P2 | Standalone `Run(path, …)` ignores `UseUniqueRunDirectory` for `.osw` inputs and has no collision lock on that path | **Open (follow-up)** — needs an OSW-rewrite design; not fixed here | +| P2-05 | P2 | Grasshopper: removing the component or closing the document does not cancel a running simulation; the completion callback can target a disposed document | **Fixed** (Stage L, §8) — compile-verified; runtime on the human Rhino checklist (§10 step 5) | +| P2-06 | P2 | Encoding corruption: coverage Markdown carries double-encoded arrows (`→`); the JSON manifest carries a raw CP1252 byte (invalid UTF-8) | **Fixed** (Stage L, §8) — full byte scan repaired 16 MD sequences + the JSON byte | + +No P0 finding exists: nothing crashes, corrupts an *annual* result in the shipped default +configuration, mutates sources, leaks processes or endangers the repository. P1-02 and P1-03 +corrupt *sizing/peak* semantics only under the design-day and leap-year options respectively; +P1-01 breaks the programme's own "nothing silently dropped" contract. + +## 2. Reproduced baseline (Stage B) + +| Item | Claimed | Reproduced | +| --- | --- | --- | +| Restore | — | `dotnet restore SAM_OpenStudio.sln` — up to date | +| Build | clean, 0 errors | `dotnet build -c Debug -p:Platform=x64 -m:1` — **0 errors**, only the pre-existing benign MSB3277 System.Memory warning (×2 projects) | +| Tests | 146/146 | **146/146 passed, 0 skipped**, duration 1 m 28 s (89.2 s wall clock) | +| Simulation tests | ~30 E+ runs | 20 `[Category("Simulation")]` test methods, several multi-run — consistent with ~30 CLI executions; suite duration (~90 s vs ~20 s conversion-only) confirms they executed | +| OpenStudio SDK | NuGet 3.10.0 | confirmed in all three library csproj files | +| OpenStudio CLI | 3.10.0+86d7e215a1 | `openstudio openstudio_version` at `C:\Program Files\ladybug_tools\openstudio\bin\openstudio.exe` | +| EnergyPlus | — | **25.1.0-1c11a3d85f** (bundled) | +| Coverage manifest | 279 entries; N135/D28/A21/U20/Def17/NA58 | **Reproduced exactly** (script count); 0 duplicate ids; MD ↔ JSON ids identical (279 ↔ 279, no drift in either direction). *Stage L correction: 2 of the 279 turned out to be stale (P2-01) — final manifest 277 entries, NA 56* | +| Sibling repositories | untouched | `git status` clean in SAM, SAM_LadybugTools, SAM_UI, SAM_SQLite, SAM_Tas | +| Committed artifacts | none | diff contains only source/docs/tests; no binaries, run outputs or machine paths | + +### Independent simulation reproduction (standalone driver, outside the test suite) + +Eight CLI runs across five scenarios; every run: exit 0, 0 fatal, 0 severe, SQL present, +result-zone count = conditioned-zone count. + +| # | Scenario / fixture | Env. periods | Zones | Heating kWh | Cooling kWh | Peak H / C kW (@h) | Runtime | Semantic evidence | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 1 | Latent + humidistat (SingleBox, latent 5 W/m², RH 40/60%) | 1 | 1/1 | 3832.40 | 1844.13 | 2.493 @702 / 2.145 @5917 | 4.5 s | Min zone RH 2.6 % (uncontrolled) → **29.1 %**; max capped at **60.5 %** by the 60 % dehumidification setpoint; heating +907 kWh from humidification/latent — humidity control materially and correctly affects outputs. Min RH sits below the 40 % setpoint only in zero-load dead-band hours (Ideal Loads delivers no carrier air) — correct EnergyPlus physics | +| 2 | Framed window (SingleBox, 50 mm PVC frame) | 1 | 1/1 | 2948.18 | 1670.62 | 2.015 @702 / 2.103 @5533 | 3.0 s | SAM aperture 2.80 m² = E+ glass **2.470** + E+ frame **0.330** m² (EnvelopeSummary); pane polygon in IDF; FrameAndDivider present | +| 3 | DDY design days + sizing (SingleBox) | 4 (3 sizing + annual) | 1/1 | 2924.81 | 1758.03 | 2.025 @702 / 2.173 @5532 | 3.0 s | Annual totals **identical to baseline to the shown precision** (2924.81/1758.03 both runs) — environment filter proven; ZoneSizes populated. Pre-fix evidence for P1-02: imported days were `ANN HTG 99.6% CONDNS DB`, `ANN HTG WIND 99.6%`, `ANN HUM_N 99.6%` — **no cooling day** | +| 4 | North rotation 0° vs 180° (SingleBox, south window) | 1 | 1/1 | 2924.81 → 3407.03 | 1758.03 → 1380.72 | — | 2.9 s | Transmitted window solar 1316.8 → **436.4 kWh**; heating up, cooling down — orientation/sign convention proven end-to-end (identical transform to SAM_Tas `ToT3D/Building.cs`: radians → degrees, no inversion) | +| 5 | Rich extraction (TwoAdjacentBoxes, series on) | 1 | 2/2 | 5532.11 | 2890.57 | 3.633 @702 / 3.457 @4192 | 4.3 s | Per-zone energies/peaks for both zones; unmet hours and gains normalised onto the energy zone identity; enclosure-scoped window solar extracted; 8760-value temperature/operative/humidity series per zone; coincident peak ≤ Σ zone peaks | + +Additional probe: a **framed internal (interzone) window** (TwoAdjacentBoxes, shared-wall +window, all apertures framed) runs cleanly — 3 FrameAndDivider objects reach the IDF, exit 0, +0 severe, no frame-related err entries. EnergyPlus 25.1 accepts interzone frames; no finding. + +## 3. P0 findings + +None. + +## 4. P1 findings + +### P1-01 — Declared coverage diagnostics never emitted (false completeness) + +- **Priority:** P1 (silent omission; violates the programme's core "never silently dropped" contract) +- **Summary:** 18 manifest rows declare a structured diagnostic that no production code path + ever emits. The converter never reads these parameters at all, so data present on real models + is dropped with no trace — exactly the "false completeness" failure mode this review was + directed to find. The C7 enforcement test only proves the pollutant diagnostic. +- **Affected entries and files:** + - `InternalConditionParameter.OccupancyViewCoefficient`, `.EquipmentViewCoefficient`, + `.LightingControlFunction` (Unsupported, SAM-OS-IC-001) — never referenced in + `Convert/ToOpenStudio/InternalCondition.cs`; + - `InternalConditionParameter.HeatingEmitterRadiantProportion`, `.HeatingEmitterCoefficient`, + `.CoolingEmitterRadiantProportion`, `.CoolingEmitterCoefficient`, + `.ExhaustAirFlowPerPerson`, `.ExhaustAirChangesPerHour`, `.ExhaustAirFlowPerArea`, + `.ExhaustAirFlow` (Deferred, declared SAM-OS-HVAC-001 info) — never referenced; + - `ApertureConstructionParameter.IsInternalShadow`, `ConstructionParameter.IsInternalShadow` + (Unsupported, SAM-OS-CON-002) — never referenced (`Convert/ToOpenStudio/Aperture.cs`, + `Construction.cs`); + - `PanelParameter.FeatureShade` (Unsupported, SAM-OS-CON-002) — only the + *ApertureParameter* FeatureShade is checked (`Aperture.cs:282`); the panel-level flag is not + (`Panel.cs`); + - `AnalyticalMaterialParameter.VapourDiffusionFactor` (Unsupported, SAM-OS-MAT-002) — never + referenced (`Material.cs`); + - `OpaqueMaterialParameter.InternalEmissivity`, `.InternalLightReflectance`, + `.InternalSolarReflectance` (Approximated, "SAM-OS-MAT-002 info when Internal differs from + External") — the opaque `Internal*` parameters are never read (`Material.cs` reads only the + transparent-material `Internal*` set), so the declared divergence diagnostic can never fire. +- **Reproduction:** `grep -rE "OccupancyViewCoefficient|EquipmentViewCoefficient|LightingControlFunction|ExhaustAir|Emitter|IsInternalShadow|VapourDiffusionFactor" SAM_OpenStudio/` — + no production hits (only the manifest/docs). Convert a model whose internal condition carries + `OccupancyViewCoefficient` (SAM's own `Create.InternalCondition` sets 0.227–0.372 on every + NCM-derived condition) → zero diagnostics referencing it. +- **Observed:** parameters silently ignored; `CleanFixture_DropsNothing` passes because the + fixtures never set them; `UnsupportedData_RaisesExactlyTheDeclaredDiagnostics` tests pollutant only. +- **Expected:** per the manifest scheme — "Unsupported: when source data is present a structured + diagnostic is emitted. Nothing is silently dropped"; Approximated rows fire their declared + conditional diagnostic; Deferred rows with a declared diagnostic report the deferral. +- **Impact:** real production models (NCM data, TAS imports with emitter/exhaust definitions, + materials with vapour-diffusion factors, asymmetric opaque optics) lose data with no trace; + the coverage report overstates the translation. +- **Correction:** emit the declared diagnostics at the natural conversion sites (internal + condition → SpaceType creation; aperture/construction/panel/material converters), info/ + warning severity exactly as declared; no conversion behaviour changes otherwise. +- **Regression tests:** one per emission site asserting the declared code fires when the data is + present, and the clean-fixture test still drops nothing. +- **Status:** **Fixed** (Stage L) — declared diagnostics emitted at all five converter sites + (InternalCondition: view coefficients, control function, emitter/exhaust deferrals; + Aperture + Construction: internal-shadow flags; Panel: feature shade; Material: vapour + diffusion factor and opaque internal-optics divergence, each once per source object via the + new `OpenStudioConversionContext.RegisterOnce`); the SAM-OS-HVAC-001 summary widened to cover + the deferral usage (P3-05). Regression suite `C7/DeclaredDiagnosticsTests` (8 tests, incl. + once-per-object and matching-optics-silence); clean fixture still drops nothing. Commit in §8. + +### P1-02 — Default DDY import selects no cooling design day (and wrong 99.6% days) + +- **Priority:** P1 (wrong design-day behaviour; silent omission of the cooling sizing day) +- **Summary:** `Convert/ToOpenStudio/DesignDays.cs` filters by + `name.Contains("99.6%") || name.Contains("0.4%")`. ASHRAE/climate.onebuilding DDY files name + cooling days `… Ann Clg .4% Condns DB=>MWB` — **without a leading zero** — so no cooling day + ever matches; and `"99.6%"` also matches the humidification (`Ann Hum_n 99.6%`) and wind + (`Ann Htg Wind 99.6%`) days the documented policy ("the heating 99.6% / cooling 0.4% pair") + does not intend. The referenced OpenStudio `baseline_model.rb` filters on + `Htg 99.6. Condns DB` / `Clg .4. Condns DB=>MWB`. +- **Affected files:** `SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/DesignDays.cs:41-54`; + `tests/.../C4/SiteWeatherSettingsTests.cs:99-109` (tautological assertions). +- **Reproduction:** default DDY import of the pinned Boston DDY; SQL + `EnvironmentPeriods` of the independent run 3 (pre-fix): + `ANN HTG 99.6% CONDNS DB | ANN HTG WIND 99.6% CONDNS WS=>MCDB | ANN HUM_N 99.6% CONDNS DP=>MCDB | SAM_RUNPERIOD` + — three heating-type sizing days, zero cooling days. +- **Observed:** cooling sizing (`Sizing:Zone` cooling loads, `ZoneSizes` cooling rows, + `Result.Space.DesignLoad` for cooling) computed from heating-condition days — meaningless; + the C4 test passes because `Count ≥ 2` is satisfied by the three spurious matches and the + second assertion merely re-applies the same filter. +- **Expected:** default selection = the annual heating 99.6% dry-bulb day plus the annual + cooling .4% (or 0.4%) DB=>MWB day; humidification/wind days excluded; fallback to all days + (with the existing warning) when the convention matches nothing. +- **Impact:** every default design-day workflow silently lacks cooling sizing. +- **Correction:** regex selection — heating `Ann Htg 99.6% Condns DB` (excluding `Wind`), + cooling `Ann Clg (0)?\.4% Condns DB=>M(C)?WB`; per-side warning when one side finds no match; + fallback to all days when neither matches. Rewrite the C4 assertion to name the two days. +- **Regression tests:** default import of the pinned DDY yields exactly one heating + (`…Ann Htg 99.6% Condns DB`) and one cooling (`…Ann Clg .4% Condns DB=>MWB`) day, and no + `Hum_n`/`Wind` day; `ImportAllDesignDays` unchanged; end-to-end sizing run shows both a + heating and a cooling sizing environment. +- **Status:** **Fixed** (Stage L) — regex selection (`Ann Htg 99.6% Condns DB` / + `Ann Clg 0?.4% Condns DB=>M(C)?WB`, case-insensitive) with per-side warnings and the + existing all-days fallback when neither side matches. C4 assertion rewritten to name the + exact pair; new heating-only-DDY warning test; the end-to-end sizing run now asserts (via + SQL EnvironmentPeriods) exactly one heating and one cooling sizing environment and identical + annual totals. Commit in §8. + +### P1-03 — Leap-year Feb 29 collapses onto Feb 28 in the SQL hour-of-year + +- **Priority:** P1 (wrong calendar/result behaviour under the supported `IsLeapYear` option) +- **Summary:** `OpenStudioSimulationRunner.ReadHourlyValueSeries` computes hour-of-year with a + fixed non-leap reference year (`DaysInMonth(2023, …)`, `new DateTime(2023, …)`). In a + leap-year run (C4 `IsLeapYear` + leap EPW), EnergyPlus reports Month=2/Day=29 rows: the + day-clamp maps them onto Feb 28 (duplicate hour indices), and every date after February lands + one day early. `CoincidentPeak` accumulates per hour index, so Feb 28 + Feb 29 values sum + into the same 24 buckets — the building-level coincident peak (and the SAM + `PeakHeating/CoolingLoad`/`PeakHour` written by `ToSAM`) can be inflated up to 2×; per-zone + peak *hours* after February are off by 24 h relative to the 8784-hour series. +- **Affected files:** `SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/OpenStudioSimulationRunner.cs:985-988` + (with `CoincidentPeak` at 835-868 consuming the duplicated keys). +- **Reproduction:** synthetic EnergyPlus-schema SQLite with hourly rows for Feb 28 and + Feb 29 (leap year): pre-fix, both days produce the same 24 hour indices (1392…1415), and the + summed "coincident" magnitude doubles. (The pinned Boston TMYx EPW is non-leap, so the shipped + test suite cannot reach this path — the C4 leap test stops at schedule generation.) +- **Expected:** hour-of-year computed against the run calendar — Feb 29 gets its own 24 + indices, Mar 1 starts at hour 1440 (leap) / 1416 (non-leap), Dec 31 ends at 8783 (leap). +- **Impact:** leap-year simulations (AMY 2020/2024 weather, `IsLeapYear = true`) report corrupted + coincident peaks and shifted peak timestamps into SAM results. +- **Correction:** detect Feb 29 in the returned rows and use a leap reference year (2024) for + the day-of-year computation; keep the defensive clamp for genuinely out-of-range values. +- **Regression test:** synthetic SQL (leap dataset) through the internal reader: 48 distinct + indices across Feb 28/29, Mar 1 hour 0 at index 1440, no duplicate hour keys. +- **Status:** **Fixed** (Stage L) — the reader now selects the reference year from the data + (Feb 29 present in the read environment → leap year 2024, else 2023; the defensive clamp + stays for genuinely invalid dates). Regression suite `C5/LeapYearIndexingTests`: leap + dataset yields 50 distinct indices (Feb 28 @1392, Feb 29 @1416, Mar 1 @1440, Dec 31 @8783); + a non-leap dataset keeps the original indexing (Mar 1 @1416, Dec 31 @8759). Commit in §8. + +## 5. P2 findings + +### P2-01 — Stale-manifest-id detection claimed but not implemented + +- **Summary:** the coverage document states the completeness test fails when "a manifest entry + references an enum member that no longer exists (stale coverage)". `Manifest_CoversEveryLiveEnumMember` + checks only live member → manifest; a manifest id with a covered-enum prefix but a + non-existent member passes silently, so renames/removals in SAM would leave stale rows. +- **Files:** `tests/.../C7/CompletenessTests.cs:89-120`; `docs/SAM_OPENSTUDIO_ANALYTICAL_COVERAGE.md` (§Enum completeness enforcement). +- **Correction:** reverse check — every manifest id whose prefix matches a covered enum must + name a live member. +- **Status:** **Fixed** (Stage L) — `Manifest_HasNoStaleIds` added. On its first run against the + shipped manifest it caught **two real stale rows**: `AnalyticalMaterialParameter.TypeName` + and `.Description` name members that are commented out in the live + `SAM.Analytical.MaterialParameter` enum (the C0 audit transcribed them; this review's own + Stage D "no stale entries today" verification also missed them — corrected in §7). Both rows + removed from the JSON manifest and the Markdown document (byte-level edit preserving the + pre-P2-06 encoding); coverage totals are now **277 entries, NA 56, C0 62** (documents + updated). Failure mode reproduced with an injected ghost id before the manifest correction. + Commit in §8. + +### P2-02 — Non-hourly OutputVariableFrequency mis-scales extracted peaks + +- **Summary:** `OutputVariableFrequency` is honoured for the `Output:Variable` requests, but the + extractor converts per-row energies with a fixed 3600 s interval (`JoulesPerIntervalToWatts` + default): "Timestep" under-reports peaks ×(1/timesteps), "Daily" inflates them ×24, and the + 8760-length series assumptions break. +- **Files:** `Classes/OpenStudioSimulationRunner.cs` (FillPeaks/CoincidentPeak); + `SAM.Core.OpenStudio/Query/ConvertUnit.cs`; `Convert/ToOpenStudio/SimulationSettings.cs:112`. +- **Correction (mitigation, this branch):** a warning diagnostic at conversion when the + requested frequency is not Hourly, stating peaks/series in the result set assume hourly + reporting. Full frequency-aware extraction is follow-up work. +- **Status:** **Mitigated** (Stage L) — new `SAM-OS-RUN-003` (ResultExtractionLimitation) + warning at conversion naming the non-hourly frequency; the request itself is still honoured + and the default stays silent (both tested). Frequency-aware peak extraction remains a + follow-up. Commit in §8. + +### P2-03 — SAM Location override unvalidated + +- **Summary:** `Weather.cs` copies `Location.Latitude/Longitude/Elevation` into `OS:Site` + whenever a SAM Location exists — including NaN or out-of-range values (a NaN reaches the OSM + and EnergyPlus). The precedence itself is correct and tested; only validation is missing. +- **Files:** `Convert/ToOpenStudio/Weather.cs:59-66`. +- **Correction:** override only when latitude ∈ [−90, 90], longitude ∈ [−180, 180] and both + finite (elevation finite, else 0-defaulted by OS); otherwise keep the EPW site and raise a + warning naming the rejected values. +- **Status:** **Fixed** (Stage L) — invalid coordinates keep the EPW site with a SAM-OS-RUN-002 + warning naming the rejected values; a non-finite elevation keeps the EPW elevation (never a + NaN into OS:Site) while valid coordinates still override, and the override message says so. + Regression tests: NaN latitude, longitude 200 and NaN elevation (C4). Commit in §8. + +### P2-04 — Standalone `Run(path, …)` collision behaviour for `.osw` inputs + +- **Summary:** the standalone runner creates a unique directory but for `.osw` inputs runs next + to the input file regardless (`workingDirectory = dirname(oswPath)`), and this overload has no + lock file: two parallel runs of the same OSW share one `run/` folder silently. `.osm` inputs + are unaffected (the generated OSW lands in the unique directory). +- **Files:** `Classes/OpenStudioSimulationRunner.cs:331-368`. +- **Proposed correction (follow-up):** copy the OSW into the unique directory with + absolutised `seed_file`/`weather_file` paths, or apply the same lock-file guard to the OSW + directory. Requires OSW-rewrite design — intentionally not changed in this pass. +- **Status:** **Open (follow-up)** — recorded; not blocking (default GH/API path uses the + context-based runner or `.osm` inputs). + +### P2-05 — Grasshopper lifecycle: no cancellation on component removal / document close + +- **Summary:** `GH_SamAsyncComponent` cancels a stale run on input change and on `cancel_`, but + deleting the component or closing the document leaves the CLI/EnergyPlus run executing to + completion (bounded only by the timeout); the completion continuation then calls + `ScheduleSolution` on a document that may be disposed. Rhino *process* exit is already safe + (kill-on-close Job Object). +- **Files:** `Grasshopper/SAM.Analytical.Grasshopper.OpenStudio/Component/GH_SamAsyncComponent.cs`. +- **Correction:** override `RemovedFromDocument` and `DocumentContextChanged` (close) to cancel + the token; guard the completion continuation. +- **Status:** **Fixed** (Stage L) — `RemovedFromDocument` cancels the running task (process + tree dies via the runner's kill path); `DocumentContextChanged` cancels on `Close` only + (lock/unload/document-switch leave the run alive); the completion continuation re-resolves + `OnPingDocument()` and never schedules into a removed/disposed document (exception-guarded). + Full solution (incl. GH project) builds clean; headless tests cannot exercise the Grasshopper + runtime — human confirmation is §10 step 5. Commit in §8. + +### P2-06 — Encoding corruption in the coverage files + +- **Summary:** `docs/SAM_OPENSTUDIO_ANALYTICAL_COVERAGE.md` contains three double-encoded + arrows (bytes `C3 A2 E2 80 A0 E2 80 99` — `→` — instead of `E2 86 92` `→`); + `tests/resources/openstudio-analytical-coverage.json` contains one raw CP1252 em-dash byte + (0x97) — invalid UTF-8 — in the `Result.Space.GlazingExternalConduction` note (tests survive + because `File.ReadAllText` substitutes U+FFFD). +- **Correction:** rewrite the affected bytes as proper UTF-8; content otherwise unchanged. +- **Status:** **Fixed** (Stage L) — a full byte-level scan found more of the same corruption + class than originally recorded: the MD carried 3 double-encoded arrows (`→` → `→`), + 12 double-encoded em-dashes and 1 double-encoded en-dash (`—`/`“` → `—`/`–`); all 16 + sequences repaired byte-wise, plus the JSON's raw CP1252 0x97 → `—`. Both files now decode + as strict UTF-8 (exception-fallback decoder); remaining non-ASCII runs are exactly the + intended `→`/`—`/`–` code points. Commit in §8. + +## 6. P3 observations (recorded, not fixed) + +| # | Observation | Location | +| --- | --- | --- | +| P3-01 | GH components re-run the full simulation whenever an unchanged definition recomputes (F5/reopen) — standard Grasshopper expiry semantics (Ladybug parity), but a signature-keyed result cache would avoid multi-second re-runs | `GH_SamAsyncComponent.cs` | +| P3-02 | `Statistics.UnsupportedObjects` increments only for SAM-OS-IC-001; CON-002/MAT-002 unsupported parameters are counted via skips/diagnostic counts instead | `OpenStudioConversionContext.cs:122` | +| P3-03 | `SimpleGlazing.setUFactor` return value unchecked — U > 7 W/m²K (EnergyPlus limit) would silently keep the OS default | `Construction.cs:97` | +| P3-04 | `ContentHash` uses `MD5.Create()` — throws on FIPS-enforcing hosts; non-cryptographic use, SHA-256 would be safer | `InternalCondition.cs:358` | +| P3-05 | `SAM-OS-HVAC-001` XML summary said "Conditioned zone missing setpoints" while the code also carries deferred-HVAC info diagnostics (summary widened in the P1-01 commit) | `OpenStudioDiagnosticCodes.cs` | +| P3-06 | Unique GUID run directories are never cleaned up — unbounded disk growth under long-lived output directories (documented trade-off for traceability) | `OpenStudioSimulationRunner.cs` | +| P3-07 | The traceability ObjectMap registers the first OpenStudio variant per SAM Guid only (Forward construction, first schedule type); multi-variant traceability lives in the caches (documented) | `OpenStudioObjectMap` usage | +| P3-08 | Test run directories accumulate inside the test `bin` output (2 GB+ observed); per-run cleanup happens at start, not end | test fixtures | + +## 7. Areas reviewed with no defect found + +- **Coverage system (Stage D):** 279 entries, zero duplicates; status totals match the claim + exactly; MD ↔ JSON in perfect lockstep (279 ↔ 279, no drift); every Unsupported entry + declares a diagnostic; enum reflection is deterministic (`Enum.GetNames` + set membership); + new SAM enum members cannot vanish silently (live→manifest direction enforced; the missing + reverse direction is P2-01). Milestone totals (MVP 90, C1 3, C2 37, C3 23, C4 26, C5 36, + C0 64) reproduce. *Stage D correction:* this review originally recorded "every id maps to a + live SAM enum member — no stale entries today"; the P2-01 reverse check proved that wrong — + `AnalyticalMaterialParameter.TypeName`/`.Description` named commented-out members. Corrected + totals after Stage L: **277 entries, NA 56, C0 62**. +- **C1 adapter hardening (Stage E):** ordinal case-insensitive `IsConditioned` (tr-TR tested); + schedule cache keyed (Guid, ProfileType); SpaceType key = name + content hash (Guids + stripped) + per-space evaluated densities — first-space imposition impossible (tested); + BuildingStory space-elevation fallback correct with information diagnostic; conversion errors + gate the CLI (tested); conditioned zero-surface zones rejected with error (tested); result + owns the model, disposal idempotent (SWIG-guarded), use-after-dispose throws (tested); + VersionTranslator load path; every SQL query parameterised (verified in all five query + helpers; quoted-name test passes); statistics source/created/skipped/error counts populated + and snapshotted (tested); repeated conversion+disposal loop clean. +- **C2 internal conditions (Stage F):** `OccupancyGain` = sensible + latent (verified in SAM + source) → People activity level total W/person with SensibleHeatFraction S/(S+L) — correct + E+ semantics; latent equipment as dedicated instance (latent=1, radiant=0) keeps fraction + sums at 1.0 with no double counting (sensible and latent SAM queries are disjoint — verified); + radiant fractions with documented defaults; native ACH infiltration + per-exterior-area + fallback; DSOA method Sum with per-person/area/ACH/absolute (honeybee parity) and the + space-level override precedence; humidistat schedules in percent (0–100 limits) — E+ expects + percent, and the independent run proves 40 %/60 % setpoints act at the right scale; + heating-only/cooling-only single-mode thermostats without invented setpoints (tested); + unconditioned zones get no thermostat/Ideal Loads; profile 8760/8784 rules, leap tiling, + day-composition rotation, gap errors — all verified in code and tests. +- **C3 fenestration (Stage G):** frame width from `DefaultFrameWidth` else frame thickness; + conductance U = 1/Σ(t/λ) — film-free, matching the EnergyPlus frame-conductance definition; + absorptances 1 − External*Reflectance; pane polygon from SAM's own `GetPaneFace3Ds` with + area-conservation guard (pane strictly inside aperture, ≥ minimum area); frameless fallback + warnings on every invalid-frame path (missing material/thickness/conductivity, degenerate + pane, area failure); frames skipped on opaque doors (info); full-polygon-plus-frame + double-counting impossible (pane polygon only when a frame object exists — verified in code + and E+ output: 2.470 + 0.330 = 2.800 m²); internal pairing reciprocal incl. framed interzone + windows (probe: clean run); opaque/glazed door families; AirGap vs WindowMaterial:Gas + context separation (P1-06 machinery intact); holes reported with Guid + geometry summary, + never fabricated; blind/shade/opening-property diagnostics fire (aperture-level). +- **C4 site/weather (Stage H):** NorthAngle radians→degrees with no inversion — the identical + transform SAM_Tas applies to `TAS3D.Building.northAngle` (authoritative production + convention), proven end-to-end by the 180° solar shift; explicit `NorthAngleDegrees` + precedence (tested); SAM Location precedence with information diagnostic (P2-03 adds + validation); ground temperatures SAM → EPW header (SAM.Weather parser — OpenStudio's + `setWeatherFile` does not import them; verified against the pinned EPW header values) → named + 18 °C default warning; RunPeriod/timestep/calendar/leap/DST/solar distribution/shadow + frequency all applied and tested; DDY import via EnergyPlusReverseTranslator; sizing flags + enabled with imported days; annual sums restricted to EnvironmentType 3 — proven by identical + annual totals with 3 sizing environments present, and by the SQL cross-check. +- **C5 results (Stage I):** one unit authority (J→kWh ÷3.6e6 for annual sums; J/interval→W + ÷3600 for peaks — roles verified); annual = SUM, peak = MAX with its own row's timestamp; + E+ 1-based Month/Day/Hour → 0-based hour-of-year correct for non-leap (P1-03 fixes leap); + the C5-era day-clamp fix (29–31 → DaysInMonth) verified correct for ordinary months; + design-day rows excluded from annual and peak paths (proven); sizing results accessible via + ZoneSizes (2 rows in run 3); zero distinct from missing (absent zones absent from + dictionaries — tested with an unconditioned second zone); series only on request (verified); + the three-namespace zone identity (Ideal Loads system / ThermalZone / Space enclosure keys, + shared 8-hex Guid suffix, case-insensitive) — normalisation verified against live SQL keys in + run 5; apostrophes/quotes sanitised out of names (MVP P2-02) and parameterised SQL besides; + uppercase handled ordinal-ignore-case; renamed enclosure solar variable used; ToSAM writes + the existing SAM parameters with matching units (kWh/kW/h/m²/m³ — verified against the SAM + enum attributes). +- **C6 async/cancellation (Stage J):** `RunAsync` = `Task.Run` (no pre-await blocking); + cancellation registered on the token kills the Job-Object tree (same path as timeout); + asynchronous pipe reads (no ReadToEnd deadlock); progress via `IProgress` (thread-safe + posting); unique GUID directories traceable via result paths; non-unique lock file honoured, + released in `finally` (failure/cancel-safe — tested); partial runs cannot read as success + (success requires exit 0 + no fatal + SQL); cancel-before/cancel-during, parallel unique + dirs, collision, sequential, progress-order and no-surviving-process all covered by real + CLI tests; Rhino exit kills orphans by Job-Object close. +- **C7 validation (Stage K):** fixtures assert real semantics (densities, fractions, layer + order, areas, diagnostics, E+ artifacts); no non-null-only assertions found in the C-suites; + simulation tests fail (never skip) when the CLI/EPW is missing; output directories deleted + before use or GUID-unique; no inter-test order coupling found (state is per-test); + culture-independence exercised (tr-TR test) and invariant formatting used throughout; + determinism compares full sorted (IddObject, name) object sets — semantic, handle-free; + performance measured on identical fixtures; disposal loop asserts validity each round; + SimpleGlazing fallback physically justified (U/SHGC/VT are exactly the SimpleGlazingSystem + model inputs), aperture-level precedence implemented, explicit info diagnostic + error on + incomplete parameters (both tested). + +## 8. Corrections implemented (Stage L) + +One commit per finding, each preceded by a failing regression test, followed by the focused +test, the full suite and (for semantic changes) the relevant EnergyPlus simulation. The +original C0–C7 commits are untouched. + +| Commit | Finding | Regression tests | +| --- | --- | --- | +| `dda59b0` | P1-01 | `C7/DeclaredDiagnosticsTests` — 8 tests, one per emission site (view coefficients, control function, emitter/exhaust deferrals, internal-shadow flags on aperture-construction and construction, panel feature shade, vapour diffusion factor, divergent internal optics), incl. once-per-object enforcement and matching-optics silence; `CleanFixture_DropsNothing` still green | +| `600ef2b` | P1-02 | C4 import test names the exact heating 99.6% + cooling .4% pair, rejects `Hum_n`/`Wind`; heating-only DDY imports 1 day + missing-cooling warning; end-to-end sizing run proves exactly one heating and one cooling sizing environment (SQL `EnvironmentPeriods`) with annual totals identical to baseline | +| `ec7123f` | P1-03 | `C5/LeapYearIndexingTests` — synthetic leap SQL: 50 distinct indices, Feb 28 @1392 / Feb 29 @1416 / Mar 1 @1440 / Dec 31 @8783; non-leap dataset unchanged (Mar 1 @1416, Dec 31 @8759) | +| `e5e72ff` | P2-01 | `Manifest_HasNoStaleIds` (reverse check) — caught **2 real stale rows** (`AnalyticalMaterialParameter.TypeName`/`.Description`, commented out in SAM); manifest and MD corrected to **277 entries / NA 56 / C0 62**; ghost-id injection reproduced the failure mode | +| `ff93d89` | P2-02 | C4 non-hourly frequency test — one `SAM-OS-RUN-003` warning for "Timestep", request still honoured, hourly default silent | +| `d631e18` | P2-03 | C4 — NaN latitude and longitude 200 keep the EPW site with a warning naming the values; NaN elevation keeps the EPW elevation while valid coordinates override | +| `68adfa4` | P2-05 | compile-verified against the full solution (GH runtime is human-validated; §10 step 5) | +| `68d09f5` | P2-06 | strict exception-fallback UTF-8 decode of both files; byte scan shows only the intended `→`/`—`/`–` sequences (16 MD repairs — 13 more of the same corruption class than originally recorded — plus the JSON 0x97) | + +P2-04 (standalone `.osw` run isolation) remains **open as a recorded follow-up** by design — +it needs an OSW-rewrite design and does not affect the default GH/API paths. + +## 9. Final validation (Stage M) + +Executed on the branch head after all Stage L corrections (2026-07-20): + +- **Build:** `dotnet build SAM_OpenStudio.sln -c Debug -p:Platform=x64 -m:1` — full solution + including the Grasshopper project (Rhino closed): **0 errors**, only the two pre-existing + benign MSB3277 System.Memory warnings. +- **Suite:** `dotnet test … -c Debug -p:Platform=x64` — **170/170 passed, 0 skipped** + (~2 m 08 s): the 146 reproduced baseline + 9 tests from the two pre-review fix commits + (`1b8cbc0` SQLite deployment, `e48352b` wind-panel normals) + **15 Stage L regression + tests**. +- **Coverage manifest:** **277 entries — Native 135, Derived 28, Approximated 21, + Unsupported 20, Deferred 17, NA 56** (post-P2-01); all four manifest-enforcement tests green + (structural, live→manifest, manifest→live, diagnostic-code existence). + +### Post-fix simulation validation (suite evidence, same fixtures as §2) + +| # | Scenario (test) | Result | Evidence | +| --- | --- | --- | --- | +| 1 | Latent + humidistat (`LatentAndHumidistat_EndToEnd_EnergyPlusRun`) | pass, 4 s | humidity-band semantics asserted in-test (§2 run 1 reproduced the physics: min RH 2.6 % → 29.1 %, max capped 60.5 %) | +| 2 | Framed window (`FramedWindow_EndToEnd_EnergyPlusRun`) | pass, 5 s | EnergyPlus glass area **2.470 m²** + frame 0.330 m² = SAM aperture 2.80 m² (EnvelopeSummary row asserted) | +| 3 | Design days + sizing (`DesignDaysRun_AnnualResultsExcludeSizingPeriods`) | pass, 8 s (2 runs) | annual totals identical with and without design days: **H 2924.807 / C 1758.028 kWh** both; sizing environments now exactly `ANN HTG 99.6% CONDNS DB` + `ANN CLG .4% CONDNS DB=>MWB` (P1-02 fixed — was 3 heating-type days, no cooling) | +| 4 | North rotation (`NorthRotation_ShiftsSolarGains_EndToEnd`) | pass, 8 s (2 runs) | 0° → 180°: heating 2924.8 → **3407.0 kWh**, cooling 1758.0 → **1380.7 kWh** — sign convention intact post-fixes | +| 5 | Rich extraction (`AnnualEnergy_Peaks_UnmetHours_Gains_AndSeries_Extracted`, TwoAdjacentBoxes) | pass, 4 s | per-zone energies/peaks, unmet hours, gains, enclosure solar, 8760-value series; coincident ≤ Σ zone peaks | + +### Special validations (all green) + +`Cancel_DuringRun_TerminatesProcessTree_NoSurvivingProcess` (927 ms), +`Cancelled_BeforeStart_NoCli_NoSurvivingProcess`, `Parallel_UniqueRunDirectories_BothSucceed` +(two concurrent EnergyPlus runs), `SameDirectory_NonUnique_SecondRunGetsCollisionDiagnostic`, +`SequentialRuns_RepeatedConversionAndDisposal`, `ProgressStages_AreReportedInOrder`, +`RepeatedConversion_AndDisposal_DoesNotLeakOrThrow` (5-iteration loop), +`Conversion_IsDeterministic` (sorted semantic object-set comparison), +`Manifest_IsStructurallySound` / `Manifest_CoversEveryLiveEnumMember` / +`Manifest_HasNoStaleIds` / `Manifest_DeclaredDiagnosticCodes_Exist` (coverage enforcement), +`Performance_ConversionAndRun_AreMeasured` and `TwoBoxes_EndToEnd_EnergyPlusRun_BothZonesProduceLoads` +(largest available synthetic fixture, TwoAdjacentBoxes). + +## 10. Rhino 8 validation procedure (human) + +1. Close Rhino. Build: `dotnet build SAM_OpenStudio.sln -c Debug -p:Platform=x64 -m:1` + (the post-build step deploys to `%APPDATA%\SAM`). +2. Open Rhino 8 → Grasshopper → confirm `SAMAnalytical.ToOpenStudio` and `OpenStudio.RunModel` + appear in the SAM ▸ OpenStudio category and load without assembly errors. +3. Feed a production SAM AnalyticalModel JSON + EPW + output directory, `_run = true`: the + component must show "Running" without freezing the canvas, complete onto the outputs + (osmPath/oswPath/sqlPath/heating/cooling/diagnostics/successful), and report the documented + diagnostics only. +4. Set `cancel_ = true` mid-run: the run stops within seconds, outputs stay cleared, and no + `openstudio.exe`/`energyplus.exe` remains in Task Manager. +5. **New (P2-05):** start a run, then (a) delete the component mid-run and (b) in a second run, + close the document mid-run — in both cases the CLI/EnergyPlus processes must disappear + within seconds and Rhino must stay stable. Close Rhino itself mid-run: no surviving + EnergyPlus process. +6. With a DDY supplied (run options), verify the diagnostics name both the heating 99.6% and + the cooling .4% day (P1-02). +7. Compare heating/cooling against the TAS production route for the same model; attach findings + to the PR review. + +## 11. Remaining limitations + +Unchanged from the status document: detailed HVAC deferred (Ideal Loads remains the system); +dividers/muntins N/A (no SAM data); blinds/shades and opening properties unsupported with +diagnostics; SAM hourly design days approximated (DDY import is the deterministic path); STAT +parsing deferred; DST default off; emitter characteristics and exhaust flows deferred to the +HVAC programme (now with the declared deferral diagnostics actually emitted). New follow-ups +from this review: P2-04 (`.osw` standalone-run isolation) and the full frequency-aware peak +extraction behind P2-02. + +## 12. Recommendation + +**READY** — for human Rhino 8 validation now, and for a pull request once that validation +passes. + +- Every confirmed P0/P1 is resolved with regression tests (no P0 existed; P1-01…P1-03 fixed). +- Every small in-scope P2 is fixed or mitigated (P2-01, P2-02 mitigation, P2-03, P2-05, + P2-06); P2-04 and frequency-aware peak extraction are recorded follow-ups outside the + default paths. +- Final validation: clean full-solution build, **170/170 tests, 0 skipped**, five post-fix + EnergyPlus scenarios and all special validations green (§9). +- The one thing no headless environment can prove is the Grasshopper runtime behaviour — + §10 (including the new step 5 for P2-05) is the mandatory human gate before the PR. +- No pull request has been opened, per the programme instructions. diff --git a/docs/openstudio-analytical-completeness-status.md b/docs/openstudio-analytical-completeness-status.md new file mode 100644 index 0000000..6b86781 --- /dev/null +++ b/docs/openstudio-analytical-completeness-status.md @@ -0,0 +1,411 @@ +# SAM → OpenStudio Analytical Completeness v1 — Status + +Programme: complete every non-HVAC part of `SAM.Analytical.AnalyticalModel` translation with a +defensible OpenStudio/EnergyPlus representation — native where possible, controlled approximation +where necessary, structured diagnostic where unsupported, never silently dropped. Ideal Loads +remains the simulation system. Branch: `feature/openstudio-analytical-completeness` (base +`sow/2026-Q3`, MVP baseline `bf75bf3`, 82/82 tests). + +| Milestone | Scope | Status | Commit | +|---|---|---|---| +| C0 | Complete SAM analytical coverage audit (Markdown + machine-readable manifest) | **Done** | — | +| C1 | Core adapter hardening (P3 items, disposal, statistics, SQL, VersionTranslator) | **Done** | — | +| C2 | Internal conditions, schedules, conditioning modes (latent, humidistat, single-mode) | **Done** | — | +| C3 | Fenestration, frames, constructions (FrameAndDivider, doors, hole diagnostics) | **Done** | — | +| C4 | Site, weather, DDY, simulation settings (north, ground temps, run period, calendar) | **Done** | — | +| C5 | Results extraction and SAM result mapping (engine-neutral schema, units authority) | **Done** | — | +| C6 | Cancellation, asynchronous execution, Grasshopper UX | **Done** | — | +| C7 | Full regression suite, completeness enforcement, documentation | **Done** | — | + +## C0 — Coverage audit (done) + +- `docs/SAM_OPENSTUDIO_ANALYTICAL_COVERAGE.md` — full audit of the SAM analytical data surface; + tables generated from the manifest. +- `tests/resources/openstudio-analytical-coverage.json` — machine-readable manifest (277 entries + after the Stage L review removed two stale `AnalyticalMaterialParameter` rows, review P2-01) + consumed by the C7 completeness tests (tests never parse the Markdown). +- Baseline verified on this machine before work started: x64 Debug build clean, + **82/82 tests passing** (including the EnergyPlus simulation tests), OpenStudio CLI + 3.10.0+86d7e215a1, OpenStudio NuGet 3.10.0 restored. +- Classification counts at C0: Native 135, Derived 28, Approximated 21, Unsupported 20, + Deferred 17, NA 58 across 279 entries (MVP already covers 90). The Stage L review (P2-01) + found the C0 audit had transcribed two commented-out `SAM.Analytical.MaterialParameter` + members (`TypeName`, `Description`); the corrected manifest carries 277 entries, NA 56. +- Agreed reclassifications (binding): dividers → NA (no SAM source data); blinds/shades and + opening properties → Unsupported with diagnostics; STAT parsing → deferred; SAM hourly design + days → Approximated parametric fit (DDY import is the deterministic primary path); subhourly + profiles → NA (SAM profiles are hour-indexed); daylight saving → option, default off; emitter + radiant proportions → Deferred; pollutant → Unsupported. + +## C1 — Adapter hardening (done) + +- `Query/IsConditioned.cs` — culture-independent ordinal case-insensitive classification + (tr-TR regression test). +- `Convert/ToOpenStudio/Profile.cs` + context — schedule cache keyed by (Guid, ProfileType); + the same profile under two types yields two schedules with correct type limits. +- `Convert/ToOpenStudio/InternalCondition.cs` — SpaceType share key now folds the per-space + computed load densities into the content hash; a shared condition no longer imposes the first + space's densities on other spaces. +- `Convert/ToOpenStudio/BuildingStory.cs` — stories fall back to space minimum elevations when + no floor-group panels exist (Information diagnostic). +- `Convert/ToOpenStudio/AnalyticalModel.cs` — conditioned spaces with no valid surfaces are + rejected (Error, no thermostat/Ideal Loads); skip sites feed the statistics. +- `Classes/OpenStudioConversionResult.cs` — implements `IDisposable` (owns the Model) and + carries an immutable `Statistics` snapshot. +- New `SAM.Core.OpenStudio/Classes/OpenStudioConversionStatistics.cs` — source/created/skipped/ + unsupported + per-severity counts, maintained by the context. +- `Classes/OpenStudioSimulationRunner.cs` — the CLI is never launched when the conversion + reported errors (OSM/OSW still saved); annual-energy extraction uses parameterised + System.Data.SQLite commands (no SQL string concatenation). +- `SAM.Core.OpenStudio/Create/Model.cs` — OSM load via `VersionTranslator` (older files upgrade + instead of being rejected); binding probe passed at build time. +- Tests: +11 (`tests/.../C1/AdapterHardeningTests.cs`) — 82 → **93**. + +## C2 — Internal conditions, schedules, conditioning (done) + +- `InternalCondition.cs` — latent equipment as a dedicated `ElectricEquipment` instance + (Fraction Latent = 1, own schedule); infiltration uses the native ACH field when the + condition carries `InfiltrationAirChangesPerHour` (flow-per-exterior-area remains the + fallback); SpaceType `DesignSpecificationOutdoorAir` (method Sum, per-person/per-area/ACH/ + absolute supply parameters) with the ventilation profile as the outdoor-air schedule — + `SpaceParameter.OutsideSupplyAirFlow` keeps precedence via the EnergyPlus space-over-type + rule; pollutant and TAS ventilation-function data raise structured diagnostics. +- `Thermostat.cs` — single-mode thermostats: only the existing setpoint schedule is set + (EnergyPlus SingleHeating/SingleCooling; no invented setpoints); both-missing stays an error. +- New `Convert/ToOpenStudio/Humidistat.cs` — `ZoneControlHumidistat` from the + Humidification/Dehumidification profiles (Percent type limits 0–100); named-but-unresolved + profile → SAM-OS-SCH-001 error. +- `IdealLoads.cs` — humidity control types set to Humidistat where the matching schedule + exists; documented EnergyPlus defaults otherwise. +- `Profile.cs` — Percent schedule type limits; per-type range warnings. +- `SimulationSettings.cs` — `Zone Air Relative Humidity` added to the requested outputs. +- Docs: INTERNAL_CONDITION_MAPPING updated; the M5 infiltration test was updated to the native + ACH basis (manifest-bound change). +- Note: builds currently exclude the Grasshopper project while Rhino is running on this + machine (post-build copy to `%APPDATA%\SAM` locks); the analytical/test chain builds clean. +- Tests: +11 (`tests/.../C2/InternalConditionCompletenessTests.cs`) — 93 → **104**. + +## C3 — Fenestration, frames, constructions (done) + +- `Aperture.cs` — `WindowPropertyFrameAndDivider` from SAM frame data: width from + `DefaultFrameWidth` else SAM frame thickness; conductance U = 1/Σ(t/λ) over the frame layers; + solar/visible absorptance = 1 − External*Reflectance of the outermost frame layer. With a + frame applied the SubSurface polygon becomes the SAM **pane** polygon (EnergyPlus grows the + frame outward); area conservation (pane strictly inside the aperture) is validated. Invalid/ + incomplete frame data → frameless full-polygon fallback + SAM-OS-CON-002 warning (never wrong + geometry); frames on opaque doors skipped (info). Opening properties, feature shades and TAS + additional-heat-transfer percentages raise structured diagnostics (SAM-OS-CON-002). +- `Material.cs` — `TransparentMaterialParameter.IsBlind` raises SAM-OS-MAT-002 info; converted + as plain glazing (no fabricated `WindowMaterial:Blind`). +- `Panel.cs` — hole diagnostics carry the panel Guid + geometry summary (count, per-hole and + total area); holes are never fabricated into windows. (Manifest row aligned: SAM-OS-GEO-001, + not GEO-002.) +- `SubSurfaceType.cs` — verified: opaque door vs glazed door by pane material family (tests). +- New diagnostic codes SAM-OS-CON-002 (unsupported construction/aperture parameter) and + SAM-OS-MAT-002 (unsupported material parameter). +- Fixtures: `CreateFramedWindowConstruction`, frame material in `CreateMaterialLibrary(bool)`, + `SingleBox(apertureConstructionOverride, includeFrameMaterial)`, `TwoAdjacentBoxes(sharedWallWindow)`. +- Docs: MATERIAL_MAPPING updated. +- Tests: +10 (`tests/.../C3/FenestrationTests.cs`) — 104 → **114**. + +## C4 — Site, weather, design days, simulation settings (done) + +- `SimulationSettings.cs` — north axis from `AnalyticalModelParameter.NorthAngle` + (**radians → degrees**, convention resolved from SAM_Tas `ToT3D/ToTBD Building.cs`; explicit + `NorthAngleDegrees` option overrides); explicit RunPeriod; timestep option; solar + distribution (via `SimulationControl` — OpenStudio exposes the E+ Building field there); + `ShadowCalculation` frequency option; YearDescription (first day of week from the run + calendar, calendar year, leap year — flattened onto `Model` in the C# wrapper); DST option, + **default off** (object removed when present); sizing control enabled when design days are + imported (`RunSizingPeriods` overrides). +- `Weather.cs` — SAM Location takes precedence over the EPW site coordinates (information + diagnostic; time zone stays with the EPW). Ground temperatures: SAM WeatherData + (nearest-to-surface set) → EPW header via **SAM.Weather's native parser** (verified: + OpenStudio's `setWeatherFile` does NOT import them) → warning naming the E+ 18 °C default. +- `Query/DesignDays.cs` — stub completed (IdfFile → EnergyPlusReverseTranslator). + New `Convert/ToOpenStudio/DesignDays.cs` — DDY import with 99.6%/0.4% name filter + (`ImportAllDesignDays` option; fallback to all + warning); `OpenStudioRunOptions.DdyPath` + wired (takes precedence over the conversion option). +- `OpenStudioSimulationRunner.ReadAnnualEnergy` — annual sums restricted to the weather-run + environment (EnvironmentType 3) so imported design days never double-count; defensive + fallback when the table/row is absent. +- `Profile.cs` — leap-year schedule generation (8784 values: ≥8784 stores pass through, + 8760 stores repeat 31 Dec, day-composed profiles tile 366 days). +- `OpenStudioConversionOptions` — new options (NorthAngleDegrees, RunPeriod*, TimestepsPerHour, + SolarDistribution, ShadowCalculationFrequencyDays, CalendarYear, IsLeapYear, + DaylightSavingsTime, DdyPath, ImportAllDesignDays, RunSizingPeriods, OutputVariableFrequency). +- Binding probes passed at build: `ZoneControlHumidistat` (C2), `WindowPropertyFrameAndDivider` + (C3), `SiteGroundTemperatureBuildingSurface`, `YearDescription` (on Model), + `RunPeriodControlDaylightSavingTime`, `ShadowCalculation`, `DesignDay`/ + `EnergyPlusReverseTranslator`, `SimulationControl.setSolarDistribution`. +- Tests: +10 (`tests/.../C4/SiteWeatherSettingsTests.cs`) — 114 → **124**. + +## C5 — Results extraction and SAM mapping (done) + +- New `Classes/OpenStudioSimulationResultSet.cs` — engine-neutral result set: annual energies + [kWh], per-zone and coincident building peaks [kW] with hour-of-year, unmet hours, gains + breakdown (people/lighting/equipment/window-solar/net-infiltration/ventilation), optional + hourly temperature/operative/humidity series (`OpenStudioRunOptions.ExtractTimeSeries`), + CLI runtime, warning/severe/fatal counts. +- `OpenStudioSimulationRunner.cs` — `ExtractResultSet`: parameterised SQL throughout, + weather-run environment filtering (peaks included), runtime measured, err-warning counts. + **Zone identity normalisation**: Ideal Loads variables key on the system name, zone-level + variables on the ThermalZone name, enclosure variables on the Space name — all remapped onto + the energy key by the shared SAM Guid suffix (verified against the live SQL). +- `SAM.Core.OpenStudio/Query/ConvertUnit.cs` — one unit authority: `JoulesToKilowattHours` + (annual), `JoulesPerIntervalToWatts` (peaks/at-peak); the ÷3.6e6-vs-÷3600 divergence is + resolved by role, not by convention. +- `SimulationSettings.cs` — output variables for unmet hours, gains and window solar + (`Enclosure Windows Total Transmitted Solar Radiation Energy` — the `Zone Windows …` name + was retired in current EnergyPlus; found via eplusout.rdd inspection). +- New `Convert/ToSAM/SimulationResults.cs` — `AnalyticalModelSimulationResult` + (consumption/peaks/area/volume) and per-space per-LoadType `SpaceSimulationResult` + (Load [W], LoadIndex [h], UnmetHours) with case-insensitive deterministic-name matching. +- New `docs/SAM_OPENSTUDIO_RESULT_MAPPING.md`. +- Bug found by the gate: an hour-of-year day-clamp (29–31 → 28) inflated coincident peaks; + fixed with `DaysInMonth`. +- Tests: +6 (`tests/.../C5/ResultsExtractionTests.cs`) — 124 → **130**. + +## C6 — Cancellation, async, Grasshopper (done) + +- `OpenStudioSimulationRunner.cs` — `CancellationToken` on both Run paths (token and timeout + share the existing Job-Object tree-kill); `RunAsync` / `Convert.ToOpenStudioAsync`; + `IProgress` stages (SavingOsm → WritingOsw → RunningCli → + ReadingResults → Complete); **unique GUID run directories by default** + (`OpenStudioRunOptions.UseUniqueRunDirectory`) with an in-progress lock-file guard + + deterministic cleanup for non-unique directories; thread-safe diagnostics (context lock). +- New `SAM.Core.OpenStudio/Classes/OpenStudioSimulationProgress.cs` (+ stage enum). +- New local GH base `GH_SamAsyncComponent` (Grasshopper project — no task-capable base exists + in the SAM ecosystem and SAM core is untouched): input-signature gating (changed inputs + cancel the stale run — never duplicate runs), optional `cancel_` input, stale-output + clearing at run start, document-reschedule harvest on the UI thread, no native OpenStudio + objects across the boundary, results disposed after harvest. Both components + (`SAMAnalyticalToOpenStudio`, `OpenStudioRunModel`) migrated. +- Rhino-process exit kills orphaned runs by design (kill-on-close Job Object). +- GH/Rhino interaction itself is validated by a human in Rhino 8 (see C7 validation steps); + everything below the component shell is test-covered headless. +- Tests: +6 (`tests/.../C6/CancellationAsyncTests.cs`) — 130 → **136**. + +## C7 — Regression, validation, documentation (done) + +- **Completeness enforcement** (`tests/.../C7/CompletenessTests.cs`): the machine-readable + manifest is enforced — every live member of the 16 covered enums has an entry (reflection; + fails on silent omission of a known property), every declared diagnostic code exists in + `OpenStudioDiagnosticCodes`, the manifest is structurally sound (unique ids, valid + statuses/milestones, documented policies for Derived/Approximated/Unsupported entries). + Clean fixtures drop nothing (0 skips, 0 unsupported diagnostics); unsupported data raises + exactly the declared diagnostics. +- **Missed C3 item recovered**: the SimpleGlazingSystem fallback (aperture constructions + without pane layers but with U/SHGC/VT performance parameters; aperture-level values take + precedence) is implemented in `Construction.cs` with two tests. New diagnostic code + `SAM-OS-RUN-002` (weather/design-day data) added per the manifest. +- **Determinism**: the same model converted twice yields identical object sets. +- **Repeated conversion + disposal**: 5× loop clean; repeated run + disposal covered in C6. +- **Performance** (this machine, Debug x64): TwoAdjacentBoxes conversion ≈ 0.4 s, 76 model + objects; SingleBox end-to-end annual run ≈ 2–4 s CLI wall-clock. MVP object counts unchanged + (pinned by the M3/M4 tests); the MVP suite ran ≈ 20 s at C0 vs ≈ 90 s now — the delta is the + ~30 additional E+ simulations, not conversion cost. +- **Simulation table** (all green, `[Category("Simulation")]`): + + | Gate | Asserts | + |---|---| + | M6 SingleBox / AirGap / TwoBoxes + CLI timeout | end-to-end energy, no fatal/severe, tree kill | + | C2 latent + humidistat | humidity output present and sane | + | C3 framed window | frame in IDF; E+ glass area = pane area | + | C4 design days ×2, north rotation ×2 | sizing on: annual unchanged; solar-gain shift | + | C5 extraction ×6 runs | peaks/unmet/gains/series/units/design-day exclusion | + | C6 cancellation ×6 runs | cancel/parallel/collision/sequential/progress | + +- **Production model**: none supplied on this machine — production validation is deferred to + the human Rhino stage below (largest synthetic fixtures validated instead). +- Docs: this file, `SAM_OPENSTUDIO_RESULT_MAPPING.md` (C5), usage guide and README updated. + +## Human validation steps (Rhino 8) + +1. Build the solution x64 Debug with Rhino **closed** (GH post-build copies to `%APPDATA%\SAM`). +2. Open Rhino 8 → Grasshopper → confirm `SAMAnalytical.ToOpenStudio` and `OpenStudio.RunModel` + load from the SAM category. +3. Feed a production SAM analytical model JSON + EPW: confirm the component reports "Running" + without blocking the UI, completes onto the outputs, honours `cancel_`, and that no + `openstudio.exe`/`energyplus.exe` processes survive a Rhino close mid-run. +4. Compare `heating`/`cooling` and the diagnostics list against the TAS production route for + the same model; attach findings to the PR review. + +## Gates log + +| Milestone | Build | Tests | EnergyPlus gate | +|---|---|---|---| +| Baseline | clean (0 errors) | 82/82 | SingleBox/AirGap/TwoBoxes end-to-end + CLI timeout kill | +| C0 | clean (docs only) | 82/82 | n/a (no code change) | +| C1 | clean (0 errors) | 93/93 | Full suite re-run incl. SingleBox/AirGap/TwoBoxes + CLI timeout | +| C2 | clean (0 errors; GH project excluded — Rhino running) | 104/104 | Latent + humidistat end-to-end (humidity output present, sane %RH range) | +| C3 | clean (0 errors; GH project excluded — Rhino running) | 114/114 | Framed window end-to-end (frame in IDF; E+ glass area = pane area 2.47 m²) | +| C4 | clean (0 errors; GH project excluded — Rhino running) | 124/124 | Design-day run (sizing on): annual results unchanged vs baseline (environment filter proven); north rotation 0°→180° shifts heating/cooling as expected | +| C5 | clean (0 errors; GH project excluded — Rhino running) | 130/130 | Extraction validated on annual + sizing-enabled runs (peaks, unmet, gains, series, units, design-day exclusion) | +| C6 | clean (0 errors, **full solution incl. GH** — Rhino closed) | 136/136 | Cancel-before/cancel-during (tree kill, no surviving process), parallel unique dirs, same-dir collision, sequential, progress stages | +| C7 | clean (0 errors, full solution) | **146/146** | Full suite (~30 E+ simulations), manifest completeness enforcement, determinism, disposal, performance | +| Review fixes (pre-Stage-C) | clean | 155/155 | `1b8cbc0` System.Data.SQLite deployment (Ideal Loads results readable); `e48352b` wind-panel outward normals | +| Stage L (review corrections) | clean (0 errors, full solution incl. GH — Rhino closed) | **170/170, 0 skipped** | Five post-fix scenario simulations (latent/humidistat, framed window, design days, north rotation, rich extraction) + cancellation tree-kill, parallel runs, disposal loop, determinism, coverage enforcement, largest fixture — all green | + +## Stage L — independent review corrections (2026-07-20) + +The independent review ([openstudio-analytical-completeness-review.md](openstudio-analytical-completeness-review.md)) +confirmed no P0, three P1 and six P2 findings; every P1 and every small in-scope P2 is fixed +in its own commit with a failing-first regression test: + +| Commit | Finding | Correction | +|---|---|---| +| `dda59b0` | P1-01 | 18 declared-but-never-emitted coverage diagnostics now fire at the InternalCondition / Aperture / Construction / Panel / Material conversion sites (8 new tests) | +| `600ef2b` | P1-02 | Default DDY import selects exactly the ASHRAE heating 99.6% + cooling .4% pair (the cooling day was never matched before; `Hum_n`/`Wind` days leaked in) | +| `ec7123f` | P1-03 | SQL hour-of-year follows the run calendar in leap years (Feb 29 no longer collapses onto Feb 28; coincident peaks no longer double-count) | +| `e5e72ff` | P2-01 | Stale-manifest-id reverse check — immediately caught 2 real stale rows; manifest corrected to **277 entries / NA 56** | +| `ff93d89` | P2-02 | `SAM-OS-RUN-003` warning when a non-hourly output frequency would mis-scale extracted peaks (frequency-aware extraction stays follow-up) | +| `d631e18` | P2-03 | SAM Location site override validated (NaN/out-of-range keeps the EPW site with a warning) | +| `68adfa4` | P2-05 | Grasshopper cancels the simulation on component removal and document close; completion continuation never targets a disposed document (human Rhino step 5) | +| `68d09f5` | P2-06 | Coverage MD/JSON encoding repaired (16 double-encoded sequences + 1 invalid byte) — both strict UTF-8 | + +P2-04 (standalone `.osw` run-directory isolation) is a recorded follow-up. + +## Human-Rhino validation corrections — embedded weather/design days (done) + +Grasshopper validation showed the conversion only ever used explicit file inputs: the +`SAMAnalytical.ToOpenStudio` component passed `null` options and required `_epwPath`, and the +`AnalyticalModelParameter.HeatingDesignDays`/`CoolingDesignDays` collections had no code +consumer at all. Source-resolution policy implemented (one coherent contract): + +``` +Explicit EPW/DDY path + overrides +AnalyticalModel embedded WeatherData/design days + overrides +documented fallback or blocking diagnostic +``` + +- `Query/EmbeddedAnnualWeatherPath.cs` — SAM WeatherData retains no source EPW path, but the + existing `Weather.Convert.ToEPW` export is verified and used when the embedded WeatherData + carries weather years (deterministic content-hash temp file, reused across runs). +- `Convert/ToOpenStudio/AnalyticalModel.cs` — weather/design-day source resolution with + Information diagnostics naming the selected source ("Annual weather source: explicit EPW / + AnalyticalModel WeatherData"; "Design-day source: explicit DDY / AnalyticalModel + heating/cooling design days / no design-day source supplied"). Explicit and embedded design + days are never merged. A supplied-but-unusable explicit path falls back to the embedded + source with a warning naming the rejected path. `OpenStudioConversionContext.EpwPath` carries + the effective path to the OSW/runner. +- `Convert/ToOpenStudio/DesignDays.cs` — embedded SAM hourly design days → + `SizingPeriod:DesignDay`: month/day validated; max dry bulb and daily range from the 24 h + profile; humidity approximated as a constant dew point at the max-dry-bulb hour (Magnus); + mean wind speed + circular-mean direction; daily-mean barometric pressure; ASHRAEClearSky + with clearness 0.0 (heating/WinterDesignDay) / 1.0 (cooling/SummerDesignDay). Every + approximation is a named warning — a day without a dry-bulb profile is skipped, never + silently downgraded. +- `Convert/ToOpenStudio/Weather.cs` — run-aware weather assignment: a missing annual EPW + source is a blocking **error** only when `_run = true`; conversion-only saves OSM/OSW with a + warning. Without any EPW the embedded WeatherData still supplies site location/elevation/time + zone and ground temperatures (an explicit EPW wins over this metadata; the SAM model Location + still overrides any weather source, P2-03 unchanged). +- `Query/EmbeddedWeatherFingerprint.cs` — deterministic content fingerprint (SAM JSON with + volatile Guids stripped → SHA-256) of the embedded WeatherData + design days; the + Grasshopper async signature keys on it, so changing embedded content on the same model Guid + triggers a new conversion. +- `SAMAnalytical.ToOpenStudio` (component 1.2.0): `_epwPath` now optional; new optional + `ddyPath_` input appended after `cancel_` (archived documents pair inputs by position — + appending keeps existing wiring); real `OpenStudioConversionOptions` with `DdyPath` is passed + instead of null; signature = model Guid + EPW + DDY + output + run + embedded fingerprint. +- SAM-core note (separate change required, **not** fixed here): + `SAMAnalytical.CreateAnalyticalModelByAdjacencyCluster` persists `weatherData_`, + `coolingDesignDays_`, `heatingDesignDays_` only when `_saveWeatherData_ = true` + (persistent default **false**), so models saved with defaults carry no embedded weather. The + required SAM change is to default `_saveWeatherData_` to true (or persist whenever the inputs + are supplied) — see the PR discussion. +- Tests: +11 (`tests/.../C4/EmbeddedWeatherDesignDaysTests.cs`) — 170 → **181**. + +## Human-Rhino validation corrections — EnergyPlus SQL timestamps (done) + +`OpenStudio.CreateDesignDaysBySQL` threw `Hour, Minute, and Second parameters describe an +un-representable DateTime` on a real `eplusout.sql`: raw SQL fields went straight into a +`DateTime` constructor (`TimeIndexDictionary.cs` did `hour - 1`, so the hour-0 sub-hourly rows +every EnergyPlus timestep output writes produced hour −1; `Query/DateTime.cs` received hour 24 +rows unmodified). + +- **Encoded convention** (verified against the live SQL): the `Time` fields denote the **end + of the reporting interval** — `Hour` 0–24, `Minute` 0–60, `Year` 0 on sizing/design-day + environments. `24:00` is midnight at the end of the day; minute 60 is the full hour; + `(0, 10)` is the interval ending 00:10. +- New authoritative helper `SAM.Core.OpenStudio/Query/TryGetDateTime.cs` — validates the + calendar date (February 29 under a non-leap calendar, month/day 0, hour > 24, minute > 60 → + structured diagnostic, never a throw, never clamped) and normalises by `TimeSpan` addition, + so day/month/year rollover (December 31 24:00, leap years) is DateTime arithmetic. + `IntervalHourOfYear` maps an interval-end timestamp to the 0-based interval index by + stepping one tick back into the interval (matches the legacy hourly convention exactly and + extends it to sub-hourly rows). +- `TimeIndexDictionary.cs` rewritten on the helper (the inverted/unused `year_Temp` default + logic removed) with an optional diagnostics sink — malformed rows are skipped and reported. + `Query/DateTime.cs` normalises through the helper and returns null on malformed rows. +- `Create/DesignDays.cs` — annual weather-run environments (EnvironmentType 3) are no longer + misread as design days; hourly indices come from interval-start semantics (the 24:00 row + stays with its design day); missing series/TimeIndex values are skipped instead of throwing + `KeyNotFoundException`; days are classified heating/cooling from the environment name; a + `diagnostics` out-parameter reports skipped rows and the no-design-days case. +- `Create/SpaceSimulationResults.cs` — peak/max/min hour indices use `IntervalHourOfYear`. +- `OpenStudio.CreateDesignDaysBySQL` (component 1.0.2) — malformed SQL rows surface as + structured runtime warnings, never a solution exception. +- Tests: +18 (`tests/.../C5/EnergyPlusTimestampTests.cs`: ordinary/hour-24/minute-60/ + hour-24+minute-60/sub-hourly-hour-0 rows, year-0 sizing rows, Feb 28, Feb 29 leap and + non-leap, Dec 31 final timestep, month-0 warmup, duplicate hour-boundary rows, synthetic + sizing-environment SQL end-to-end, annual-only SQL with the live edge rows, plus the real + 30 MB reproduction fixture gated on `SAM_OPENSTUDIO_TEST_SQL`) — 181 → **199**. + +## Human-Rhino validation corrections — AddResultsBySQL result mapping (done) + +`SAMAnalytical.AddResultsBySQL` returned no space/panel results. Three confirmed defects: +(1) the annual family was never read — only design-day `ZoneSizes` data was mapped, so an +annual-only SQL produced area/volume-only results; (2) `Create.SurfaceSimulationResults` +replaced the per-surface list with an empty one whenever no space result carried a load time +index (always the case without sizing runs); (3) EnergyPlus names +(`SAM_ThermalZone_..._`, `SAM_Surface_..._`) were matched against full +32-character Guids, so nothing ever related back to a SAM space or panel. The Grasshopper +AnalyticalModel path additionally mutated the source model's cluster in place. + +- `Modify.AddResults(AdjacencyCluster, path, out diagnostics)` rewritten: the annual family + goes through the single authoritative C5 reader (`OpenStudioSimulationRunner.ExtractResultSet` + → `ToSAM_SpaceSimulationResults`, new `IEnumerable` overload — no second SQL + implementation); the design-day `ZoneSizes` family is kept when sizing ran; surface results + keep one `SurfaceSimulationResult` per engine surface (an internal panel's two engine + surfaces produce two results on the same panel — never summed). Zone/surface names resolve + by deterministic Guid suffix (`Query.TryGetGuidSuffix`/`GuidSuffix`), then full-Guid + reference, then sanitized name — never by display name alone. +- Zero-vs-missing: a genuine zero peak stays a valid result; only a zone absent from the SQL + is diagnosed. Unmatched SQL zones/surfaces and result-less SAM spaces/panels are both + reported through structured diagnostics surfaced as Grasshopper warnings. +- Rerun safety: identical results (type, name, reference, load type) from the same source are + not duplicated; relations are ensured. +- `SAMAnalytical.AddResultsBySQL` (component 1.0.5): clones the input cluster before attaching + (non-mutating convention); `panelSimulationResults` output name retained (SAM class + `SurfaceSimulationResult`, documented); diagnostics surfaced; version bump. +- `Create/PanelSimulationResults.cs`: the per-surface base list survives when no space result + carries a load time index (the empty-list defect). +- Tests: +9 (`tests/.../C5/AddResultsBySqlTests.cs`: one-zone attach+relate, two-zone internal + panel identity, duplicate sanitized names, zero-vs-missing, rerun dedup, annual+design-day + separation, save/reload serialization, non-mutating component path, real-fixture gate) — + 199 → **208**. Plus one end-to-end EnergyPlus gate (embedded weather + embedded design days + → run → SQL → results) — **209**. Result-mapping doc updated with the + attachment/aggregation rules. + +## Final summary + +- Tests: 82 (MVP) ��' 146 (C7) ��' 170 (Stage L) ��' **209 after the human-Rhino validation + corrections** (0 skipped, 2 environment-gated); every milestone and every review fix gated + by x64 Debug build + full suite + E+ runs. +- Coverage (277 manifest entries after review P2-01 removed two stale rows): **Native 135, + Derived 28, Approximated 21, Unsupported 20, Deferred 17, NA 56**. Translated-or-diagnosed: + every entry with energy semantics has a Native/Derived/Approximated mapping or a declared + Unsupported diagnostic; nothing is silently dropped (enforced by the C7 completeness tests + against the manifest, in both directions since the Stage L review). +- Known limitations: dividers/muntins N/A (no SAM data); blinds/shades and opening properties + unsupported (no geometry; HVAC domain); SAM hourly design days approximated (DDY import is + the deterministic path); emitter characteristics and exhaust flows deferred to the HVAC + programme (now reported with SAM-OS-HVAC-001 deferral diagnostics); STAT parsing deferred; + DST default off; Ideal Loads remains the simulation system. Review follow-ups: standalone + `.osw` run-directory isolation (P2-04) and frequency-aware peak extraction (P2-02). +- Branch `feature/openstudio-analytical-completeness`; no PR opened. Review recommendation: + **READY** for human Rhino validation (checklist in the review document §10), then PR. diff --git a/docs/openstudio-mvp-audit.md b/docs/openstudio-mvp-audit.md new file mode 100644 index 0000000..e40f434 --- /dev/null +++ b/docs/openstudio-mvp-audit.md @@ -0,0 +1,66 @@ +# OpenStudio MVP — M0 toolchain audit + +**Date:** 2026-07-18 +**Branch:** `feature/analytical-model-to-openstudio-mvp` (off `sow/2026-Q3` @ 94dfce9) +**Plan:** [SAM_OpenStudio_MVP_Implementation_Plan.md](SAM_OpenStudio_MVP_Implementation_Plan.md) + +## 1. SDK / CLI version gate — DECISION: OpenStudio 3.10.0 + +| Fact | Value | +| --- | --- | +| NuGet versions available | …, 3.7.0, 3.8.0, 3.10.0, 3.11.0 (no 3.9.0) | +| Previous SDK reference | 3.8.0 (all three library projects) | +| Installed CLI + EnergyPlus | **3.10.0+86d7e215a1** at `C:\Program Files\ladybug_tools\openstudio\bin\openstudio.exe` | +| Action taken | Bumped NuGet `OpenStudio` 3.8.0 → **3.10.0** in `SAM.Core.OpenStudio`, `SAM.Geometry.OpenStudio`, `SAM.Analytical.OpenStudio` | +| Result | Full solution rebuild: **0 errors**; existing SQL-results code compiles unchanged; smoke tests pass | + +Rationale: exact SDK/CLI match removes OSM version translation from the production path +(the pre-existing `Create.Model` uses `Model.load`, which does **not** version-translate). +The CLI smoke test still exercises `OSVersion::VersionTranslator` for robustness. + +## 2. Toolchain environment (this machine) + +- .NET SDK 10.0.302; runtimes include .NET 8.0.14 → net8.0 test project runs natively. +- SAM prebuilt assemblies present at `..\SAM\build\` (SAM.Core/Geometry/Analytical/Weather) — consumed via existing HintPath convention; sibling repos untouched. +- Rhino 8 installed (`C:\Program Files\Rhino 8`) → the mandatory pre-PR Rhino smoke test is feasible on this machine. +- **Platform constraint:** the OpenStudio NuGet `build\netstandard2.0\OpenStudio.targets` raises an *error* unless `$(Platform)` is `x64` or `x86`. All builds/tests must pass `-p:Platform=x64` (the test project also defaults its own Platform to x64, mirroring the Grasshopper projects). +- Package layout: managed `OpenStudio.dll` + native `openstudiolib.dll`, `openstudio_csharp.dll`, `openstudio_model_csharp.dll`, `openstudio_translators_csharp.dll` under `build\netstandard2.0\x64\`, injected as Reference + copied as Content → natives flow transitively to test and Grasshopper outputs. + +## 3. M0 smoke tests (both green) + +`tests\SAM.Analytical.OpenStudio.Tests\M0\OpenStudioSmokeTests.cs`, run with +`dotnet test tests/SAM.Analytical.OpenStudio.Tests/SAM.Analytical.OpenStudio.Tests.csproj -c Debug -p:Platform=x64`: + +1. `OpenStudio_CreateSaveReload_RoundTrips` — creates `Model` + `Space` + `ThermalZone`, saves OSM, reloads via the existing `SAM.Core.OpenStudio.Create.Model`, asserts counts and preserved names. Proves managed + native x64 bindings under net8.0 outside Rhino. +2. `OpenStudioCli_Discovered_And_OpensGeneratedOsm` — discovers the CLI via the new `Query.OpenStudioCliPath` (explicit → PATH → direct installs → ladybug_tools), checks `openstudio_version`, then has the CLI load the SDK-generated OSM through `OSVersion::VersionTranslator` in a ruby script (`execute_ruby_script`) and verify the space count. Proves SDK↔CLI interop. + +## 4. Existing code audit (keep / reuse map) + +| Area | Files | Verdict | +| --- | --- | --- | +| SQL result reading (`SAM.Core.OpenStudio`) | `Create\SqlFile.cs`, `Create\Model.cs`, `Create\ShortDateTime.cs`, `Classes\ShortDateTime.cs`, `Convert\ToSystem\*.cs`, `Enums\ReportingFrequency.cs`, `Query\ReportData*.cs`, `Query\AvailableTimeSeriesNames.cs`, `Query\AvailableEnviromentPeriodsNames.cs`, `Query\EnvironmentPeriodIndex.cs`, `Query\TimeIndex*.cs`, `Query\DateTime.cs`, `Query\SurfaceIndexes.cs`, `Query\SurfaceNames.cs`, `Query\ConvertUnit.cs`, `Query\Units.cs`, `Query\Values.cs`, `Query\Min.cs`, `Query\Max.cs` | **Keep — reuse in M6** load extraction | +| Results import (`SAM.Analytical.OpenStudio`) | `Convert\ToSAM\SpaceSimulationResults.cs`, `Convert\ToSAM\PanelSimulationResults.cs`, `Create\SpaceSimulationResults.cs`, `Create\PanelSimulationResults.cs`, `Create\DesignDays.cs`, `Query\DesignDays.cs`, `Query\PanelSimulationResults.cs`, `Query\Source.cs`, `Modify\AddResults.cs`, `Enums\Parameter\*.cs` | **Keep — reuse in M6** | +| Geometry stub | `SAM.Geometry.OpenStudio\Classes\Test.cs` | **Removed** (empty placeholder; real content lands in M2) | +| Grasshopper | `OpenStudioCreateDesignDaysBySQL`, `OpenStudioCreateSpaceSimulationResultsBySQL`, `SAMAnalyticalAddResultsBySQL` | **Keep** (modernised upstream in 94dfce9); new converter components land in M8 | + +Improvement noted, deliberately not changed now: `Create.Model` loads OSM without +`VersionTranslator`; acceptable while SDK == CLI == 3.10.0. The M6 runner will use +`VersionTranslator` where it loads foreign OSM files. + +## 5. Weather fixture (pinned) + +`tests\resources\weather\` — Boston Logan Intl AP (WMO 725090), TMYx 2004-2018, +`.epw` + `.ddy` + `.stat`, SHA-256 in `SHA256SUMS.txt`, provenance and licence in the +folder `README.md`. Committed (no downloads at test time). Boston chosen over a mild UK +climate so the conditioned fixture produces non-zero annual heating **and** cooling — +required by the M6 gate. + +## 6. Known warnings / accepted debt + +- `MSB3277` System.Memory 4.0.1.2 vs 4.0.2.0 unification warning in + `SAM.Analytical.OpenStudio` — **pre-existing on the 3.8.0 baseline**, unchanged by + 3.10.0; originates from `SAM\build\NetTopologySuite.dll` vs the System.Memory 4.5.5 + package; benign for a netstandard2.0 library (final unification happens in the + consuming app). Out of MVP scope. +- Repository has no `.gitattributes`; git reports LF→CRLF normalisation notices on new + files. Cosmetic. diff --git a/docs/openstudio-mvp-review.md b/docs/openstudio-mvp-review.md new file mode 100644 index 0000000..4f0cd7d --- /dev/null +++ b/docs/openstudio-mvp-review.md @@ -0,0 +1,539 @@ +# SAM → OpenStudio MVP — independent review + +**Reviewer:** independent senior C# building-performance engineer +**Date:** 2026-07-19 +**Branch:** `feature/analytical-model-to-openstudio-mvp` (base `sow/2026-Q3` @ 94dfce9) +**Contract:** [SAM_OpenStudio_MVP_Implementation_Plan.md](SAM_OpenStudio_MVP_Implementation_Plan.md) +**Method:** every claim in [openstudio-mvp-status.md](openstudio-mvp-status.md) treated as unverified +until reproduced. All ten commits inspected individually; every changed production and test file +read in full; SAM sources and the SAM_LadybugTools reference converters read for every unit, +orientation convention and parameter semantic; EnergyPlus I/O Reference used to settle glazing +front/back semantics. + +--- + +## 1. Executive summary + +The implementation is architecturally faithful to the plan: responsibilities are correctly +separated across `SAM.Core.OpenStudio` / `SAM.Geometry.OpenStudio` / `SAM.Analytical.OpenStudio` / +thin Grasshopper components; no Honeybee/Ladybug dependency was introduced; the source +`AnalyticalModel` is deep-copied before preprocessing and is not mutated; adjacency is driven by +SAM topology (never geometric matching); constructions are mirrored correctly on internal pairs; +SQL extraction was independently cross-checked and is exact. + +Five P1 findings and two P2 findings were confirmed by reproduction in the original review pass +(each with executable evidence below). No P0 finding exists: nothing crashes the converter, +corrupts results or endangers the repository in the tested paths. **All seven findings are +resolved**, each in its own commit with a regression test. + +A real Rhino 8 Grasshopper smoke test was then performed by the user: deployment succeeded +(GHA loads, both components appear and execute, OSM/OSW generated, CLI starts, no native-DLL or +assembly errors), but the real SAM model failed fatally in EnergyPlus on opaque gas cavities — +recorded and resolved as **P1-06**. + +| ID | Priority | Finding | Status | +| --- | --- | --- | --- | +| P1-01 | P1 | Weekly (day-composed) profiles were tiled Monday-first with no alignment to the run calendar; with the pinned EPW (Jan 1 = Sunday) every weekday/weekend pattern landed on the wrong calendar day | Resolved `4d28513` | +| P1-02 | P1 | Profiles with more than 8760 values (leap year 8784) or multi-day flat sequences were silently block-averaged into a single "average day" — silent schedule corruption | Resolved `1971bdc` | +| P1-03 | P1 | `SpaceType` deduplication by sanitized name silently merged two internal conditions that share a name but differ in gains or profiles | Resolved `f46c98f` | +| P1-04 | P1 | Glazing front/back optical properties were swapped relative to EnergyPlus semantics (SAM `Internal*` written to the E+ *front* = exterior-facing side) | Resolved `fea508f` | +| P1-05 | P1 | CLI runner: `TimeoutSeconds` never fired while the process ran (proven: 120.6 s block with a 5 s timeout); sequential `ReadToEnd()` on both pipes could deadlock; process tree not killed | Resolved `20b2b85` | +| P1-06 | P1 | SAM `GasMaterial` in opaque constructions was converted to `OS:WindowMaterial:Gas`, which reports R = 0.000 to EnergyPlus `InitConductionTransferFunctions` → fatal (the real Rhino smoke-test model) | Resolved `fd2c0a7` — real Rhino retest passed | +| P2-01 | P2 | Self-intersecting polygons with non-zero signed area were accepted silently and became invalid EnergyPlus surfaces | Resolved `add236f` | +| P2-02 | P2 | `SanitizeName` kept `'` and `"`; such names broke the SQL extraction query and the zone's results were silently dropped | Resolved `8c3367f` | + +Environment note: the prebuilt SAM/SAM_SQLite assemblies under `SAM\build` and +`SAM_SQLite\build` were missing on this machine (only third-party DLLs present). They were +rebuilt **without modifying sibling source**: +`dotnet build ..\SAM\SAM.sln -c Debug` and `dotnet build ..\SAM_SQLite\SAM_SQLite.sln -c Debug` +(default platform; both completed with 0 errors; sibling git trees remained clean before and +after). The same wipe recurred twice more during the session (an unrelated concurrent process on +this shared machine — see §10) and was repaired the same way each time. No sibling source file +was changed, committed or otherwise altered. + +## 2. Baseline reproduced + +| Item | Claimed | Reproduced | +| --- | --- | --- | +| Build | 0 errors | `dotnet build SAM_OpenStudio.sln -c Debug -p:Platform=x64` — **0 errors**, only the pre-existing benign MSB3277 `System.Memory` warning (audit §6) | +| Tests | 56/56 | `dotnet test tests/SAM.Analytical.OpenStudio.Tests -c Debug -p:Platform=x64` — **56/56 passed, 0 skipped** | +| SDK | OpenStudio NuGet 3.10.0 | Confirmed in all three library csproj files | +| CLI | 3.10.0+86d7e215a1 | `openstudio openstudio_version` → `3.10.0+86d7e215a1` at `C:\Program Files\ladybug_tools\openstudio\bin\openstudio.exe` | +| E2E runs | two complete simulations | Three independent runs executed outside the test suite (temp driver), all exit 0, 0 fatal, 0 severe | +| SQL extraction | DISTINCT KeyValue sums, kWh | Cross-checked with an independent SQLite query (below) — exact match | +| Source mutation | none | M7 test passes; copy-constructor chain inspected (`AnalyticalModel` → `AdjacencyCluster` → panels) | +| Honeybee runtime | none | No Honeybee/Ladybug reference in any changed project | +| Committed artifacts | none | `git ls-files` — no binaries/run directories; only the intentionally pinned weather files | +| SPDX headers | all new files | All 58 changed `.cs` files carry the header (`Test.cs` appears in the diff only because it was deleted) | + +Independent three-simulation baseline (driver: temp console app calling the public API with the +repository fixtures; paths contain spaces — quoting therefore exercised): + +| Fixture | OSM | exit | fatal | severe | zones w/ results | heating kWh | cooling kWh | duration | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| SingleBox (one conditioned zone) | `runs\single_box\Single_Box_Model.osm` | 0 | 0 | 0 | 1/1 | **2621.7** | **1745.0** | 3.9 s | +| TwoAdjacentBoxes (two zones, internal wall) | `runs\two_adjacent\Two_Box_Model.osm` | 0 | 0 | 0 | 2/2 | **4875.0** | **2830.8** | 2.8 s | +| TwoStackedBoxes (stacked, shared floor) | `runs\two_stacked\Two_Stacked_Box_Model.osm` | 0 | 0 | 0 | 2/2 | **1538.2** | **2563.6** | 2.6 s | + +SQL cross-check (independent Python/sqlite3 query on `two_adjacent\run\eplusout.sql`): + +```text +EnvironmentPeriods: (1, 'SAM_RUNPERIOD_ANNUAL', type=3 weather-run) <- single period, no design days +RDD: one Hourly row per zone per variable, units J +SUM(ReportData) per zone: H 2403.28 / 2471.67 kWh, C 1737.41 / 1093.42 kWh — identical to the runner output +8760 ReportData rows per zone/variable; J -> kWh / 3.6e6 verified +``` + +The runner's per-`KeyValue` `SUM` is therefore correct for the MVP configuration (no sizing +periods → single environment period → no double counting; `DISTINCT KeyValue` cannot discard +valid data because each zone/variable has exactly one dictionary row). + +OSM artifact checks (two_adjacent): `OS:WeatherFile … Start Day of Week = Sunday` (from the +EPW `DATA PERIODS` line); Forward/Reverse constructions carry mirrored material handles +(Brick/Insulation/Plasterboard ↔ Plasterboard/Insulation/Brick); pane construction Glass/Air/Glass. + +--- + +## 3. P0 findings + +None. + +--- + +## 4. P1 findings + +### P1-01 — Weekly-profile day-of-week misalignment + +- **Priority:** P1 +- **Summary:** Day-composed (weekly) SAM profiles were expanded assuming day 0 (1 Jan) is the + first sub-profile ("Monday-first", LadybugTools `ScheduleRuleset` parity). The run calendar's + actual start weekday comes from the EPW (Boston TMYx: **Sunday**) and was never consulted, so + every weekly pattern was shifted by up to six days relative to the weather calendar. +- **Affected files:** `SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Profile.cs` + (`AnnualHourlyValues`); `SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/AnalyticalModel.cs` + (full-pipeline overload never derived the start weekday). +- **Technical explanation:** SAM weekly profiles are 168-hour cycles whose de-facto convention + (via SAM_LadybugTools `ScheduleRuleset.cs:73-96`) maps sub-profile 0 → Monday … 6 → Sunday, and + EnergyPlus aligns that ruleset to real calendar weekdays from the weather file. The MVP baked + the pattern into a `ScheduleFixedInterval` starting 1 Jan with `dailyValues[dayIndex % 7]` — + correct only when 1 Jan is a Monday. +- **Reproduction evidence:** weekly profile Mon=1/Sun=0 converted and inspected: + `day0 (1 Jan, a Sunday per the EPW) = 1` (should be 0), `day7 (Sunday) = 1` (should be 0); + `day1` and `day6` happened to match. Generated OSM shows `OS:WeatherFile, Start Day of Week = Sunday`. + Fixture profiles are all day-uniform, so no existing test could see this. +- **Impact on generated OSM / results:** for any real SAM model with weekday/weekend profiles, + occupancy, lighting, equipment, infiltration and setpoint patterns landed on wrong calendar + days (weekend gains on weekdays and vice versa). Annual totals were preserved; daily/hourly + loads and peak timing were wrong. +- **Recommended correction:** derive the run start weekday from the EPW + (`EpwFile.startDayOfWeek().value()`, Sunday=0) in the full-pipeline overload, expose an explicit + override on `OpenStudioConversionOptions`, carry a Monday=0 offset on the conversion context and + index `dailyValues[(dayIndex + offset) % 7]`; default offset 0 (Monday) keeps the geometry-only + overload backward compatible. +- **Required regression test:** weekly profile where Monday ≠ weekend values, converted through the + EPW pipeline (Jan 1 = Sunday): schedule day 0 must equal the weekend value, day 1 the Monday + value; plus an override-path test. +- **Status:** **Resolved** — commit `4d28513`. + +### P1-02 — >8760-value and multi-day flat profiles silently squashed + +- **Priority:** P1 +- **Summary:** `DayHourlyValues` block-averaged any flat profile whose value count is a multiple + of 24 into 24 hourly values. An 8784-hour leap-year profile (block 366) or a 168-hour weekly + sequence (block 7) became one synthetic "average day" tiled 365 times — with **no diagnostic**. +- **Affected files:** `SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Profile.cs:168-279`. +- **Technical explanation:** SAM's own annual-expansion semantics are cyclic tiling at the + profile's own period (`Profile.GetYearlyValues()` → `GetValues(Range(0,8759))` with + `BoundedIndex` wrapping; identical to the `profile[i]` indexer, SAM `Profile.cs:1207-1237`). + The MVP's documented rules 3–5 (hold / block-average / tile-with-warning) diverged from that + and, for any count > 24 that is a multiple of 24, destroyed the sequence silently. The plan + (§10) requires "explicitly handle leap years; validate expected value counts". +- **Reproduction evidence:** 8784-value profile with an 08–18 daily pattern converted: schedule + `SAM_Schedule_Leap_Occupancy_*` contained `hour0 = 0.4126` — an average of 366 source values — + instead of the real pattern; zero diagnostics raised. +- **Impact:** leap-year or multi-day profiles lost their entire temporal pattern; gains and + setpoints became flat average days. Silent. +- **Recommended correction:** replace rules 3–5 with SAM-native semantics: 8760 → as-is; + >8760 → first 8760 hours with a `SAM-OS-SCH-001` **warning** (documented non-leap policy); + otherwise tile cyclically through the SAM indexer (`profile[i]`, which already wraps within + Min..Max) — identical to `GetYearlyValues()`. Day sub-profiles expand per hour with the same + indexer. Update `docs/SAM_OPENSTUDIO_INTERNAL_CONDITION_MAPPING.md`. +- **Required regression test:** 8784-value profile → schedule hours 0..8759 equal the source's + first 8760 values, warning raised; 168-value weekly sequence preserved hour-for-hour (not + averaged); 24-value daily unchanged; gappy profile → error. +- **Status:** **Resolved** — commit `1971bdc`. + +### P1-03 — Same-named internal conditions merged into one SpaceType + +- **Priority:** P1 +- **Summary:** `SpaceType` deduplication keyed on the sanitized internal-condition **name only**. + Two conditions sharing a name but differing in parameters or profile references silently shared + the first condition's loads. +- **Affected files:** `SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/InternalCondition.cs:30-45`. +- **Technical explanation:** SAM's `Space.InternalCondition` setter clones with a new Guid + (`SAM.Analytical/Classes/Space.cs:94`), so Guid-keying cannot dedup true clones — but + SAM_LadybugTools dedups per-Guid (`Model.cs:243-258`; `UniqueName` includes `guid8`), i.e. the + reference implementation **never merges** distinct objects. The mapping doc's "same semantics as + SAM_LadybugTools" claim was inaccurate. Name-only keying merged genuinely different conditions + (same library name redefined in another library; same name re-parameterised; names that + sanitize identically). +- **Reproduction evidence:** two-box fixture; Space B given a condition also named `Office` but + with `LightingGainPerArea = 99` (Space A: 8). Result: **one** `SpaceType` + (`SAM_InternalCondition_Office`), both spaces referencing it — Space B silently simulated at + 8 W/m² instead of 99 W/m². +- **Impact:** wrong loads for every space whose condition collided by name; silent. +- **Recommended correction:** keep name-based readability but qualify the key with a deterministic + content hash: serialise the condition via `ToJsonObject()`, recursively drop `Guid` properties + (clone-safe), hash (MD5, first 8 hex) and form `SAM_InternalCondition__`. + Identical clones still dedup (proven: clone → identical JSON); different content splits + (proven: gains change → different JSON). Over-splitting on formatting noise is the safe + direction (correct results, merely not shared). +- **Required regression test:** same name / different gains → two SpaceTypes with correct per-space + W/m²; same name / identical content → one SpaceType; determinism across conversions. +- **Status:** **Resolved** — commit `f46c98f`. + +### P1-04 — Glazing front/back optical properties swapped + +- **Priority:** P1 +- **Summary:** SAM `InternalSolarReflectance` / `InternalLightReflectance` / `InternalEmissivity` + were written to the EnergyPlus **Front** side and the `External*` values to the **Back** side. + EnergyPlus defines Front as "the side of the layer opposite the zone" (exterior-facing for + exterior windows) — i.e. SAM `External*` must map to Front and `Internal*` to Back. +- **Affected files:** `SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Material.cs`; + `docs/SAM_OPENSTUDIO_MATERIAL_MAPPING.md` (glazing table). +- **Technical explanation:** EnergyPlus I/O Reference, *Materials for Glass Windows and Doors*: + "'Front side' is the side of the layer opposite the zone in which the window is defined… for + exterior windows, 'front side' is the side closest to the outdoors." SAM parameter descriptions + are explicit ("External Emissivity", "Internal Solar Reflectance"). The implementation mirrored + `SAM_LadybugTools/EnergyWindowMaterialGlazing.cs:19-26`, which carries the same inversion; the + mapping doc flagged exactly this assignment for independent review. Symmetric glass (including + the fixture's 0.07/0.07, 0.84/0.84) is unaffected, which is why no test caught it. +- **Reproduction evidence:** code inspection + E+ documentation (quoted above); the generated OSM + showed identical front/back values only because the fixture glass is symmetric. +- **Impact:** for coated or otherwise asymmetric glazing (the norm for real low-e products), solar + reflectance and IR emissivity were applied to the wrong pane faces: wrong gap heat transfer, + wrong solar heat gain, wrong U-value behaviour. Material simulation risk — P1 per the rubric. +- **Recommended correction:** swap the six assignments (Front ← `External*`, Back ← `Internal*`), + document the deliberate deviation from SAM_LadybugTools (with the E+ citation) in the mapping + doc. +- **Required regression test:** asymmetric glass (internal emissivity 0.05 / external 0.84; + internal reflectance 0.11–0.12 / external 0.31–0.32) → front/back assignments verified for all + six fields. +- **Status:** **Resolved** — commit `fea508f`. + +### P1-05 — CLI timeout ineffective; pipe-read deadlock risk; no process-tree kill + +- **Priority:** P1 +- **Summary:** `ExecuteCli` read `StandardOutput.ReadToEnd()` then `StandardError.ReadToEnd()` + and only then called `WaitForExit(timeout)`. While the child ran, `ReadToEnd()` blocked: the + timeout was never evaluated, and if the child filled the stderr pipe buffer while stdout stayed + open, parent and child deadlocked permanently. +- **Affected files:** `SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/OpenStudioSimulationRunner.cs:251-286`. +- **Technical explanation:** the classic redirected-pipes pattern requires asynchronous reads (or + a reader thread per stream) **before** waiting with a timeout. Here the timeout only applied + after both streams reached EOF — i.e. after the process had already exited. The plan (§11) + requires "CLI process execution with timeout and cancellation". On timeout only the root + process could be killed; the CLI's EnergyPlus child would be orphaned (Windows has no managed + tree-kill; a Job Object with `JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE` is the correct mechanism). +- **Reproduction evidence:** fake `openstudio.exe` (sleeps 120 s, writes 100 bytes) run through + the public API with `TimeoutSeconds = 5`: the call returned after **120.6 s** with + `ExitCode = 0` — the timeout never fired. +- **Impact:** a hung CLI froze the caller (including the Grasshopper UI thread) indefinitely; + under output-heavy failure modes the run could deadlock even without a hang. In Rhino this is + a UI-blocking failure exactly where the components are used. +- **Recommended correction:** `BeginOutputReadLine`/`BeginErrorReadLine` into StringBuilders; + `WaitForExit(timeoutMs)`; on timeout terminate via a best-effort Job Object (fallback + `Kill()`), drain with a final parameterless `WaitForExit()`, return exit −1 and a `TIMEOUT` + diagnostic; err-file parsing best-effort after a kill (file can be locked/partial). +- **Required regression test:** real CLI, one-zone fixture, `TimeoutSeconds = 1` → run fails with + a timeout diagnostic and exit −1 in bounded time, and no `energyplus`/`openstudio` process + survives (bounded poll). +- **Status:** **Resolved** — commit `20b2b85`. Manual re-verification: the same 120 s sleeper now + dies at 5.7 s with exit −1. + +### P1-06 — Opaque gas cavities became WindowMaterial:Gas (fatal in EnergyPlus) + +- **Priority:** P1 +- **Summary:** every SAM `GasMaterial` was converted to `OpenStudio.Gas` + (`OS:WindowMaterial:Gas`) regardless of context, and the construction converter used the same + material path for opaque `Construction` layers and `ApertureConstruction` pane layers. + `OS:WindowMaterial:Gas` is only valid in fenestration constructions; inside an opaque + construction EnergyPlus computes R = 0.000 for it and aborts. +- **Affected files:** `SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Material.cs` + (single gas path); `SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Construction.cs` + (usage-blind material resolution). +- **Technical explanation:** SAM models an opaque air/gas cavity as a *resistive* layer: + `GasMaterialParameter.HeatTransferCoefficient` holds the cavity conductance h [W/m²K] + (SAM `Query.HeatTransferCoefficient`: "Heat Transfer Coefficient (Thermal Conductance) + [W/m2K]"; written by `Query.UpdateHeatTransferCoefficients` from gas type, thickness and + tilt via `AirspaceConvectiveHeatTransferCoefficient` for opaque air cavities), and + `Query.AirspaceThermalResistance` defines the opaque-construction airspace model per + BS EN ISO 6946:2017. EnergyPlus' opaque-cavity equivalent is `OS:Material:AirGap` + (a resistance-only layer, R [m²K/W]); the fenestration equivalent is + `OS:WindowMaterial:Gas` (gas type + thickness, valid only between glazing panes). +- **Reproduction evidence (real Rhino 8 smoke test, 2026-07-19):** deployment succeeded (GHA + loads; `SAMAnalytical.ToOpenStudio` and `OpenStudio.RunModel` appear and execute; OSM/OSW + created; CLI started; no native-DLL or assembly errors). EnergyPlus then failed fatally + (`SAM_daily\2026-07-19 OpenStudio\simulation\run\eplusout.err`): + `** Severe ** InitConductionTransferFunctions: Material=SAM_GASMATERIAL_AR90UP_AIR_50MM_1.25W/M2K_50MM_8484B96E R Value below lowest allowed value … Lowest allowed value=[1.000E-003], Material R Value=[0.000]` + (twice, wall `SIM_EXT_SLD`), and the same for `…_1.95W/M2K_…` (roof `SIM_EXT_SLD_Roof`), + `** Fatal ** Program terminated for reasons listed (InitConductionTransferFunctions)`. + The generated OSM/IDF show `OS:WindowMaterial:Gas, Air, 0.05 m` as layers of the opaque + constructions `SIM_EXT_SLD_Forward` (layers 2 and 5) and `SIM_EXT_SLD_Roof_Forward` (layer 4). +- **Impact:** any real SAM model with opaque gas cavities (a standard SAM construction pattern) + produced an un-runnable EnergyPlus model. Material simulation risk — P1. +- **Recommended correction:** explicit `OpenStudioMaterialUsage` context: opaque → + `OpenStudio.AirGap` with **R = 1/h** from `GasMaterialParameter.HeatTransferCoefficient` + (validated: present, finite, > 0, R ≥ 0.001 m²K/W, else SAM-OS-MAT-001 before CLI); + fenestration → `OpenStudio.Gas` unchanged. Material cache keys include the usage + (`:OpaqueAirGap:` / `:WindowGas:`); construction-level family + validation rejects `Gas` in opaque sets, `AirGap` in pane sets and mixed families; no silent + layer omission. +- **Required regression tests:** cavity becomes AirGap; h = 1.25 → R = 0.8 m²K/W; h = 1.95 → + R ≈ 0.5128205 m²K/W; pane gas stays Gas (type + thickness); same GasMaterial in both contexts + → two distinct objects/cache entries; missing conductance → SAM-OS-MAT-001; R below the E+ + minimum → SAM-OS-MAT-001; glazing layer in an opaque construction rejected; end-to-end + EnergyPlus run of an opaque-air-gap fixture (exit 0, SQL present, no fatal/severe, finite + loads). +- **Status:** **Resolved** — commit `fd2c0a7`. + - *Before (generated object, real model):* `WindowMaterial:Gas, …Ar90Up_Air_50mm_1.25W/m2K…, Air, 0.05` as layers of the opaque constructions `SIM_EXT_SLD` (layers 2/5) and `SIM_EXT_SLD_Roof` (layer 4) → `InitConductionTransferFunctions` severe ×3 → fatal, SQL not produced, CLI exit 1. + - *After (generated object, real model):* `Material:AirGap, …Ar90Up_Air_50mm_1.25W/m2K…, 0.8` and `Material:AirGap, …Ar90Up_Air_50mm_1.95W/m2K…, 0.512820512820513` (R = 1/h); zero `WindowMaterial:Gas` in the model. + - *Automated regression evidence:* 9 tests in `GasMaterialUsageTests` + `AirGapConstruction_EndToEnd_EnergyPlusRun_MeetsResultGate` (exit 0, SQL present, 0 fatal, 0 severe, R = 0.8 m²K/W, heating 4953.6 / cooling 1555.5 kWh, independently re-verified from the SQL). + - *Real Rhino retest evidence (user-performed, 2026-07-19, `simulation-fixed`):* GHA loads; both components execute; real model converted; OSM/OSW generated; CLI completed (`finished.job` — "Finished Workflow"; `EnergyPlus Completed Successfully`); SQL produced; **fatal 0, severe 0**; no R-value error; **heating 3758.36 kWh** (verified from SQL; component displayed 3758.359753 kWh); **cooling 0.00 kWh — genuinely present** (8760 hourly rows summing to 0, not missing); 1 conditioned-zone result = conditioned-zone count; only the documented `SAM-OS-IC-001` latent-equipment warning plus non-blocking EnergyPlus warnings (§12 of the status doc). + +--- + +## 5. P2 findings + +### P2-01 — Self-intersecting polygons accepted silently + +- **Priority:** P2 +- **Summary:** `ValidatePolygon` checked duplicates, collinearity, planarity and minimum area, + but never self-intersection. A planar self-intersecting polygon with non-zero signed area + (e.g. a star pentagon) passed without diagnostics; a bowtie was caught only accidentally (its + signed area is ~0). +- **Affected files:** `SAM_OpenStudio/SAM.Geometry.OpenStudio/Query/ValidatePolygon.cs:24-61`. +- **Reproduction evidence:** star polygon (0,0)(10,0)(3,8)(5,-4)(7,8), signed area 48 m² → + validation returned **no diagnostics**; bowtie → `SAM-OS-GEO-001` via the degenerate-normal + path. +- **Impact:** invalid EnergyPlus surfaces (wrong area/shadowing or E+ geometry errors downstream) + from geometry the converter claimed to have validated. +- **Recommended correction:** proper-crossing segment-intersection test in the polygon plane + (O(n²), ignore shared endpoints, tolerance-aware touch detection) → `SAM-OS-GEO-001` error. +- **Required regression test:** star and bowtie rejected with `SAM-OS-GEO-001`; concave L-shape + and the full fixture set unaffected. +- **Status:** **Resolved** — commit `add236f`. + +### P2-02 — Apostrophes/quotes survive name sanitization and break SQL extraction + +- **Priority:** P2 +- **Summary:** `SanitizeName` stripped `,` `;` `!` whitespace/control chars but kept `'` and `"`. + Those characters flowed into zone/system names and then into the SQL + `WHERE rdd.KeyValue = '…'` literal, breaking the query; the zone was then silently omitted from + the load summary (`execAndReturnFirstDouble` fails → `continue`). +- **Affected files:** `SAM_OpenStudio/SAM.Core.OpenStudio/Query/SanitizeName.cs:29`; + `SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/OpenStudioSimulationRunner.cs:314-335`. +- **Reproduction evidence:** code inspection (sanitizer set; SQL string built with raw `'` + quoting). +- **Impact:** zones with apostrophes in SAM space names lost their results silently (result count + < conditioned-zone count with no diagnostic). +- **Recommended correction:** add `'` and `"` to the sanitized set (underscore-collapsed like the + rest). The SQL query stays simple and the deterministic-name contract is unchanged. +- **Required regression test:** `SanitizeName("O'Brien \"Annex\"")` contains neither quote + character; a space named `O'Brien` produces a valid deterministic name. +- **Status:** **Resolved** — commit `8c3367f`. + +--- + +## 6. P3 observations (recorded, not fixed in this round) + +| # | Observation | Location | +| --- | --- | --- | +| P3-01 | `IsConditioned` uses culture-sensitive `ToLower()` (Turkish-ı edge); LadybugTools has the same pattern — move to `ToLowerInvariant()` later | `Query/IsConditioned.cs:31` | +| P3-02 | SpaceType-level load densities and infiltration are evaluated for the first space of a shared condition (documented approximation; per-area bases scale correctly for identical conditions) | `Convert/ToOpenStudio/InternalCondition.cs` | +| P3-03 | Internal-pair side assignment (forward → first-created side) is the mirror opposite of LadybugTools' side choice; both are valid E+ mirrors and SAM defines no partition side semantics | `Convert/ToOpenStudio/AnalyticalModel.cs:341-356` vs `Face.cs:40-48` reference | +| P3-04 | `ScheduleMap` is keyed by profile Guid only; the same profile reused under a different `ProfileType` would keep the first type limits/name | `Convert/ToOpenStudio/Profile.cs:31-34` | +| P3-05 | No story fallback when a model has no floor-group panels (LadybugTools falls back to walls); spaces simply get no `BuildingStory` | `Convert/ToOpenStudio/BuildingStory.cs:41-46` | +| P3-06 | No `CancellationToken`; a running CLI blocks the Grasshopper UI thread (documented) | `Classes/OpenStudioSimulationRunner.cs` | +| P3-07 | `OpenStudioConversionResult.Model` ownership/disposal not documented (callers must dispose) | `Classes/OpenStudioConversionResult.cs` | +| P3-08 | Full pipeline still invokes the CLI when conversion already has errors (result stays `IsValid=false`; diagnostics are doubled but correct) | `Convert/ToOpenStudio/AnalyticalModel.cs:51-53` | +| P3-09 | EPW ground temperatures are not imported (E+ warns, uses 18 °C) — standard OpenStudio behaviour, acceptable for Ideal Loads MVP | `Convert/ToOpenStudio/Weather.cs` | +| P3-10 | `Create.Model` (pre-existing) loads OSM without `VersionTranslator` — fine while SDK == CLI | `SAM.Core.OpenStudio/Create/Model.cs` | +| P3-11 | DDY design-day import not implemented — optional per plan; annual Ideal Loads needs no sizing periods | runner | +| P3-12 | Conditioned space with zero convertible panels still gets a thermostat + Ideal Loads on an empty zone (E+ may complain); degenerate-input edge | `Convert/ToOpenStudio/AnalyticalModel.cs:418-447` | +| P3-13 | `RunPeriod` "Number of Times Runperiod to be Repeated" and north-rotation left at defaults (documented) | `Convert/ToOpenStudio/SimulationSettings.cs` | + +## 7. Areas reviewed with no defect found + +- **Architecture/repository (§5.1):** clean layer separation; Grasshopper components thin (no + conversion logic); no Honeybee runtime; sibling repos untouched; no committed artifacts; SPDX + headers on all new files; coherent documented public API. +- **Source-model integrity (§5.2):** deep copy before `OffsetAperturesOnEdge` / + `ReplaceTransparentPanels` (SAM copy constructors verified); no-mutation and deterministic-name + tests pass; repeated conversion with disposal stable. +- **Geometry (§5.3):** metres/global coordinates retained; Newell normal correct; duplicate/ + closing/collinear removal verified by tests; planarity + min-area rejection verified; floor/roof/ + wall classification incl. the stacked-space flip matches `Face.cs:55-58`; story assignment by + nearest elevation; floor area and volume exact (20 m² / 60 m³). Only the self-intersection gap + (P2-01) and a tight absolute planarity tolerance (1e-6 m default; configurable) noted. +- **Adjacency (§5.4):** internal panels produce exactly two surfaces with opposite outward + normals (test asserts dot = −1); `setAdjacentSurface` reciprocal (tested); broken internal + topology reported (`SAM-OS-ADJ-001`) and set Adiabatic — reproduced; internal aperture pairing + (door on shared wall) reproduced — reciprocal `setAdjacentSubSurface`; shading panels go to a + building-level `ShadingSurfaceGroup`, never heat-transfer surfaces. +- **Materials/constructions (§5.5):** units verified against SAM source (k W/m·K, ρ kg/m³, + c J/kg·K, thickness m from `ConstructionLayer.Thickness` with `DefaultThickness` fallback + + warning); absorptance = 1 − reflectance; gas types restricted with errors; layer order proven + outside-first on external walls **and** mirrored on both internal sides, in tests **and** in the + generated OSM; caches keyed by (Guid, thickness) and (Guid, direction) — no wrong reuse found. + Only the glazing front/back swap (P1-04). +- **Internal conditions (§5.7):** every mapped row in the IC mapping doc traced to SAM query + sources (people/m², W/person activity, sensible/(sensible+latent), W/m² lights/equipment, + ACH×volume/3600 infiltration over sun-exposed area — `InfiltrationAirFlowPerExteriorArea` parity + confirmed line-by-line; `OutsideSupplyAirFlow` m³/s absolute per space). Only the dedup key + (P1-03). +- **Thermostats/Ideal Loads (§5.8):** central `IsConditioned` matches the LadybugTools name + convention (unconditioned/external); both-setpoints requirement matches LadybugTools + `ProgramType.cs:184` (documented limitation, not a defect); heating ≤ cooling validated hourly; + conditioned zones get exactly one thermostat + one Ideal Loads; unconditioned get neither + (tested). +- **Weather/settings (§5.9):** EPW validation, site population, run period, 6 timesteps/h, sizing + disabled, six hourly output variables — all verified in code and in the generated OSM. +- **Runner (§5.10 beyond P1-05):** discovery order correct (explicit → PATH → direct installs → + ladybug_tools); explicit-path precedence correct; quoting handles the space-containing repo path + (all reproduction paths contain spaces); sequential runs into the same directory are clean (the + CLI recreates `run/`; run-after-failure does not pick up stale results — reproduced); OSM-only + vs OSW execution correct; missing CLI and invalid/malformed EPW produce structured + `SAM-OS-RUN-001` diagnostics — reproduced. +- **Error parsing (§5.11):** `** Severe` / `** Fatal` detection correct; warnings not escalated; + first lines retained; stale `.err` cannot be confused (success requires exit 0 + SQL). +- **SQL extraction (§5.12):** independently cross-checked (§2 above) — correct environment period, + variable names valid for the bundled EnergyPlus 25.1, hourly frequency, J→kWh, no + double-counting, missing-zone rows distinguishable from zero. +- **Diagnostics (§5.13):** all silent-substitution searches (`catch`, `return null`, `continue`, + `AlwaysOn`, `new Construction`, `new Material`) land either on diagnosed paths or on + documented LadybugTools-parity defaults (0.3 radiant fraction etc.); error severity drives + `IsValid` correctly (proven by the degenerate-panel and missing-profile tests). +- **Grasshopper (§5.14):** components are thin, `_run`-gated, exceptions become runtime messages; + no OpenStudio native objects cross the boundary (paths/diagnostics only). Rhino 8 runtime + compatibility is **not** claimed — human smoke test remains mandatory. +- **Tests (§5.15):** assertions are semantic (values, layer sequences, counts, normals), negative + paths covered (missing material, missing profile, inverted setpoints, degenerate panel), + simulation tests fail (not skip) when CLI/EPW is absent, output directories are deleted before + use. Gaps that became findings: weekly-profile day alignment, leap-year profiles, same-name IC + collision, asymmetric glazing, CLI timeout, self-intersection, quote sanitization. + +## 8. Test and simulation evidence index + +| Evidence | Where | +| --- | --- | +| Baseline build/test (56/56) | §2; Stage-D rerun in §10 | +| Three independent simulations | §2 table (temp driver, not the test suite) | +| SQL cross-check | §2 (Python/sqlite3, exact match) | +| Weekly misalignment | §4 P1-01 (probe: Mon=1/Sun=0) | +| Leap-year squash | §4 P1-02 (probe: 8784-value profile) | +| Same-name IC merge | §4 P1-03 (probe: 99 vs 8 W/m²) | +| Glazing front/back | §4 P1-04 (E+ I/O Reference quote) | +| CLI timeout | §4 P1-05 (fake CLI, 120.6 s vs 5 s; post-fix 5.7 s) | +| Self-intersection | §5 P2-01 (star polygon accepted) | +| Broken adjacency / internal aperture / sequential runs / missing CLI / invalid EPW | §7 (probes) | + +## 9. Corrections implemented (Stage C) + +| Commit | Finding | Regression test(s) | +| --- | --- | --- | +| `4d28513` fix: align weekly profile day-of-week with the run calendar (review P1-01) | P1-01 | `WeeklyProfile_AlignsWithWeatherFileStartDay`, `WeeklyProfile_MondayFirst_WithoutWeatherFile`, `WeeklyProfile_FirstDayOfWeekOption_OverridesDefault` | +| `1971bdc` fix: stop silently squashing leap-year and multi-day profiles (review P1-02) | P1-02 | `LeapYearProfile_IsTruncatedWithWarning_NotSquashed`, `WeeklyFlatProfile_IsTiledHourForHour_NotAveraged`, `DailyProfile_TilesUnchanged`, `ProfileWithGaps_RaisesError_NeverSilentNaN` | +| `f46c98f` fix: deduplicate SpaceTypes by name plus content hash (review P1-03) | P1-03 | `SameNamedConditions_WithDifferentContent_GetDistinctSpaceTypes`, `SameNamedConditions_WithDifferentProfiles_GetDistinctSpaceTypes`, `IdenticalClones_StillShareOneSpaceType` | +| `fea508f` fix: map glazing optical sides to EnergyPlus front/back correctly (review P1-04) | P1-04 | `AsymmetricGlazing_MapsExternalToFront_InternalToBack` | +| `20b2b85` fix: make the CLI timeout real and deadlock-safe (review P1-05) | P1-05 | `CliTimeout_KillsProcess_AndReportsTimeout` (plus the pre-existing healthy-run E2E tests); manual re-verification: 120 s sleeper now dies at 5.7 s with exit −1 (was 120.6 s, exit 0) | +| `add236f` fix: reject self-intersecting polygons (review P2-01) | P2-01 | `SelfIntersectingPolygon_IsAnError`, `BowtiePolygon_IsAnError`, `ConcavePolygon_IsAccepted` | +| `8c3367f` fix: sanitize quotes out of OpenStudio names (review P2-02) | P2-02 | `SanitizeName_RemovesQuotes`, `SpaceName_WithApostrophe_ConvertsWithDeterministicName` | +| `fd2c0a7` fix: distinguish opaque air gaps from window gas layers (review P1-06) | P1-06 | `OpaqueCavity_BecomesAirGap`, `OpaqueCavity_Resistance_FromConductance_1_25`, `OpaqueCavity_Resistance_FromConductance_1_95`, `WindowGas_RemainsGas_InAperturePane`, `SameGasMaterial_TwoContexts_SeparateObjects`, `MissingConductance_RaisesError_NeverSilent`, `ResistanceBelowEnergyPlusMinimum_RaisesError`, `GlazingLayer_InOpaqueConstruction_IsRejected`, `AirGapConstruction_EndToEnd_EnergyPlusRun_MeetsResultGate`; real-model Rhino retest passed 2026-07-19 | + +Every fix was reproduced with a failing test first, corrected minimally, verified with the +focused test and then the complete suite. No existing milestone commit was rewritten. + +## 10. Final validation (Stage D) + +### Build and tests + +| Gate | Result | +| --- | --- | +| `dotnet build SAM_OpenStudio.sln -c Debug -p:Platform=x64` | **Build succeeded** — 0 errors in every project (only the pre-existing benign MSB3277 `System.Memory` warning). See the environmental note below for the `%APPDATA%` deploy-copy caveat that applied on this shared machine | +| `dotnet test tests/SAM.Analytical.OpenStudio.Tests -c Debug -p:Platform=x64` | **82/82 passed, 0 skipped** (baseline 56 + 17 review regression tests + 9 P1-06 tests, including the opaque-air-gap end-to-end run) | + +**Environmental note (not an MVP defect):** during this session a second, unrelated process on +this shared machine rebuilt the entire SAM suite and started a Rhino 8 instance (pid 5412, +started 11:37) with the SAM GHAs loaded from `%APPDATA%\SAM`. It twice wiped the prebuilt +`SAM\build` / `SAM_SQLite\build` assemblies (rebuilt each time — +no sibling source touched) and then locked the `.gha` files in `%APPDATA%\SAM`, so the +**pre-existing** post-build deploy copy (`build\*.dll → %APPDATA%\SAM`, unchanged from the base +branch and out of MVP scope) fails with `MSB3073` while Rhino holds those files. All projects +**compile** — the GH assemblies' DLLs are produced; only the convenience deploy copy collides +with the running Rhino. The full solution build was green at baseline (10:30) and after every +fix commit until the Rhino session started. A clean machine (or this machine with Rhino closed) +builds the solution end-to-end; this is exactly the class of machine-state the mandatory human +Rhino smoke test will exercise deliberately. + +### Three-simulation validation (post-fix, final build) + +| Fixture | OSM | exit | fatal | severe | zones w/ results | heating kWh | cooling kWh | duration | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| SingleBox (one conditioned zone) | `final-runs\single_box\Single_Box_Model.osm` | 0 | 0 | 0 | 1/1 | **2621.7** | **1745.0** | 3.1 s | +| TwoAdjacentBoxes (two zones, internal wall) | `final-runs\two_adjacent\Two_Box_Model.osm` | 0 | 0 | 0 | 2/2 | **4875.0** | **2830.8** | 2.9 s | +| TwoStackedBoxes (stacked, shared floor) | `final-runs\two_stacked\Two_Stacked_Box_Model.osm` | 0 | 0 | 0 | 2/2 | **1538.2** | **2563.6** | 2.8 s | +| OpaqueAirGapBox (P1-06 regression: 50 mm cavity, h = 1.25 W/m²K → R = 0.8 m²K/W) | `e2e_airgap_box\Opaque_AirGap_Box_Model.osm` | 0 | 0 | 0 | 1/1 | **4953.6** | **1555.5** | ~3 s | + +The first three loads are identical to the pre-fix baseline — expected: the fixes affect +weekly-profile calendar alignment, leap-year profiles, same-name condition merging, asymmetric +glazing, CLI failure handling, self-intersecting geometry, quoted names and opaque gas cavities +— of which only the last touches these fixtures' physics, and they contain no gas cavities. + +### Stage-D checklist + +| Item | Verified via | +| --- | --- | +| Exit code 0, no fatal, no severe — all three runs | table above | +| Zone result count == conditioned-zone count | 1/1, 2/2, 2/2 | +| Heating and cooling finite; at least one fixture with both > 0 | all three fixtures both > 0 | +| Floor area and volume preserved (20 m² / 60 m³, 1e-6) | M3 suite tests | +| Internal adjacency valid (reciprocal pairing, opposite normals) | M3 suite tests + clean two-zone run | +| Construction layer order (outside-first; mirrored internal sides) | M4 suite tests + OSM inspection | +| Weekly schedule semantics tested | 3 new weekly tests (EPW-derived, default, override) | +| Source `AnalyticalModel` unchanged | M7 no-mutation test (passes post-fix) | +| No temporary processes remain | timeout test asserts no orphaned `openstudio`/`energyplus`; none found | +| Working tree contains only intentional changes | `git status` clean after each fix commit | + +## 11. Known limitations (unchanged MVP scope) + +- Ideal Loads only; EnergyPlus object defaults for the system; no detailed HVAC (deferred by plan). +- Heating-only / cooling-only conditioning unsupported (both setpoint profiles required) — + LadybugTools parity, documented. +- Latent equipment gains, humidification/dehumidification, aperture frames, face holes beyond + apertures, DDY design days, north rotation: not converted (documented). +- Schedules are 365-day hourly `ScheduleFixedInterval`; leap years truncated to the first 8760 + hours with a warning (documented non-leap policy). +- Weekly semantics: day-composed profiles align to the run start weekday (EPW-derived or explicit + option); flat sequences tile at their own period exactly as SAM does natively. + +## 12. Remaining human validation — COMPLETE + +The mandatory Rhino 8 smoke test was performed by the user in two rounds (2026-07-19): + +1. **Deployment round — PASSED, exposing P1-06:** Rhino 8 starts; Grasshopper loads the GHA; + `SAMAnalytical.ToOpenStudio` and `OpenStudio.RunModel` appear and execute; OSM/OSW created; + CLI starts; no native-DLL or managed-assembly errors. EnergyPlus then failed fatally on the + opaque gas cavities → finding P1-06 (§4), fixed in `fd2c0a7`. +2. **Retest round (`simulation-fixed`) — PASSED:** real model converts; OSM/OSW generated; CLI + completes successfully; SQL produced; fatal 0; severe 0; no R-value error; heating + **3758.36 kWh** / cooling **0.00 kWh** (both verified directly from `run\eplusout.sql`; + cooling is a genuine zero result, not missing); conditioned-zone result count 1; only the + documented `SAM-OS-IC-001` latent-equipment warning remains. + +## 13. Merge recommendation + +**READY.** All eight findings (P1-01…P1-06, P2-01, P2-02) are resolved with regression tests; +the final suite is **82/82** with four clean automated EnergyPlus validations including an +opaque-air-gap model; the real Rhino 8 model validation passed with artifact-verified results. +The branch is recommended for PR into `sow/2026-Q3`. diff --git a/docs/openstudio-mvp-status.md b/docs/openstudio-mvp-status.md new file mode 100644 index 0000000..66d87d5 --- /dev/null +++ b/docs/openstudio-mvp-status.md @@ -0,0 +1,102 @@ +# OpenStudio MVP — status + +Updated at every milestone gate with the last completed milestone. +See [SAM_OpenStudio_MVP_Implementation_Plan.md](SAM_OpenStudio_MVP_Implementation_Plan.md) §13. + +## Current state + +The MVP is complete and validated end-to-end: **82/82 automated tests pass, the automated +opaque-air-gap EnergyPlus test passes, the real Rhino 8 model test passes, and all P0/P1 +review findings are resolved. The branch is ready for PR into `sow/2026-Q3`.** + +| Field | Value | +| --- | --- | +| Milestone completed | **M8 + independent review + P1-06 + real Rhino 8 validation — MVP COMPLETE, ready for PR** | +| Branch | `feature/analytical-model-to-openstudio-mvp` (base `sow/2026-Q3` @ 94dfce9) | +| Commit | `fd2c0a7` fix: distinguish opaque air gaps from window gas layers (review P1-06) | +| SDK selected | OpenStudio NuGet **3.10.0** (bumped from 3.8.0 in all three library projects) | +| CLI selected | **3.10.0+86d7e215a1** — `C:\Program Files\ladybug_tools\openstudio\bin\openstudio.exe` (discovery: explicit → PATH → direct installs → ladybug_tools) | +| Tests executed | **82/82 passed, 0 skipped** — incl. three E2E EnergyPlus runs + CLI-timeout regression + opaque-air-gap E2E | +| Review | [openstudio-mvp-review.md](openstudio-mvp-review.md) — 0 P0, 6 P1 and 2 P2 findings, all resolved with regression tests; merge recommendation **READY** | +| Rhino 8 validation | **PASSED (2026-07-19, user-performed)** — see the dedicated section below | +| Next milestone | **PR into `sow/2026-Q3`** | + +## Rhino 8 real-model validation + +User-performed, 2026-07-19, commit `fd2c0a7` (assemblies deployed to `%APPDATA%\SAM` by the +`-m:1` solution build). Independently verified against the generated artifacts in +`\Documents\SAM_daily\2026-07-19 OpenStudio\simulation-fixed`: + +| Check | Result | +| --- | --- | +| Rhino 8 startup | PASS | +| Grasshopper GHA loading | PASS | +| `SAMAnalytical.ToOpenStudio` appears and executes | PASS | +| `OpenStudio.RunModel` appears and executes | PASS | +| Real SAM AnalyticalModel converted | PASS | +| OSM generation (`000000_SAM_AnalyticalModel.osm`) | PASS | +| OSW generation (`000000_SAM_AnalyticalModel.osw`) | PASS | +| OpenStudio CLI execution | PASS — `finished.job`: "Finished Workflow"; `EnergyPlus Completed Successfully` | +| SQL produced and readable (`run\eplusout.sql`) | PASS | +| Fatal errors | **0** | +| Severe errors | **0** | +| Previous R-value fatal error (`R Value below lowest allowed value`) | **RESOLVED — absent** | +| Opaque gas cavities → `Material:AirGap` | PASS — `Ar90Up_Air_50mm_1.25W/m2K` → R = **0.8** m²K/W; `Ar90Up_Air_50mm_1.95W/m2K` → R = **0.512820512820513** m²K/W (R = 1/h) | +| `WindowMaterial:Gas` in opaque constructions | **0 occurrences** (none in the whole model) | +| Heating (verified from SQL) | **3758.36 kWh** (component displayed 3758.359753 kWh) | +| Cooling (verified from SQL) | **0.00 kWh — genuinely present** (8760 hourly rows summing to 0; London St. James's Park TMYx; not a missing result) | +| Conditioned-zone result count | 1 = conditioned-zone count (`SAM_IDEALLOADS_CELL_1_99C96B9E`) | +| Environment periods in SQL | single annual weather run — no design days | +| Native DLL / assembly-resolution errors | none | +| Remaining conversion warning | `SAM-OS-IC-001`: latent equipment gains are not converted in the MVP (documented limitation) | +| Remaining EnergyPlus warnings (non-blocking) | ground temperatures default 18 °C; floor/roof "upside down" auto-fixed by E+; zone volume −100 → 10 m³ (source-model geometry); meter key names; monthly tabular reports; LifeCycleCost resources; 3 unused schedules; EPW design-condition field count | + +Zero cooling is a valid result here: the time series exists (8760 hourly values summing to +0.00 kWh), extraction completed successfully, heating is finite and > 0, and no fatal or severe +errors occurred. + +## Milestone history + +| M | Commit | Tests | Notes | +| --- | --- | --- | --- | +| M0 | d3a4a17 | 2/2 | SDK 3.8.0→3.10.0; CLI verified; tests project created; weather fixture pinned; placeholder `Test.cs` removed | +| M1 | 2495b5c | 14/14 | Diagnostics (+codes/severity), conversion/run options, run result, object reference/map, context + result snapshot, SanitizeName/OpenStudioName/versions queries | +| M2 | 0c1c5cb | 24/24 | SAM.Geometry.OpenStudio: Point3d/Point3dVector/Face3D-polygon converters; CleanVertices, Normal (Newell), Area, IsPlanar, IsClockwise, ValidatePolygon; SAM.Core+Geometry refs added to csproj | +| M3 | 40bad29 | 31/31 | ToOpenStudio orchestrator (passes A/B/C): stories from MinElevationDictionary, Space+ThermalZone, UpdateNormals-driven surfaces, explicit SAM-topology adjacency pairing, boundary conditions, SubSurfaces (window/door/glass-door rules), shading group; two-box fixture + 7 semantic tests. Learned: OpenStudio C# Space.surfaces/floorArea/volume are properties | +| M4 | 3f24d2c | 38/38 | Layer convention VERIFIED (SAM stores inside→outside per SAM XML docs; forward=E+ outside-first=reversed SAM list); Material/Construction converters with (Guid,thickness) and (Guid,direction) caches; Pass D assigns forward/reverse per internal side, AirBoundary for Air panels, pane constructions on subsurfaces; mapping doc; fixture with real 3-layer wall + double glazing; SPDX headers aligned to LGPL-3.0-or-later. Learned: SAM Material Guid-ctor order is (k, ρ, c); ConstructionLayer members live on SAM.Architectural base | +| M5 | ee06480 | 44/44 | Profile→ScheduleFixedInterval (8760 h, TimeSeries+Vector, typed limits, tiling rules) and InternalCondition→SpaceType (People incl. activity level+sensible fraction, Lights, ElectricEquipment, infiltration per sun-exposed area, per-space DSOA); IC mapping doc. Learned: Space.InternalCondition setter clones with NEW Guid → SpaceType dedup by sanitized name (LadybugTools parity); Profile.Count is the index span → use Min..Max indexer; ExposedToSun excludes plain PanelType.Wall (fixture uses WallExternal) | +| M8 | 1a27638 | 56/56 | GH components SAMAnalytical.ToOpenStudio + OpenStudio.RunModel (thin, GH_SAMVariableOutputParameterComponent pattern, _run-gated); runner save-only mode + standalone OSM/OSW Run API; usage doc; MVP acceptance checklist below | +| M7 | 8658945 | 56/56 | TwoStackedBoxes (stories 0m/3m, shared floor RoofCeiling/Floor flip), conditioned/unconditioned pair, irregular-planar cleaning, degenerate-panel kernel-failure isolation (SAM Face3D NRE → space-level GEO-001 error + per-panel no-silent-drop warnings), no-source-mutation, deterministic names, disposal loop, two-zone E2E. Hardened: per-panel elevation with exception isolation + floor-group story filter; UpdateNormals/panel-conversion/GetArea guards. Restored externally wiped SAMuild and SAM_SQLiteuild prebuilts (SAM repo moved to 487bd679) | +| M6 | 1015180 | 48/48 | Central IsConditioned; dual-setpoint thermostats with hourly heating≤cooling validation; ZoneHVACIdealLoadsAirSystem (E+ defaults, documented); EPW weather + Site from EpwFile; annual RunPeriod, 6 timesteps/h, no sizing runs, 6 hourly output variables; OpenStudioSimulationRunner (OSM save, minimal OSW, CLI discovery, timeout, err parse, SQL discovery, kWh extraction via DISTINCT KeyValue sums); full-pipeline ToOpenStudio(model, epw, outDir) overload. E2E: 2621.7 kWh heating / 1745.0 kWh cooling, Boston TMYx | +| **Review fixes** | `4d28513` … `8c3367f` | 73/73 | Independent review ([openstudio-mvp-review.md](openstudio-mvp-review.md)): P1-01 weekly-profile calendar alignment; P1-02 leap-year/multi-day profile squash; P1-03 SpaceType same-name collision; P1-04 glazing front/back swap; P1-05 CLI timeout/deadlock; P2-01 self-intersecting polygons; P2-02 quote sanitization — one commit + regression tests each | +| **P1-06** | `fd2c0a7` | **82/82** | Real Rhino 8 smoke test (user): deployment passed, EnergyPlus failed fatally on opaque gas cavities (`OS:WindowMaterial:Gas` R = 0.000 in `InitConductionTransferFunctions`). Fix: explicit `OpenStudioMaterialUsage` — SAM `GasMaterial` in opaque `Construction` → `OpenStudio.AirGap` with R = 1/h from `GasMaterialParameter.HeatTransferCoefficient` [W/m²K] (validated, SAM-OS-MAT-001 on missing/invalid/below-minimum); in `ApertureConstruction` panes → `OpenStudio.Gas` unchanged; usage-aware cache keys; material-family validation; 9 new tests incl. opaque-air-gap E2E (exit 0, 0 fatal/severe, 4953.6/1555.5 kWh). **Real-model Rhino retest PASSED 2026-07-19** (see section above) | + +## Known limitations at this point + +- Pre-existing benign `MSB3277` System.Memory warning (see audit doc §6). +- `Create.Model` (pre-existing) loads OSM without `VersionTranslator` — fine while SDK == CLI (3.10.0 both). +- DDY design-day import not implemented (optional per plan; Ideal Loads annual runs need no sizing periods). +- Schedules are 365-day hourly `ScheduleFixedInterval`; profiles longer than 8760 hours (leap years) are truncated to the first 8760 hours with a warning (documented non-leap policy); day-composed weekly profiles align to the run calendar (EPW-derived or explicit option; Monday-first fallback for weather-free conversions). +- Latent equipment gains and humidification/dehumidification setpoints not converted (documented warnings). +- Heating-only / cooling-only conditioning unsupported (both setpoint profiles required) — SAM_LadybugTools parity. +- Ideal Loads uses EnergyPlus object defaults; no capacity/air-flow limits, economizer, heat recovery or humidity control. +- Opaque gas cavities become resistance-only `OS:Material:AirGap` layers (R = 1/h from SAM's cavity conductance); the convective/radiative split of the cavity is not modelled beyond that (standard EnergyPlus approach). +- Post-build deploy copy to `%APPDATA%\SAM` fails (`MSB3073`) while Rhino 8 holds the `.gha` targets locked (pre-existing behaviour); close Rhino before building. All projects compile regardless. + +## MVP acceptance checklist (plan §4 definition of success) + +| # | Criterion | Status | Evidence | +| --- | --- | --- | --- | +| 1 | Convert to OpenStudio Model | DONE | M3–M5; 73-test suite | +| 2 | Save a valid .osm | DONE | M0 smoke CLI round-trip; M6 E2E | +| 3 | Generate an .osw | DONE | M6 runner; E2E artifacts | +| 4 | Run through the OpenStudio CLI | DONE | Two E2E runs (one-zone, two-zone) + three independent validation runs | +| 5 | EnergyPlus completes, no fatal errors | DONE | 0 fatal, 0 severe in all runs | +| 6 | Finite heating/cooling results (strengthened gate) | DONE | 2621.7 / 1745.0 kWh; both > 0; zone result count == conditioned count; kWh units validated against raw SQL | +| 7 | Floor area and volume preserved | DONE | 20 m² / 60 m³ exact (1e-6) | +| 8 | Internal surface relationships preserved | DONE | Explicit pairing, opposite normals, clean two-zone E+ run | +| 9 | Construction layer order preserved | DONE | Outside-first proven on both sides of the internal panel | +| 10 | Schedules and internal gains reproduced | DONE | 8760-value spot checks; weekly-profile calendar alignment tested; density assertions | +| 11 | Actionable diagnostics, no silent substitution | DONE | SAM-OS-* error paths tested; no-silent-drop panel check; kernel-failure isolation; leap-truncation warning; profile-gap error | + +Remaining before merge: **Rhino 8 smoke test** (plan §13), then PR into sow/2026-Q3. diff --git a/docs/openstudio-mvp-usage.md b/docs/openstudio-mvp-usage.md new file mode 100644 index 0000000..39b28d2 --- /dev/null +++ b/docs/openstudio-mvp-usage.md @@ -0,0 +1,224 @@ +# SAM → OpenStudio MVP — usage + +Companion to [SAM_OpenStudio_MVP_Implementation_Plan.md](SAM_OpenStudio_MVP_Implementation_Plan.md) +(binding contract) and [openstudio-mvp-status.md](openstudio-mvp-status.md) (run status). + +## Prerequisites + +- OpenStudio CLI + EnergyPlus. Discovery order: explicit `OpenStudioRunOptions.CliPath` → + `openstudio.exe` on PATH → direct installations (`C:\openstudio-*`, `%ProgramFiles%\OpenStudio*`) + → Ladybug Tools bundle (`%ProgramFiles%\ladybug_tools\openstudio`). Verified against + **3.10.0** (matching the NuGet SDK). +- An EPW weather file, **or** WeatherData with hourly weather years embedded in the + AnalyticalModel (`SAMAnalytical.CreateAnalyticalModelByAdjacencyCluster` with + `_saveWeatherData_ = true`). Source precedence (never merged, always named in a diagnostic): + + ``` + Explicit EPW/DDY path + overrides + AnalyticalModel embedded WeatherData/design days + overrides + documented fallback or blocking diagnostic + ``` + + Annual weather: an explicit EPW wins; otherwise the embedded WeatherData is exported through + SAM.Weather's `ToEPW` API (only when it carries weather years); otherwise its metadata + (location, elevation/time zone, ground temperatures) is still used and a run reports the + missing EPW as a blocking error while conversion-only stays valid with a warning. + Design days: an explicit DDY (`OpenStudioConversionOptions.DdyPath`, overridden by + `OpenStudioRunOptions.DdyPath`, or the Grasshopper `ddyPath_` input) wins; otherwise the + embedded heating/cooling design days are translated (approximations are named in warnings); + otherwise no design days. An explicit path that is supplied but unusable falls back to the + embedded source with a warning naming the rejected path. +- Prebuilt SAM assemblies in `..\SAM\build\` (HintPath references). + +## C# API + +```csharp +using SAM.Analytical.OpenStudio; + +// Convert + save + run the annual Ideal Loads simulation: +OpenStudioConversionResult result = analyticalModel.ToOpenStudio( + epwPath: @"C:\weather\city.epw", + outputDirectory: @"C:\sims\project01"); // OSM/OSW + run\ land here + +// result.IsValid — conversion had no error diagnostics +// result.Diagnostics — structured SAM-OS-* codes (never silent substitution) +// result.ObjectMap — SAM Guid → deterministic OpenStudio name +// result.RunResult — exit code, eplusout.err severe/fatal, SQL path +// result.Loads — annual kWh per zone + totals (finite-checked) + +// Convert only (no CLI): pass run: false — OSM and OSW are still saved. +// Geometry-only conversion (no weather/settings/save): +OpenStudioConversionResult modelOnly = analyticalModel.ToOpenStudio(); + +// Run an existing OSM/OSW: +var runResult = OpenStudioSimulationRunner.Run( + @"C:\sims\model.osm", epwPath, outputDirectory, null, + out OpenStudioLoadSummary loads, diagnostics); + +// Options: +var conversionOptions = new SAM.Core.OpenStudio.OpenStudioConversionOptions +{ + FirstDayOfWeek = DayOfWeek.Monday, // weekly-profile calendar override; default: from the EPW + // Post-MVP (completeness programme): NorthAngleDegrees, RunPeriodBegin/End, TimestepsPerHour, + // SolarDistribution, ShadowCalculationFrequencyDays, CalendarYear, IsLeapYear (8784 schedules), + // DaylightSavingsTime (default off), DdyPath + ImportAllDesignDays + RunSizingPeriods, + // OutputVariableFrequency + ShadingCalculationMethod = "PixelCounting", // default; "PolygonClipping" restores the E+ default, + // null leaves the OSM default untouched. PixelCounting + // has no concavity limitation (no DetermineShadowingCombinations + // non-convex severe errors) and scales better with shading count + MeasurePaths = new List { @"C:\measures\my_measure" }, // OSW steps, in order, args at measure + // defaults; missing dirs warn, never silent + AdditionalIdfStrings = new List // advanced: complete IDF objects written verbatim + { // through a generated EnergyPlus measure (appended last); + "Output:Variable,*,Site Outdoor Air Dewpoint Temperature,hourly;", // unparseable strings fail the run + }, +}; +var runOptions = new SAM.Core.OpenStudio.OpenStudioRunOptions +{ + CliPath = @"C:\Program Files\ladybug_tools\openstudio", // explicit CLI (exe or install dir) + TimeoutSeconds = 3600, // real timeout: the process tree (CLI + EnergyPlus) is killed on expiry + UseUniqueRunDirectory = true, // default: GUID subdir per run — concurrent runs never collide + ExtractTimeSeries = false, // true loads hourly temperature/operative/humidity series +}; + +// Asynchronous, cancellable execution (token and timeout share the process-tree kill path): +var cts = new CancellationTokenSource(); +OpenStudioConversionResult result2 = await analyticalModel.ToOpenStudioAsync( + epwPath, outputDirectory, conversionOptions, runOptions, run: true, + progress: new Progress(p => Console.WriteLine(p)), + cancellationToken: cts.Token); + +// Engine-neutral results (result.Results): annual kWh per zone, peak kW + hour-of-year, +// unmet hours, gains breakdown, optional hourly series, runtime, warning/severe/fatal counts. +// SAM mapping: result.Results.ToSAM(analyticalModel) → AnalyticalModelSimulationResult; +// result.Results.ToSAM_SpaceSimulationResults(analyticalModel) → per-LoadType space results. +using (result) { /* result owns the OpenStudio model — dispose when done */ } +``` + +## Grasshopper components (SAM → OpenStudio tab) + +| Component | Purpose | +| --- | --- | +| `SAMAnalytical.ToOpenStudio` | AnalyticalModel + output folder (+ optional `_epwPath`, `ddyPath_`, `_run`, `measures_`, `add_str_`) → OSM/OSW paths, SQL path, heating/cooling kWh, diagnostics, success. Weather/design-day sources: explicit paths override embedded model data. `measures_`: OSW measure steps (BCL measure directories); `add_str_`: advanced verbatim IDF objects | +| `OpenStudio.RunModel` | Existing OSM/OSW (+EPW for OSM) → run, SQL path, heating/cooling kWh, diagnostics | +| `OpenStudio.CreateSpaceSimulationResultsBySQL` (pre-existing) | SQL → SAM `SpaceSimulationResult` objects | +| `OpenStudioCreateDesignDaysBySQL`, `SAMAnalyticalAddResultsBySQL` (pre-existing) | Design days / result attachment from SQL | + +Components are thin wrappers — every conversion rule lives in the tested +`SAM.Analytical.OpenStudio` API. Both components execute **non-blocking** (background task, +`cancel_` input, no stale outputs, no UI-thread freeze). + +## Reading `SAMAnalytical.AddResultsBySQL` output + +The component returns the model with results attached, plus flat +`spaceSimulationResults` / `panelSimulationResults` lists. Two things about those lists are +worth knowing before you wire them up. + +### Mapping a result back to its Space or Panel — use `Reference` + +Every matched result carries the **SAM object's Guid** in its `Reference` property (32-hex, +no dashes — `Guid.ToString("N")`). That is the mapping key: group results by `Reference` and +match against `Space.Guid` / `Panel.Guid`. Do not parse the result `Name` — it is the +EnergyPlus name and its shape differs per family (see below). + +The relations are attached too, so `AdjacencyCluster.GetResults(space)` +and `GetResults(panel)` work directly. `Reference` is for the case +where you hold only the result list. + +The EnergyPlus identity that `Reference` used to hold is still there, as parameters: + +| Result | Parameters carrying the engine identity | +| --- | --- | +| `SpaceSimulationResult` | `ZoneIndex`, `ZoneName` | +| `SurfaceSimulationResult` | `SurfaceIndex`, and `HostSurfaceName` on a window/door | + +An **unmatched** result keeps its raw SQL reference (a bare index) instead of a Guid, and is +named in a diagnostic — so a `Reference` that is not 32 hex characters means "this result did +not map to the model". + +One panel represented by two engine surfaces (an internal wall, seen from both spaces) yields +two results sharing one `Reference`; tell them apart by `SurfaceIndex`. Values are never +summed across engine surfaces. + +### Why one space returns four results + +Not duplicates — two independent families, each with a heating and a cooling result: + +| Family | `Name` looks like | Has parameter | Answers | +| --- | --- | --- | --- | +| **Annual** | the SAM space name, e.g. `Cell 1` | `Load` [W], `LoadIndex`, `UnmetHours` | what the zone actually peaked at across the weather year | +| **Design day** | the EnergyPlus zone name, e.g. `SAM_ThermalZone_Cell_1_` | `DesignLoad` [W], `DesignDayName`, `PeakDate` | what plant would be sized at on the ASHRAE design day | + +So a one-space model with sizing periods gives 2 + 2 = 4. Without sizing periods (no DDY and +no embedded design days) you get only the annual pair. + +The two are **deliberately not merged** and their magnitudes legitimately differ — an annual +peak includes real weather and thermal dynamics, a design-day load is a steady-state sizing +calculation. All four reference the same `Space` Guid. + +**To split them in Grasshopper**, filter on which parameter is present — `Load` for annual, +`DesignLoad` for design day — then on `LoadType` for heating vs cooling. The naming asymmetry +is historical (the design-day family is read straight from the SQL `ZoneSizes` table, which is +keyed by EnergyPlus zone name); `Reference` is uniform across both, which is why it is the key +to map on. + +Full rules: [SAM_OPENSTUDIO_RESULT_MAPPING.md](SAM_OPENSTUDIO_RESULT_MAPPING.md). + +## Post-MVP (analytical completeness) notes + +See [openstudio-analytical-completeness-status.md](openstudio-analytical-completeness-status.md) +for the full programme. The following MVP limitations are **resolved**: single-mode +(heating-only/cooling-only) thermostats, latent equipment gains, humidification/dehumidification +(ZoneControlHumidistat + Ideal Loads humidity control), SpaceType outdoor air with ventilation +schedules, native ACH infiltration, aperture frames (WindowPropertyFrameAndDivider with pane +geometry), SimpleGlazingSystem fallback for layerless performance-parameter glazing, hole +diagnostics with GUID + geometry summary, north rotation, ground temperatures (SAM → EPW → +documented default), DDY design days with sizing enablement and environment-filtered annual +results, leap-year schedules, custom run period/timestep/calendar, rich results extraction +(peaks, unmet hours, gains, series) with SAM result mapping, and cancellable asynchronous runs +in unique directories. + +## Remaining documented limitations + +- Ideal Loads only (no detailed HVAC); EnergyPlus object defaults for the Ideal Loads system + except humidity control (wired from SAM humidity profiles). +- A zero heating or cooling value in `OpenStudioLoadSummary` is a **genuine result**, not a + missing one: every reported zone has a full time series in the SQL output. A zone that failed + to report is omitted from the per-zone dictionaries — zero and missing are never conflated. +- Glazing dividers/muntins: N/A (no SAM source data). Blinds/shades and opening properties: + unsupported with structured diagnostics (no geometry in SAM; HVAC domain). +- Inter-zone air mixing across `PanelType.Air` partitions is **opt-in**. An + `OS:Construction:AirBoundary` always groups its two zones for solar, daylighting and radiant + exchange, but EnergyPlus defaults `Air Exchange Method` to `None`, so no air moves and the + zone air temperatures are coupled only by radiation. SAM carries no per-panel airflow data + (`PanelParameter` has no airflow member), so a rate is never inferred: set + `OpenStudioConversionOptions.AirBoundaryAirChangesPerHour` to switch the boundary to + `SimpleMixing` at that rate (EnergyPlus applies it to the **smaller** zone's volume, on an + always-on schedule; its own documented default for the field is 0.5). Whichever branch + applies is named in a diagnostic. A negative or infinite value is rejected with a warning and + `None` is kept — never clamped. Note that with Ideal Loads holding both zones at the same + setpoints, mixing changes very little; it matters when setpoints differ or a zone is + unconditioned. +- Emitter characteristics, exhaust flows, ventilation-system equipment: deferred to the + detailed-HVAC programme (SAM-OS-HVAC-001/SAM-OS-IC-001 diagnostics). +- STAT ground-temperature parsing: deferred (SAM WeatherData → EPW header → named 18 °C default). +- Daylight saving: option-driven, default OFF (SAM carries no DST data). +- SAM hourly design days → parametric `SizingPeriod:DesignDay` is an approximation (used when + no DDY path exists: daily range from the 24 h spread, constant dew point at the max-dry-bulb + hour, mean wind/pressure, ASHRAEClearSky with clearness 0.0 heating / 1.0 cooling — every + approximation is named in a warning); the DDY import is the deterministic primary path. +- Self-intersecting polygons are rejected with a diagnostic (never auto-repaired). +- Glazing optical sides follow the EnergyPlus definition (Front = side opposite the zone): + SAM `External*` → Front, `Internal*` → Back — deliberately different from the SAM_LadybugTools + exporter (see `SAM_OPENSTUDIO_MATERIAL_MAPPING.md`). +- Gas cavities are usage-dependent (see `SAM_OPENSTUDIO_MATERIAL_MAPPING.md`): a SAM + `GasMaterial` in an **opaque** `Construction` becomes an `OS:Material:AirGap` resistive layer + with R = 1/h from SAM's `Heat Transfer Coefficient` [W/m²K] (missing/invalid conductance is a + SAM-OS-MAT-001 error, never a zero-resistance layer); in an `ApertureConstruction` pane it + remains `OS:WindowMaterial:Gas` (gas type + thickness). +- SpaceType names embed a deterministic content hash over the condition AND the per-space + computed densities (`SAM_InternalCondition__`): shared conditions never impose + one space's densities on another. diff --git a/docs/openstudio-to-sam-import-audit.md b/docs/openstudio-to-sam-import-audit.md new file mode 100644 index 0000000..81fbaf0 --- /dev/null +++ b/docs/openstudio-to-sam-import-audit.md @@ -0,0 +1,350 @@ +# OpenStudio → SAM Analytical Import — B0 audit + +Status: audited 2026-07-21 on branch `feature/openstudio-to-sam-analytical`, based on +`sow/2026-Q3` (`3fd556a`). + +This document records the pre-implementation audit required before the reverse +(OpenStudio → SAM) conversion is written: the verified baseline, the existing infrastructure +that must be reused rather than duplicated, the confirmed OpenStudio 3.10.0 .NET API surface, +and the reverse-mapping matrix that governs the implementation. + +The companion machine-readable manifest is +[`tests/resources/openstudio-to-sam-coverage.json`](../tests/resources/openstudio-to-sam-coverage.json); +the reverse coverage tables live in +[`SAM_OPENSTUDIO_TO_SAM_COVERAGE.md`](SAM_OPENSTUDIO_TO_SAM_COVERAGE.md) and are generated from it. + +--- + +## 1. Baseline + +Measured on this machine before any change (Visual Studio 2026 / MSBuild 18, x64): + +| Item | Command | Result | +|---|---|---| +| Build | `MSBuild SAM_OpenStudio.sln -p:Configuration=Debug -p:Platform=x64` | **Succeeded**, exit 0, 0 errors | +| Tests | `dotnet test tests/SAM.Analytical.OpenStudio.Tests --no-build` | **237 total — 235 passed, 2 skipped, 0 failed** (2 m 16 s) | + +The two skipped tests (`RealSqlFixture_SpaceAndSurfaceResults_NoThrow`, +`CreateDesignDays_RealSqlReproductionFixture_NoThrow`) are conditional on an +uncommitted real EnergyPlus SQLite fixture and are skipped on a clean checkout. + +--- + +## 2. Existing infrastructure to reuse (never duplicate) + +| Concern | Existing implementation | Reverse-import use | +|---|---|---| +| OSM load + version translation | `SAM.Core.OpenStudio.Create.Model(string)` — `VersionTranslator.loadModel` | Reused as-is; hardened with an out-parameter overload that reports the translation outcome instead of collapsing every failure to `null`. | +| CLI discovery | `SAM.Core.OpenStudio.Query.OpenStudioCliPath(string)` | Reused unchanged. | +| Async run, cancellation, process-tree kill, unique run dirs, lock file | `OpenStudioSimulationRunner.Run(string path, …)` / `ExecuteCli` / `ProcessJobObject` | Reused unchanged for OSW execution (case 2/3). | +| Diagnostics | `Core.OpenStudio.OpenStudioDiagnostic`, `…Severity`, `…DiagnosticCodes` | Same immutable record and severity model; **new** `OpenStudioImportDiagnosticCodes` holds the reverse-only codes so forward codes stay stable. | +| Statistics | `Core.OpenStudio.OpenStudioConversionStatistics` | Reused by the import context. | +| Object traceability | `OpenStudioObjectMap` / `OpenStudioObjectReference` | Reused (SAM Guid ↔ OpenStudio name). | +| Geometry validation | `SAM.Geometry.OpenStudio.Query.ValidatePolygon` / `CleanVertices` / `IsClockwise` / `Normal` / `IsPlanar` / `Area` / `EnergyPlusSideCount` | Reused; a new `Convert/ToSAM` direction adds `Point3d`/`Point3dVector` → SAM. | +| Naming | `Core.OpenStudio.Query.OpenStudioName`, `Analytical.OpenStudio.Query.TryGetGuidSuffix` | Reused for matching/diagnostics only — see §6. | + +--- + +## 3. Confirmed OpenStudio 3.10.0 .NET API surface + +Verified by reflecting the referenced `OpenStudio.dll` (4 099 public types) — nothing below is assumed. + +* `ModelObject.additionalProperties() : AdditionalProperties`, `hasAdditionalProperties()`, + `removeAdditionalProperties()`. `AdditionalProperties.setFeature(string, string|double|int|bool)`, + `getFeatureAsString/Double/Integer/Boolean`, `hasFeature`, `featureNames`. + → the round-trip identity channel (§6) exists natively; no OSM schema extension is needed. +* `PlanarSurface` (base of `Surface`, `SubSurface`, `ShadingSurface`): `vertices() : Point3dVector`, + `outwardNormal()`, `plane()`, `grossArea()`, `netArea()`, `construction() : OptionalConstructionBase`, + `space() : OptionalSpace`, `isAirWall()`, `azimuth()`, `tilt()`. +* `PlanarSurfaceGroup` (base of `Space`, `ShadingSurfaceGroup`): `transformation()`, + `buildingTransformation()`, `siteTransformation()`, `directionofRelativeNorth()`, + `xOrigin()/yOrigin()/zOrigin()`. **Surface vertices are group-local, not world** — the group + transformation must be applied on import. +* `Transformation.Multiply(Point3dVector) : Point3dVector` — the vertex transform used. +* `Surface`: `surfaceType()`, `outsideBoundaryCondition()`, `adjacentSurface() : OptionalSurface`, + `subSurfaces() : SubSurfaceVector`, `isGroundSurface()`, `sunExposure()`, `windExposure()`. +* `SubSurface`: `subSurfaceType()`, `surface() : OptionalSurface`, `adjacentSubSurface()`, + `multiplier()`, `roughOpeningVertices()`, `assemblyUFactor()`, `assemblySHGC()`, + `daylightingDeviceTubular()`. +* `ShadingSurfaceGroup`: `shadingSurfaceType()` (`Site`|`Building`|`Space`), `space()`, + `shadedSurface()`, `shadedSubSurface()`, `shadingSurfaces()`. +* `Space`: `thermalZone()`, `spaceType()`, `buildingStory()`, `surfaces()`, `shadingSurfaceGroups()`, + `volume()`, `floorArea()`, `ceilingHeight()`, `multiplier()`, `people()`, `lights()`, + `electricEquipment()`, `gasEquipment()`, `spaceInfiltrationDesignFlowRates()`, + `designSpecificationOutdoorAir()`, `isVolumeAutocalculated()`. + +Boundary-condition string domain (`Surface.validOutsideBoundaryConditionValues()`): +`Adiabatic`, `Surface`, `Outdoors`, `Foundation`, `Ground`, `GroundFCfactorMethod`, +`OtherSideCoefficients`, `OtherSideConditionsModel`, `GroundSlabPreprocessorAverage` (+ variants), +`GroundBasementPreprocessorAverageWall` (+ variants). + +SubSurface type domain: `FixedWindow`, `OperableWindow`, `Door`, `GlassDoor`, +`OverheadDoor`, `Skylight`, `TubularDaylightDome`, `TubularDaylightDiffuser`. + +--- + +## 4. Reverse-mapping matrix + +Status vocabulary matches the forward manifest: **Native**, **Derived**, **Approximated**, +**Unsupported**, **Deferred**, **NA**. + +### 4.1 Model, site and metadata + +| OpenStudio source | SAM target | Status | Diagnostic | Tests | +|---|---|---|---|---| +| `Building.name` / `Model` name | `AnalyticalModel.Name` | Native | – | OSM-M1 | +| `Building.northAxis` | `AnalyticalModelParameter`-carried north axis (metadata) | Native | – | OSM-M1 | +| `Site.name/latitude/longitude/elevation` | `Core.Location` | Native | – | OSM-12 | +| `Site.timeZone` | model metadata | Native | – | OSM-12 | +| `Site.terrain`, `Site` ground temperatures | model metadata / not represented | Approximated | `SAM-OSI-WEA-001` | OSM-12 | +| `BuildingStory` | `SpaceParameter.LevelName` per space | Native | – | OSM-M1 | +| `DesignDay` (`SizingPeriod:DesignDay`) | `AnalyticalModelParameter.Heating/CoolingDesignDays` | Approximated | `SAM-OSI-WEA-001` | OSM-12 | +| `WeatherFile` (`OS:WeatherFile`) | `AnalyticalModelParameter.WeatherData` when the EPW is on disk, else path metadata | Derived | `SAM-OSI-WEA-001` | OSM-12 | +| `SimulationControl`, `Timestep`, `RunPeriod`, `ShadowCalculation` | model metadata where a SAM equivalent exists | Approximated | `SAM-OSI-SET-001` | OSM-12 | + +An OSM import **never requires an EPW** to convert geometry and analytical data. Embedded SAM +`WeatherData` is created only when actual hourly weather is available: when the referenced EPW is +found on disk it is loaded and embedded, and when it is not, only the path is recorded — a +`WeatherFile` reference alone is never presented as embedded weather. + +### 4.2 Spaces and zones + +| OpenStudio source | SAM target | Status | Diagnostic | Tests | +|---|---|---|---|---| +| `Space` | `Space` (1:1, never collapsed by zone) | Native | – | OSM-1, OSM-2 | +| `Space.name` | `Space.Name` | Native | – | OSM-1 | +| `Space.buildingStory` | `SpaceParameter.LevelName` | Native | – | OSM-M1 | +| space shell → internal point | `Space.Location` | Derived | `SAM-OSI-APX-001` when the shell will not close and the vertex centroid is used | OSM-1 | +| `Space.floorArea()` / shell area | `SpaceParameter.Area` | Derived | – | OSM-1 | +| `Space.volume()` / shell volume | `SpaceParameter.Volume` | Derived | – | OSM-1 | +| `ThermalZone` with N > 1 spaces | N SAM spaces sharing zone-derived controls | Native | `SAM-OSI-ZONE-001` (information) | OSM-M2 | +| `ThermalZone.thermostatSetpointDualSetpoint` | `InternalCondition` heating/cooling setpoints | Native | `SAM-OSI-LOAD-001` | OSM-11 | +| `ZoneHVACIdealLoadsAirSystem` | `SpaceParameter`-level conditioned flag | Derived | – | OSM-11 | +| `AirLoopHVAC`, `PlantLoop`, zone equipment | *not imported* | Deferred | `SAM-OSI-HVAC-001` | OSM-13 | +| `Space` with no surfaces | reported, still created | – | `SAM-OSI-ZONE-002` | OSM-13 | + +### 4.3 Surfaces → panels + +`PanelType` is derived from **both** `surfaceType()` and `outsideBoundaryCondition()`: + +| `surfaceType` | `outsideBoundaryCondition` | SAM `PanelType` | Status | +|---|---|---|---| +| Wall | Outdoors | `WallExternal` | Native | +| Wall | Surface | `WallInternal` | Native | +| Wall | Adiabatic | `WallInternal` + `PanelParameter.Adiabatic` | Native | +| Wall | Ground / Foundation / Ground\* | `UndergroundWall` | Native | +| Floor | Outdoors | `FloorExposed` | Native | +| Floor | Surface | `FloorInternal` | Native | +| Floor | Adiabatic | `FloorInternal` + `Adiabatic` | Native | +| Floor | Ground / Foundation / Ground\* | `SlabOnGrade` | Native | +| RoofCeiling | Outdoors | `Roof` | Native | +| RoofCeiling | Surface | `Ceiling` | Native | +| RoofCeiling | Adiabatic | `Ceiling` + `Adiabatic` | Native | +| RoofCeiling | Ground / Foundation | `UndergroundCeiling` | Native | +| any | `isAirWall()` / `ConstructionAirBoundary` | `Air` | Native | +| any | `OtherSideCoefficients`, `OtherSideConditionsModel` | `Adiabatic` fallback | Approximated (`SAM-OSI-BC-001`) | +| any | unrecognised | `Undefined` | Unsupported (`SAM-OSI-BC-001`) | + +Adjacency: **`Surface.adjacentSurface()` handles are authoritative**. Two paired surfaces +produce **one** SAM `Panel` related to **two** SAM `Space`s. Geometric coincidence matching is +only a validated fallback (`SAM-OSI-ADJ-001` when it is used, `SAM-OSI-ADJ-002` when pairing +fails and the surface is demoted to adiabatic). + +### 4.4 SubSurfaces → apertures + +| `subSurfaceType` | SAM `ApertureType` | Status | Diagnostic | +|---|---|---|---| +| `FixedWindow` | `Window` | Native | – | +| `OperableWindow` | `Window` (openability not represented) | Approximated | `SAM-OSI-APX-001` | +| `Skylight` | `Window` | Native | – | +| `Door` / `OverheadDoor` | `Door` | Native | – | +| `GlassDoor` | `Door` with transparent panes | Native | – | +| `TubularDaylightDome` / `…Diffuser` | `Window` | Approximated | `SAM-OSI-APX-001` | +| any other | *skipped* | Unsupported | `SAM-OSI-SUB-001` | + +`SubSurface.multiplier() > 1` is reported (`SAM-OSI-APX-001`) — SAM has no aperture multiplier. + +### 4.5 Shading + +| OpenStudio source | SAM target | Status | +|---|---|---| +| `ShadingSurface` in a `Site`/`Building`/`Space` group | `Panel` with `PanelType.Shade` | Native | +| group type + group name | panel metadata | Native | +| `ShadingSurfaceGroup.shadedSurface/shadedSubSurface` | recorded in metadata only | Approximated (`SAM-OSI-APX-001`) | + +Group transformations (`ShadingSurfaceGroup.transformation()` composed with the owning space's +`buildingTransformation()` for `Space`-type groups) are applied. + +### 4.6 Materials and constructions + +| OpenStudio material | SAM material | Status | Diagnostic | +|---|---|---|---| +| `StandardOpaqueMaterial` | `OpaqueMaterial` (+ thickness on the layer) | Native | – | +| `MasslessOpaqueMaterial` | `OpaqueMaterial` derived from R at a nominal 0.025 m | Derived | `SAM-OSI-APX-001` | +| `AirGap` | `GasMaterial` (air) with `HeatTransferCoefficient = 1/R` | Derived | `SAM-OSI-APX-001` | +| `StandardGlazing` | `TransparentMaterial` | Native | – | +| `SimpleGlazing` | `TransparentMaterial` derived from U/SHGC/VT | Approximated | `SAM-OSI-APX-001` | +| `Gas` / `GasMixture` | `GasMaterial` | Native / Approximated | `SAM-OSI-MAT-001` for mixtures | +| `Blind`, `Shade`, `Screen`, `RefractionExtinctionGlazing`, thermochromic, EMS-driven | placeholder layer + report | Unsupported | `SAM-OSI-MAT-001` | + +`Construction` → SAM `Construction` (opaque) or `ApertureConstruction` (fenestration), **layer order +preserved outside-first** exactly as the forward direction writes it. `ConstructionAirBoundary` +→ `PanelType.Air`. `ConstructionWithInternalSource`, `CFactorUndergroundWall`, +`FFactorGroundFloor` → `SAM-OSI-CON-001`. Unreferenced materials/constructions are pruned after +conversion, mirroring the Ladybug reverse converter. + +### 4.7 Loads, controls and schedules + +| OpenStudio source | SAM `InternalCondition` target | Status | Diagnostic | +|---|---|---|---| +| `People` / `PeopleDefinition` | `AreaPerPerson`, `Occupancy*GainPerPerson`, `OccupancyProfileName` | Derived | `SAM-OSI-LOAD-001` | +| `Lights` / `LightsDefinition` | `LightingGain`, `LightingProfileName` | Native | – | +| `ElectricEquipment` | `EquipmentSensibleGain`, profile | Native | – | +| `GasEquipment` | reported | Unsupported | `SAM-OSI-LOAD-001` | +| `SpaceInfiltrationDesignFlowRate` | `InfiltrationAirChangesPerHour` | Derived | `SAM-OSI-LOAD-001` when the design-flow method needs zone data | +| `SpaceInfiltrationEffectiveLeakageArea` | reported | Unsupported | `SAM-OSI-LOAD-001` | +| `DesignSpecificationOutdoorAir` | `SpaceParameter.OutsideSupplyAirFlow` | Derived | – | +| `ThermostatSetpointDualSetpoint` | heating/cooling setpoints + profiles | Native | – | +| `ZoneControlHumidistat` | humidification/dehumidification setpoints | Native | – | +| `SpaceType` | one deduplicated `InternalCondition` per space type | Native | – | +| space-level loads overriding a space type | per-space `InternalCondition` clone | Derived | `SAM-OSI-LOAD-002` | + +| OpenStudio schedule | SAM `Profile` | Status | Diagnostic | +|---|---|---|---| +| `ScheduleConstant` | constant profile | Native | – | +| `ScheduleRuleset` (+ `ScheduleDay`, `ScheduleRule`) | annual profile honouring weekday/weekend and seasonal rules | Derived | – | +| `ScheduleYear` / `ScheduleWeek` | annual profile | Derived | – | +| `ScheduleFixedInterval` (hourly) | annual profile | Native | – | +| `ScheduleFixedInterval` (sub-hourly) | hourly means | Approximated | `SAM-OSI-SCH-001` | +| `ScheduleCompact`, `ScheduleFile`, `ScheduleVariableInterval` | reported | Unsupported | `SAM-OSI-SCH-001` | + +Profiles not referenced by an imported `InternalCondition` are removed. + +--- + +## 5. Diagnostic codes added + +All reverse-only codes live in `SAM.Core.OpenStudio.OpenStudioImportDiagnosticCodes` and use the +`SAM-OSI-*` prefix so they never collide with the forward `SAM-OS-*` codes. + +| Code | Meaning | +|---|---| +| `SAM-OSI-IN-001` | Invalid or missing input path | +| `SAM-OSI-IN-002` | Unsupported file extension | +| `SAM-OSI-OSM-001` | OSM could not be loaded | +| `SAM-OSI-OSM-002` | OSM version translation failed or reported errors | +| `SAM-OSI-OSW-001` | OSW could not be parsed | +| `SAM-OSI-OSW-002` | OSW declares no `seed_file` | +| `SAM-OSI-OSW-003` | OSW `seed_file` could not be resolved on disk | +| `SAM-OSI-OSW-004` | Workflow measures were **not** applied (execution disabled) | +| `SAM-OSI-OSW-005` | Workflow execution failed | +| `SAM-OSI-OSW-006` | Final post-model-measure OSM not found | +| `SAM-OSI-OSW-007` | EnergyPlus-measure changes are not representable in the OSM | +| `SAM-OSI-OSW-008` | Workflow executed; final post-model-measure OSM imported | +| `SAM-OSI-OSW-009` | Workflow produced a model but no EnergyPlus results (irrelevant to an import; Information) | +| `SAM-OSI-GEO-001` | Invalid or unconvertible geometry | +| `SAM-OSI-GEO-002` | Duplicate/collinear vertices removed (shape unchanged; Information) | +| `SAM-OSI-ADJ-001` | Adjacency resolved by geometric fallback, not by handle | +| `SAM-OSI-ADJ-002` | Adjacency pairing failed | +| `SAM-OSI-BC-001` | Unsupported outside boundary condition | +| `SAM-OSI-SUB-001` | Unsupported subsurface type | +| `SAM-OSI-MAT-001` | Unsupported material | +| `SAM-OSI-CON-001` | Unsupported construction | +| `SAM-OSI-SCH-001` | Unsupported schedule | +| `SAM-OSI-LOAD-001` | Unsupported load or control | +| `SAM-OSI-LOAD-002` | Conflicting space-type / space-level load assignment | +| `SAM-OSI-HVAC-001` | Detailed HVAC object not imported | +| `SAM-OSI-ZONE-001` | Multi-space thermal zone | +| `SAM-OSI-ZONE-002` | Orphaned space or zone with incomplete geometry | +| `SAM-OSI-ID-001` | Invalid, duplicate or missing SAM identity metadata | +| `SAM-OSI-WEA-001` | Weather/design-day/site limitation | +| `SAM-OSI-SET-001` | Simulation setting without a SAM equivalent | +| `SAM-OSI-APX-001` | Documented approximation applied | + +--- + +## 6. Identity and round-trip metadata + +**Audit finding:** the forward exporter currently stores SAM identity **only** in the +deterministic object name `SAM___` +(`Core.OpenStudio.Query.OpenStudioName`). A repository-wide search for `additionalProperties` +returns **no hits** — no full SAM GUID is persisted anywhere in the OSM today, and the +eight-character prefix cannot reconstruct a 128-bit GUID. + +**Change made (non-breaking):** the forward converters now also write namespaced features onto +every exported object's `AdditionalProperties`: + +| Key | Value | +|---|---| +| `SAM.Guid` | full `Guid.ToString("D")` | +| `SAM.Type` | SAM runtime type name | +| `SAM.Name` | original (unsanitised) SAM name | + +This adds `OS:AdditionalProperties` objects to the OSM. It changes no existing field, no object +name and no simulation input, so the released `SAMAnalytical.ToOpenStudio` contract is unaffected. + +**Reverse behaviour:** + +1. A valid full `SAM.Guid` is restored onto the imported SAM object. +2. Otherwise a fresh SAM GUID is created. +3. The OpenStudio handle and original name are preserved as source metadata regardless. +4. `TryGetGuidSuffix` (8 hex chars) is used **only** for matching and diagnostics — never treated + as a globally unique GUID. +5. An invalid or already-used `SAM.Guid` raises `SAM-OSI-ID-001` and a new GUID is issued. + +Third-party OSM files with no SAM metadata import normally; the absence of metadata is not a +diagnostic. + +--- + +## 7. OSW behaviour contract + +Parsed with `System.Text.Json`. + +| Case | `executeWorkflow` | Behaviour | +|---|---|---| +| Seed OSM present | `false` | Resolve `seed_file` against the OSW directory and `file_paths`; import the seed; **warn** `SAM-OSI-OSW-004` that measures were not applied; `ResolvedOsmPath` = seed. | +| Seed OSM present | `true` | Run the supplied OSW verbatim through the existing CLI runner (steps and arguments untouched); locate the final post-model-measure OSM from `out.osw` / the run directory; import it; preserve every CLI diagnostic. | +| No seed | `false` | Blocking `SAM-OSI-OSW-002` — no model exists to import. | +| No seed | `true` | Allow model-creation measures to produce the model; import the resulting OSM; fail with `SAM-OSI-OSW-006` if none is produced. | + +The final OSM is located deterministically (in order): the `out.osw` `"osm_path"`, then +`run/in.osm`, then the newest `*.osm` written under the run directory after the run started. +No unverified hard-coded filename is trusted. + +EnergyPlus measures may change only the generated IDF. The returned `AnalyticalModel` represents +the final available **OpenStudio** model; `SAM-OSI-OSW-007` states this whenever the workflow +contains EnergyPlus-measure steps. + +--- + +## 8. Public API + +```csharp +namespace SAM.Analytical.OpenStudio +{ + public static partial class Convert + { + // OpenStudio model in memory (caller owns the model) + public static OpenStudioImportResult ToSAM(this global::OpenStudio.Model model, Core.OpenStudio.OpenStudioImportOptions options = null); + + // OSM or OSW path; native resources are created and disposed inside + public static OpenStudioImportResult ToSAM(string path, Core.OpenStudio.OpenStudioImportOptions options = null, + Core.OpenStudio.OpenStudioRunOptions runOptions = null, IProgress<…> progress = null, CancellationToken cancellationToken = default); + + public static Task ToSAMAsync(string path, …); + } +} +``` + +`OpenStudioImportResult` exposes `AnalyticalModel`, `SourcePath`, `ResolvedOsmPath`, +`Diagnostics`, `Statistics`, `IsValid`, `Successful`, `OpenStudioVersion`. It **never** exposes a +live native model; models loaded from disk are disposed deterministically after conversion. + +--- + +## 9. Out of scope for this phase + +Detailed HVAC (air/plant loops, zone equipment, controls) is reported through +`SAM-OSI-HVAC-001` and not translated. Ground-temperature objects, AirflowNetwork, +daylighting controls, EMS, and refrigeration/water systems are likewise reported, not imported. diff --git a/docs/openstudio-to-sam-usage.md b/docs/openstudio-to-sam-usage.md new file mode 100644 index 0000000..30fc0a6 --- /dev/null +++ b/docs/openstudio-to-sam-usage.md @@ -0,0 +1,172 @@ +# OpenStudio → SAM Analytical import — usage and limitations + +Status: 2026-07-21, branch `feature/openstudio-to-sam-analytical`. + +Companion documents: +[audit and mapping matrix](openstudio-to-sam-import-audit.md) · +[coverage tables](SAM_OPENSTUDIO_TO_SAM_COVERAGE.md) · +[forward direction](openstudio-mvp-usage.md). + +--- + +## 1. Grasshopper + +**Component:** `OpenStudio.SAMAnalytical` (SAM ▸ OpenStudio), version 1.0.0. + +| Input | Required | Meaning | +|---|---|---| +| `_path` | yes | An `.osm` or `.osw` file. | +| `executeWorkflow_` | no, default `false` | OSW only. `false` imports the workflow's **seed** model; `true` runs the workflow and imports its **output**. Ignored for an OSM. | +| `outputDirectory_` | no | Where an executed workflow runs. Defaults to the OSW's own directory. Unused for an OSM. | +| `cancel_` | no | Cancels a running import; the CLI/EnergyPlus process tree is terminated. | + +| Output | Meaning | +|---|---| +| `analyticalModel` | The imported SAM `AnalyticalModel` (typed parameter). | +| `resolvedOsmPath` | The OSM actually converted — see §3. | +| `diagnostics` | Every approximation, unsupported object and failure. | +| `successful` | True when a model was produced and no diagnostic has Error severity. | + +The component is asynchronous: the canvas stays responsive while a workflow runs, and warnings +and errors also appear as runtime messages on the component itself. + +## 2. API + +```csharp +using SAM.Analytical.OpenStudio; + +// From a path (OSM or OSW). The native model is loaded and disposed inside. +OpenStudioImportResult result = Convert.ToSAM(@"C:\models\office.osm"); + +// Asynchronous, cancellable — the right choice for an executed workflow. +OpenStudioImportResult result = await Convert.ToSAMAsync( + @"C:\models\workflow.osw", + new Core.OpenStudio.OpenStudioImportOptions { ExecuteWorkflow = true }, + cancellationToken: token); + +// From a model you already hold. You own the model; the importer never disposes it. +OpenStudioImportResult result = model.ToSAM(); + +AnalyticalModel analyticalModel = result.AnalyticalModel; +``` + +`OpenStudioImportResult` carries `AnalyticalModel`, `SourcePath`, `ResolvedOsmPath`, +`OpenStudioVersion`, `RunResult`, `Diagnostics`, `Statistics`, `IsValid` and `Successful`. It is +**not** disposable and never exposes a live native model: a model loaded from disk is released +before the result is returned. + +`IsValid` means "a model was produced and nothing errored". `Successful` means "a model was +produced at all" — an import that recovered from errors still returns a usable, incomplete model, +and the two must be distinguishable. + +### Options + +`Core.OpenStudio.OpenStudioImportOptions` controls tolerances (`DistanceTolerance`, +`AngleTolerance`, `MinimumArea`), what is imported (`IncludeShading`, `IncludeConstructions`, +`IncludeInternalConditions`), whether unpaired interzone surfaces may be matched geometrically +(`AllowGeometricAdjacencyFallback`), whether stamped SAM Guids are restored +(`RestoreSAMIdentity`), workflow execution (`ExecuteWorkflow`, `OutputDirectory`) and library +pruning (`PruneUnreferencedLibraryEntries`). + +## 3. OSM versus OSW + +**An OSM** is converted directly. The OpenStudio CLI is never invoked, and **no EPW is required** +to import geometry and analytical data. Older files are upgraded on load by the +`VersionTranslator`; the pre-translation version is reported, and translator warnings are +surfaced even on a successful load. + +**An OSW is a workflow description, not a building model.** Parsing it tells you what the +workflow *would* produce, never what it *does*. The two cases stay explicit: + +| Case | `executeWorkflow_` | Result | `ResolvedOsmPath` | +|---|---|---|---| +| Seed OSM present | `false` | The **seed** is imported. `SAM-OSI-OSW-004` states that the workflow's measures were NOT applied. | the seed | +| Seed OSM present | `true` | The workflow runs verbatim; the **final post-model-measure OSM** is imported. | the final OSM | +| No seed | `false` | Blocking `SAM-OSI-OSW-002` — no model exists to import. | – | +| No seed | `true` | Model-creation measures build the model, which is then imported. | the final OSM | + +Seed resolution follows the CLI's own search order — the path as given, `/files`, then each +`file_paths` entry and its `files` subdirectory — and a failure names every location tried. + +Executed workflows are staged into a per-import GUID run directory with path fields made absolute +and `run_directory` pinned, so parallel imports of one OSW cannot collide. **Steps and their +arguments are copied verbatim**: the workflow that executes is the one you supplied. + +The final OSM is located deterministically — `out.osw`'s recorded `osm_path`, then the CLI's +`run/in.osm`, then the newest OSM written under the run directory *after the run started*. No +unverified filename is trusted, and a stale OSM from an earlier run cannot be mistaken for this +run's output. + +A workflow of model measures with **no simulation step** produces a model but no EnergyPlus +results. That is a *successful import* — an import needs the model, not the results — so the +shared simulation runner's "no SQL results" verdict is downgraded to an informational +`SAM-OSI-OSW-009` and never invalidates the imported model. Genuine CLI failures, fatal errors +and EnergyPlus severe errors pass through unchanged at their original severity. + +## 4. Round-trip identity + +The forward exporter stamps `SAM.Guid`, `SAM.Type` and `SAM.Name` into each object's +`OS:AdditionalProperties`. This is additive — a separate OSM object — so no field, object name or +EnergyPlus input changes and the released `SAMAnalytical.ToOpenStudio` contract is unaffected. + +On import a valid, unclaimed Guid of the right type is restored. Malformed, duplicated or +mistyped metadata raises `SAM-OSI-ID-001` and a fresh Guid is issued. **A third-party OSM carries +none of this and imports normally** — the absence of metadata is not a diagnostic. + +The deterministic name suffix `SAM___` is 32 bits of a 128-bit Guid. It is +used for matching and diagnostics only and is never treated as a restorable identity. + +## 5. What survives a round trip + +`AnalyticalModel → OSM → AnalyticalModel` preserves, within declared tolerances: space count and +names; panel count with interzone partitions deduplicated back to one shared panel; panel types +and boundary conditions; adjacency (panel ↔ two spaces); aperture count, type and area; volume +and floor area; construction assignments and layer order; material properties, including an air +cavity's heat transfer coefficient exactly (forward writes `R = 1/h`, reverse reads `h = 1/R`); +internal-condition assignments; schedules as 8760-value profiles; setpoints; location; and full +SAM Guids at model, space, panel and aperture level. + +The OSM is not expected to be byte-identical in either direction. + +## 6. Limitations + +**Reported, not imported.** Detailed HVAC (air loops, plant loops, zone equipment, control +sequences), gas/steam/hot-water/other equipment, luminaires, IT equipment, internal mass, +non-design-flow infiltration, AirflowNetwork, daylighting controls, EMS, refrigeration, and +`ScheduleCompact`/`ScheduleFile`/`ScheduleVariableInterval`. Each raises its diagnostic; none is +silently dropped. + +**Approximated, and said so.** `MasslessOpaqueMaterial` (resistance preserved exactly, a near-zero +thermal mass assigned at a nominal 25 mm); `SimpleGlazing` (U preserved, solar transmittance taken +from SHGC, which overstates it); gas mixtures (conductance preserved, composition lost); operable +windows and tubular daylighting devices (geometry and construction preserved, behaviour not); +subsurface multipliers; sub-hourly schedules (averaged to hourly means); design days (name, date +and heating/cooling role only — an EnergyPlus design day is parametric, a SAM `DesignDay` is an +hourly weather day). + +**Weather.** A `OS:WeatherFile` names an EPW; it does not contain one. When that EPW is found on +disk — as it is for a SAM round trip, whose forward export writes the file — its hourly weather is +loaded into SAM `WeatherData` and embedded in the model, and the model round-trips back to an EPW +on the next export. When the file is absent, or `OpenStudioImportOptions.ImportWeatherData` is +off, only the path is recorded on `OpenStudioSourceParameter.WeatherFilePath` and a diagnostic +states that no weather was embedded — a bare reference is never presented as embedded weather. + +**EnergyPlus measures.** They modify only the generated IDF, not the OpenStudio model, so their +changes cannot appear in the imported SAM model. `SAM-OSI-OSW-007` states this whenever a workflow +has steps. + +**Loads on spaces rather than space types.** SAM holds loads on the internal condition only, so +space-level loads are reported (`SAM-OSI-LOAD-002`) and not imported. Likewise, gains are imported +as densities and never resolved against one space's floor area, because a space type is shared. + +**Geometry is never repaired.** A boundary that fails validation — too few vertices, non-planar, +self-intersecting, below the minimum area, an aperture outside its host — is reported with the +OpenStudio object's name and handle and skipped. + +## 7. Diagnostics + +All reverse codes use the `SAM-OSI-*` prefix, disjoint from the forward `SAM-OS-*` codes, so a +consumer can tell which direction produced a diagnostic from the code alone. The full list is in +[`OpenStudioImportDiagnosticCodes`](../SAM_OpenStudio/SAM.Core.OpenStudio/Variables/OpenStudioImportDiagnosticCodes.cs) +and in §5 of the [audit](openstudio-to-sam-import-audit.md); every code is claimed by a coverage +manifest entry, enforced by `ReverseCoverageTests`. diff --git a/tests/SAM.Analytical.OpenStudio.Tests/C1/AdapterHardeningTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/C1/AdapterHardeningTests.cs new file mode 100644 index 0000000..fa868a0 --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/C1/AdapterHardeningTests.cs @@ -0,0 +1,269 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using System; +using System.Globalization; +using System.IO; +using System.Linq; +using AnalyticalCreate = SAM.Analytical.Create; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// C1: adapter-hardening regression tests — one per fix (review P3 items): culture-safe + /// conditioned classification, per-(Guid, ProfileType) schedule caching, per-space SpaceType + /// share keys, story fallback without floor panels, no CLI on conversion errors, no + /// thermostat on a surfaceless conditioned zone, translation statistics, result disposal, + /// parameterised SQL extraction and multi-variant object-map behaviour. + /// + [TestFixture] + public class AdapterHardeningTests + { + private static string WeatherPath(string extension) + { + return Path.GetFullPath(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "..", "..", "..", "resources", "weather", "USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2004-2018" + extension)); + } + + [Test] + public void IsConditioned_IsCultureIndependent() + { + CultureInfo previous = CultureInfo.CurrentCulture; + try + { + // tr-TR lowercases 'I' to 'ı' — a culture-sensitive ToLower would turn + // "UNCONDITIONED" into "uncondıtıoned" and misclassify the space as conditioned. + CultureInfo.CurrentCulture = new CultureInfo("tr-TR"); + + Space unconditioned = new Space("Store"); + unconditioned.InternalCondition = new InternalCondition("UNCONDITIONED STORE"); + Assert.That(unconditioned.IsConditioned(), Is.False, "UNCONDITIONED must stay unconditioned under tr-TR"); + + Space external = new Space("Outside"); + external.InternalCondition = new InternalCondition("External Zone"); + Assert.That(external.IsConditioned(), Is.False); + + Space office = new Space("Office"); + office.InternalCondition = new InternalCondition("Office"); + Assert.That(office.IsConditioned(), Is.True); + } + finally + { + CultureInfo.CurrentCulture = previous; + } + } + + [Test] + public void ProfileCache_IsKeyedByProfileType() + { + double[] values = new double[24]; + for (int i = 0; i < values.Length; i++) + { + values[i] = 0.5; + } + + Profile profile = new Profile("Shared Profile", ProfileType.Lighting, values); + OpenStudioConversionContext context = new OpenStudioConversionContext(null, new global::OpenStudio.Model()); + + global::OpenStudio.Schedule fractional = profile.ToOpenStudio(ProfileType.Lighting, context); + global::OpenStudio.Schedule temperature = profile.ToOpenStudio(ProfileType.Heating, context); + global::OpenStudio.Schedule fractionalAgain = profile.ToOpenStudio(ProfileType.Lighting, context); + + Assert.That(fractional, Is.Not.Null); + Assert.That(temperature, Is.Not.Null); + Assert.That(ReferenceEquals(fractional, temperature), Is.False, "The same profile under a different ProfileType must produce a separate schedule"); + Assert.That(ReferenceEquals(fractional, fractionalAgain), Is.True, "Same profile and type must hit the cache"); + Assert.That(fractional.nameString(), Is.Not.EqualTo(temperature.nameString())); + Assert.That(context.ScheduleMap.Count, Is.EqualTo(2)); + } + + [Test] + public void SpaceType_DifferentSpaceDensities_DoNotShare() + { + OpenStudioConversionResult shared = AnalyticalModelFixtures.TwoAdjacentBoxes().ToOpenStudio(); + Assert.That(shared.Model.getSpaceTypes().Count, Is.EqualTo(1), "Identical spaces sharing a condition must share one SpaceType"); + + OpenStudioConversionResult different = AnalyticalModelFixtures.TwoAdjacentBoxes(spaceBVolume: 30).ToOpenStudio(); + Assert.That(different.Model.getSpaceTypes().Count, Is.EqualTo(2), "Spaces with different computed densities must not share one SpaceType (first-space values are never imposed)"); + } + + [Test] + public void BuildingStory_FallsBackToSpaceElevation_WithoutFloorPanels() + { + AdjacencyCluster adjacencyCluster = new AdjacencyCluster(); + + Space space = new Space(new Guid("99999999-0000-0000-0000-000000000099"), "Space NoFloors", new Geometry.Spatial.Point3D(2.5, 2, 1.5)); + space.SetValue(SpaceParameter.Area, 20.0); + space.SetValue(SpaceParameter.Volume, 60.0); + space.InternalCondition = AnalyticalModelFixtures.CreateOfficeInternalCondition(); + adjacencyCluster.AddObject(space); + + Geometry.Spatial.Point3D P(double x, double y, double z) => new Geometry.Spatial.Point3D(x, y, z); + Geometry.Spatial.Face3D F(params Geometry.Spatial.Point3D[] point3Ds) => new Geometry.Spatial.Face3D(new Geometry.Spatial.Polygon3D(point3Ds)); + + Panel[] panels = new Panel[] + { + AnalyticalCreate.Panel(AnalyticalModelFixtures.WallConstruction, PanelType.WallExternal, F(P(0, 0, 0), P(5, 0, 0), P(5, 4, 0), P(0, 4, 0))), + AnalyticalCreate.Panel(AnalyticalModelFixtures.WallConstruction, PanelType.WallExternal, F(P(0, 0, 3), P(5, 0, 3), P(5, 4, 3), P(0, 4, 3))), + AnalyticalCreate.Panel(AnalyticalModelFixtures.WallConstruction, PanelType.WallExternal, F(P(0, 0, 0), P(5, 0, 0), P(5, 0, 3), P(0, 0, 3))), + AnalyticalCreate.Panel(AnalyticalModelFixtures.WallConstruction, PanelType.WallExternal, F(P(0, 0, 0), P(0, 4, 0), P(0, 4, 3), P(0, 0, 3))), + AnalyticalCreate.Panel(AnalyticalModelFixtures.WallConstruction, PanelType.WallExternal, F(P(0, 4, 0), P(5, 4, 0), P(5, 4, 3), P(0, 4, 3))), + AnalyticalCreate.Panel(AnalyticalModelFixtures.WallConstruction, PanelType.WallExternal, F(P(5, 0, 0), P(5, 4, 0), P(5, 4, 3), P(5, 0, 3))), + }; + + foreach (Panel panel in panels) + { + adjacencyCluster.AddObject(panel); + adjacencyCluster.AddRelation(space, panel); + } + + AnalyticalModel analyticalModel = new AnalyticalModel("No Floor Panels Model", "C1 story fallback fixture", null, null, adjacencyCluster, AnalyticalModelFixtures.CreateMaterialLibrary(), AnalyticalModelFixtures.CreateProfileLibrary()); + OpenStudioConversionResult result = analyticalModel.ToOpenStudio(); + + Assert.That(result.Model.getBuildingStorys().Count, Is.EqualTo(1), "A model without floor-group panels must still get a story from the space elevation"); + Assert.That(result.Model.getBuildingStorys()[0].nominalZCoordinate().get(), Is.EqualTo(0).Within(1e-6)); + Assert.That(result.Diagnostics.Any(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Information && d.Message.Contains("space minimum elevations")), Is.True); + } + + [Test] + public void Runner_DoesNotRunCli_WhenConversionHasErrors() + { + string epwPath = WeatherPath(".epw"); + Assert.That(File.Exists(epwPath), Is.True, $"Pinned weather fixture missing: {epwPath}"); + + string outputDirectory = Path.Combine(TestContext.CurrentContext.WorkDirectory, "c1_haserrors_gate"); + if (Directory.Exists(outputDirectory)) + { + Directory.Delete(outputDirectory, true); + } + + // DegeneratePanelBox raises a SAM-OS-GEO-001 Error at conversion. + OpenStudioConversionResult result = AnalyticalModelFixtures.DegeneratePanelBox().ToOpenStudio(epwPath, outputDirectory); + + Assert.That(result.IsValid, Is.False); + Assert.That(result.RunResult, Is.Null, "The CLI must not run when the conversion reported errors"); + Assert.That(result.Loads, Is.Null); + Assert.That(File.Exists(result.OsmPath), Is.True, "The OSM is still saved for inspection"); + Assert.That(result.Diagnostics.Any(d => d.Code == "SAM-OS-RUN-001" && d.Message.Contains("conversion reported errors")), Is.True); + } + + [Test] + public void ConditionedSpace_WithoutSurfaces_GetsNoThermostatOrIdealLoads() + { + AdjacencyCluster adjacencyCluster = new AdjacencyCluster(); + + Space space = new Space(new Guid("99999999-0000-0000-0000-000000000098"), "Space NoPanels", new Geometry.Spatial.Point3D(2.5, 2, 1.5)); + space.SetValue(SpaceParameter.Area, 20.0); + space.SetValue(SpaceParameter.Volume, 60.0); + space.InternalCondition = AnalyticalModelFixtures.CreateOfficeInternalCondition(); + adjacencyCluster.AddObject(space); + + AnalyticalModel analyticalModel = new AnalyticalModel("No Panels Model", "C1 surfaceless conditioned zone fixture", null, null, adjacencyCluster, AnalyticalModelFixtures.CreateMaterialLibrary(), AnalyticalModelFixtures.CreateProfileLibrary()); + OpenStudioConversionResult result = analyticalModel.ToOpenStudio(); + + Assert.That(result.IsValid, Is.False, "A conditioned zone without surfaces must invalidate the conversion"); + Assert.That(result.Diagnostics.Any(d => d.Code == "SAM-OS-HVAC-001" && d.Message.Contains("no valid surfaces")), Is.True); + Assert.That(result.Model.getThermostatSetpointDualSetpoints().Count, Is.EqualTo(0)); + Assert.That(result.Model.getZoneHVACIdealLoadsAirSystems().Count, Is.EqualTo(0)); + } + + [Test] + public void TranslationStatistics_ArePopulated_AndSnapshotted() + { + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox().ToOpenStudio(); + + Core.OpenStudio.OpenStudioConversionStatistics statistics = result.Statistics; + Assert.That(statistics, Is.Not.Null); + Assert.That(statistics.SourceObjects, Is.EqualTo(8), "1 space + 6 panels + 1 aperture"); + Assert.That(statistics.CreatedObjects, Is.GreaterThan(0)); + Assert.That(statistics.SkippedObjects, Is.EqualTo(0)); + Assert.That(statistics.ErrorCount, Is.EqualTo(0)); + + int createdAtSnapshot = statistics.CreatedObjects; + + OpenStudioConversionResult degenerate = AnalyticalModelFixtures.DegeneratePanelBox().ToOpenStudio(); + Assert.That(degenerate.Statistics.SkippedObjects, Is.GreaterThan(0), "The skipped degenerate panel must be counted"); + Assert.That(degenerate.Statistics.ErrorCount, Is.GreaterThan(0)); + Assert.That(statistics.CreatedObjects, Is.EqualTo(createdAtSnapshot), "The snapshot must not change with later conversions"); + } + + [Test] + public void ConversionResult_Dispose_ReleasesModel_Idempotently() + { + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox().ToOpenStudio(); + global::OpenStudio.Model model = result.Model; + + result.Dispose(); + Assert.DoesNotThrow(() => result.Dispose(), "Dispose must be idempotent"); + Assert.That(() => model.getSpaces(), Throws.Exception, "The owned model must be unusable after disposal"); + } + + [Test] + public void CreateModel_LoadsThroughVersionTranslator() + { + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox().ToOpenStudio(); + + string osmPath = Path.Combine(TestContext.CurrentContext.WorkDirectory, "c1_version_translator.osm"); + if (File.Exists(osmPath)) + { + File.Delete(osmPath); + } + + Assert.That(result.Model.save(global::OpenStudio.OpenStudioUtilitiesCore.toPath(osmPath), true), Is.True); + + global::OpenStudio.Model reloaded = Core.OpenStudio.Create.Model(osmPath); + Assert.That(reloaded, Is.Not.Null, "VersionTranslator load must succeed"); + Assert.That(reloaded.getSpaces().Count, Is.EqualTo(result.Model.getSpaces().Count)); + } + + [Test] + public void ReadAnnualEnergy_HandlesKeysAndNamesWithQuotes() + { + string sqlPath = Path.Combine(TestContext.CurrentContext.WorkDirectory, "c1_parameterised_sql.sql"); + if (File.Exists(sqlPath)) + { + File.Delete(sqlPath); + } + + using (System.Data.SQLite.SQLiteConnection connection = new System.Data.SQLite.SQLiteConnection("Data Source=" + sqlPath)) + { + connection.Open(); + using (System.Data.SQLite.SQLiteCommand command = connection.CreateCommand()) + { + command.CommandText = "CREATE TABLE ReportDataDictionary (ReportDataDictionaryIndex INTEGER PRIMARY KEY, Name TEXT, KeyValue TEXT)"; + command.ExecuteNonQuery(); + command.CommandText = "CREATE TABLE ReportData (ReportDataIndex INTEGER PRIMARY KEY, ReportDataDictionaryIndex INTEGER, Value REAL)"; + command.ExecuteNonQuery(); + command.CommandText = "INSERT INTO ReportDataDictionary VALUES (1, @name, @key)"; + command.Parameters.AddWithValue("@name", "Zone Ideal Loads Supply Air Total Heating Energy"); + command.Parameters.AddWithValue("@key", "ZONE O'BRIEN"); + command.ExecuteNonQuery(); + command.CommandText = "INSERT INTO ReportData VALUES (1, 1, 3600000.0)"; + command.ExecuteNonQuery(); + command.CommandText = "INSERT INTO ReportData VALUES (2, 1, 7200000.0)"; + command.ExecuteNonQuery(); + } + } + + System.Collections.Generic.Dictionary result = OpenStudioSimulationRunner.ReadAnnualEnergy(sqlPath, "Zone Ideal Loads Supply Air Total Heating Energy"); + + Assert.That(result, Is.Not.Null); + Assert.That(result.Count, Is.EqualTo(1)); + Assert.That(result["ZONE O'BRIEN"], Is.EqualTo(3.0).Within(1e-9), "J → kWh conversion: 10 800 000 J = 3 kWh"); + } + + [Test] + public void ObjectMap_ConstructionVariants_RegisterOncePerSamGuid() + { + OpenStudioConversionContext context = new OpenStudioConversionContext(AnalyticalModelFixtures.SingleBox(), new global::OpenStudio.Model()); + + global::OpenStudio.Construction forward = AnalyticalModelFixtures.WallConstruction.ToOpenStudio(true, context); + global::OpenStudio.Construction reverse = AnalyticalModelFixtures.WallConstruction.ToOpenStudio(false, context); + + Assert.That(forward, Is.Not.Null); + Assert.That(reverse, Is.Not.Null); + Assert.That(context.ConstructionMap.Count, Is.EqualTo(2), "Forward and reverse variants coexist in the variant-aware cache"); + Assert.That(context.References.References.Count(x => x.SamGuid == AnalyticalModelFixtures.WallConstruction.Guid), Is.EqualTo(1), "Both variants trace back to one SAM Guid; the first registration wins and is never overwritten"); + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/C1/BoundaryConditionTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/C1/BoundaryConditionTests.cs new file mode 100644 index 0000000..36e2848 --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/C1/BoundaryConditionTests.cs @@ -0,0 +1,284 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using AnalyticalCreate = SAM.Analytical.Create; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// C1: boundary-condition regression tests — the Adiabatic panel flag must override the + /// PanelType mapping (LadybugTools New/BoundaryCondition.cs parity; coverage manifest + /// PanelParameter.Adiabatic / BoundaryType.Adiabatic) and an Air panel must convert to a + /// shared OS:Construction:AirBoundary on both paired sides (coverage manifest PanelType.Air). + /// + [TestFixture] + public class BoundaryConditionTests + { + private static List Surfaces(global::OpenStudio.Model model) + { + List surfaces = new List(); + foreach (global::OpenStudio.Surface surface in model.getSurfaces()) + { + surfaces.Add(surface); + } + + return surfaces; + } + + private static Geometry.Spatial.Face3D F(params Geometry.Spatial.Point3D[] point3Ds) + { + return new Geometry.Spatial.Face3D(new Geometry.Spatial.Polygon3D(point3Ds)); + } + + /// The pinned production model carrying an Air partition and two adiabatic slabs (tests/resources/models). + private static AnalyticalModel AdiabaticAirPanelModel() + { + string path = Path.GetFullPath(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "..", "..", "..", "resources", "models", "rawModel-WindowsWeatherDataDDYAdiabaticAirPanel.sam")); + Assert.That(File.Exists(path), Is.True, "Pinned model fixture missing: " + path); + + AnalyticalModel result = Core.Convert.ToSAM(path)?.FirstOrDefault(); + Assert.That(result, Is.Not.Null, "The pinned model must load"); + return result; + } + + private static global::OpenStudio.ConstructionAirBoundary AirBoundary(global::OpenStudio.Model model) + { + foreach (global::OpenStudio.ConstructionAirBoundary constructionAirBoundary in model.getConstructionAirBoundarys()) + { + return constructionAirBoundary; + } + + return null; + } + + [Test] + public void AdiabaticFlag_OverridesPanelTypeMapping() + { + Panel floor = AnalyticalCreate.Panel(AnalyticalModelFixtures.WallConstruction, PanelType.SlabOnGrade, F(new Geometry.Spatial.Point3D(0, 0, 0), new Geometry.Spatial.Point3D(5, 0, 0), new Geometry.Spatial.Point3D(5, 4, 0), new Geometry.Spatial.Point3D(0, 4, 0))); + + Assert.That(floor.PanelType.OutsideBoundaryCondition(), Is.EqualTo("Ground"), "The PanelType mapping is unchanged: SlabOnGrade stays Ground"); + Assert.That(floor.OutsideBoundaryCondition(), Is.EqualTo("Ground"), "Without the flag the panel follows its PanelType"); + + floor.SetValue(PanelParameter.Adiabatic, true); + Assert.That(floor.OutsideBoundaryCondition(), Is.EqualTo("Adiabatic"), "The Adiabatic flag must win over the SlabOnGrade Ground mapping"); + + floor.SetValue(PanelParameter.Adiabatic, false); + Assert.That(floor.OutsideBoundaryCondition(), Is.EqualTo("Ground"), "An explicit false flag falls back to the PanelType mapping"); + } + + [Test] + public void AirPanel_IsNeverAdiabatic() + { + Panel airPanel = AnalyticalCreate.Panel(null, PanelType.Air, F(new Geometry.Spatial.Point3D(5, 0, 0), new Geometry.Spatial.Point3D(5, 4, 0), new Geometry.Spatial.Point3D(5, 4, 3), new Geometry.Spatial.Point3D(5, 0, 3))); + + Assert.That(airPanel.Adiabatic(), Is.False, "Air panels are never adiabatic, even without a construction"); + Assert.That(airPanel.OutsideBoundaryCondition(), Is.EqualTo("Surface"), "An Air panel stays an internal (paired) boundary"); + } + + [Test] + public void AdiabaticFloors_ConvertToAdiabaticSurfaces() + { + AnalyticalModel analyticalModel = AnalyticalModelFixtures.TwoAdjacentBoxes(); + AdjacencyCluster adjacencyCluster = analyticalModel.AdjacencyCluster; + foreach (Panel panel in adjacencyCluster.GetPanels()) + { + if (panel.PanelType != PanelType.SlabOnGrade) + { + continue; + } + + panel.SetValue(PanelParameter.Adiabatic, true); + adjacencyCluster.AddObject(panel); + } + + OpenStudioConversionResult result = new AnalyticalModel(analyticalModel, adjacencyCluster).ToOpenStudio(); + Assert.That(result.IsValid, Is.True, "Conversion must be valid (warnings allowed)"); + + List surfaces = Surfaces(result.Model); + Assert.That(surfaces.Count(s => s.outsideBoundaryCondition() == "Ground"), Is.EqualTo(0), "No surface may stay ground-coupled once its panel is flagged adiabatic"); + + List adiabaticSurfaces = surfaces.FindAll(s => s.outsideBoundaryCondition() == "Adiabatic"); + Assert.That(adiabaticSurfaces.Count, Is.EqualTo(2), "Both flagged floors convert to Adiabatic surfaces"); + foreach (global::OpenStudio.Surface surface in adiabaticSurfaces) + { + Assert.That(surface.surfaceType(), Is.EqualTo("Floor"), "The surface type is unaffected by the boundary condition"); + Assert.That(surface.sunExposure(), Is.EqualTo("NoSun")); + Assert.That(surface.windExposure(), Is.EqualTo("NoWind")); + } + + Assert.That(surfaces.Count(s => s.outsideBoundaryCondition() == "Outdoors"), Is.EqualTo(8), "Roofs and external walls are untouched"); + Assert.That(surfaces.Count(s => s.outsideBoundaryCondition() == "Surface"), Is.EqualTo(2), "The shared internal wall is untouched"); + } + + [Test] + public void AdiabaticInternalPanel_DropsThePairing_BothSidesAdiabatic() + { + // The flag changes more than the boundary string on an internal panel: "Adiabatic" + // no longer takes the "Surface" branch, so the two engine surfaces are deliberately + // NOT paired with setAdjacentSurface. That is the correct EnergyPlus model of an + // adiabatic partition — no heat crosses it — and it must stay a clean conversion. + AnalyticalModel analyticalModel = AnalyticalModelFixtures.TwoAdjacentBoxes(); + AdjacencyCluster adjacencyCluster = analyticalModel.AdjacencyCluster; + Panel sharedWall = adjacencyCluster.GetPanels().Single(x => x.PanelType == PanelType.WallInternal); + sharedWall.SetValue(PanelParameter.Adiabatic, true); + adjacencyCluster.AddObject(sharedWall); + + OpenStudioConversionResult result = new AnalyticalModel(analyticalModel, adjacencyCluster).ToOpenStudio(); + Assert.That(result.IsValid, Is.True, "Conversion must be valid (warnings allowed)"); + + List surfaces = Surfaces(result.Model); + List adiabaticSurfaces = surfaces.FindAll(s => s.outsideBoundaryCondition() == "Adiabatic"); + Assert.That(adiabaticSurfaces.Count, Is.EqualTo(2), "Both sides of the flagged partition are adiabatic"); + Assert.That(surfaces.Count(s => s.outsideBoundaryCondition() == "Surface"), Is.EqualTo(0), "No surface stays paired once the partition is adiabatic"); + + foreach (global::OpenStudio.Surface surface in adiabaticSurfaces) + { + global::OpenStudio.OptionalSurface adjacent = surface.adjacentSurface(); + Assert.That(adjacent == null || adjacent.isNull(), Is.True, string.Format("{0} must not keep an adjacent surface", surface.nameString())); + } + + // Skipping the pairing is intentional, not a failure to pair — the "single space" and + // "OpenStudio rejected the pairing" warnings belong to the Surface branch only. + Assert.That(result.Diagnostics.Any(d => d.Message.Contains("bounds a single space") || d.Message.Contains("rejected the adjacent-surface pairing")), Is.False, "An adiabatic partition is not a pairing failure: " + string.Join(" | ", result.Diagnostics.Select(d => d.Message))); + } + + [Test] + public void AirPanel_ConvertsToSharedAirBoundaryConstruction() + { + OpenStudioConversionResult result = AnalyticalModelFixtures.TwoAdjacentBoxes(sharedWallIsAir: true).ToOpenStudio(); + + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in result.Diagnostics) + { + TestContext.Out.WriteLine(diagnostic.ToString()); + } + + Assert.That(result.IsValid, Is.True, "Conversion must be valid (warnings allowed)"); + + List internalSurfaces = Surfaces(result.Model).FindAll(s => s.outsideBoundaryCondition() == "Surface"); + Assert.That(internalSurfaces.Count, Is.EqualTo(2), "Both sides of the Air panel remain an explicitly paired internal boundary"); + + foreach (global::OpenStudio.Surface surface in internalSurfaces) + { + global::OpenStudio.OptionalConstructionBase constructionBase = surface.construction(); + Assert.That(constructionBase != null && !constructionBase.isNull(), string.Format("Surface {0} must carry the air-boundary construction", surface.nameString())); + Assert.That(constructionBase.get().nameString(), Is.EqualTo("SAM_Construction_AirBoundary")); + } + + global::OpenStudio.OptionalSurface adjacent = internalSurfaces[0].adjacentSurface(); + Assert.That(adjacent != null && !adjacent.isNull(), "The Air panel sides must stay paired"); + Assert.That(adjacent.get().nameString(), Is.EqualTo(internalSurfaces[1].nameString())); + } + + [Test] + public void ProductionModel_AdiabaticSlabsAndAirPartition_Convert() + { + // The real Rhino model both features came from: two cells joined by an Air partition, + // both ground slabs flagged adiabatic. Synthetic fixtures can drift from what the + // Grasshopper definition actually produces; this one cannot. + OpenStudioConversionResult result = AdiabaticAirPanelModel().ToOpenStudio(); + Assert.That(result.IsValid, Is.True, "Conversion must be valid: " + string.Join(" | ", result.Diagnostics.Where(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error).Select(d => d.Message))); + + List surfaces = Surfaces(result.Model); + Assert.That(result.Model.getThermalZones().Count, Is.EqualTo(2), "Cell 1 and Cell 2"); + + // Both flagged slabs are adiabatic, and nothing is left ground-coupled. + Assert.That(surfaces.Count(s => s.outsideBoundaryCondition() == "Adiabatic"), Is.EqualTo(2), "Both Adiabatic-flagged slabs: " + string.Join(", ", surfaces.Select(s => s.surfaceType() + "=" + s.outsideBoundaryCondition()))); + Assert.That(surfaces.Count(s => s.outsideBoundaryCondition() == "Ground"), Is.EqualTo(0), "No slab stays ground-coupled"); + foreach (global::OpenStudio.Surface surface in surfaces.FindAll(s => s.outsideBoundaryCondition() == "Adiabatic")) + { + Assert.That(surface.surfaceType(), Is.EqualTo("Floor")); + } + + // The Air partition pairs and carries the air-boundary construction on both sides. + List pairedSurfaces = surfaces.FindAll(s => s.outsideBoundaryCondition() == "Surface"); + Assert.That(pairedSurfaces.Count, Is.EqualTo(2), "The Air partition is one panel seen from both cells"); + foreach (global::OpenStudio.Surface surface in pairedSurfaces) + { + Assert.That(surface.construction().get().nameString(), Is.EqualTo("SAM_Construction_AirBoundary")); + } + + Assert.That(result.Model.getSubSurfaces().Count, Is.EqualTo(10), "The model's windows still convert"); + } + + [Test] + public void AirBoundary_AirExchangeMethod_DefaultsToNone_AndIsDiagnosed() + { + OpenStudioConversionResult result = AdiabaticAirPanelModel().ToOpenStudio(); + + global::OpenStudio.ConstructionAirBoundary constructionAirBoundary = AirBoundary(result.Model); + Assert.That(constructionAirBoundary, Is.Not.Null); + Assert.That(constructionAirBoundary.airExchangeMethod(), Is.EqualTo("None"), "Without an explicit rate no air moves between the zones — SAM carries no airflow data"); + Assert.That(result.Diagnostics.Any(d => d.Message.Contains("Air Exchange Method 'None'") && d.Message.Contains("exchange no air")), Is.True, "The uncoupled boundary is a named modelling decision, not silence: " + string.Join(" | ", result.Diagnostics.Select(d => d.Message))); + } + + [Test] + public void AirBoundary_AirChangesPerHour_EnablesSimpleMixing() + { + Core.OpenStudio.OpenStudioConversionOptions options = new Core.OpenStudio.OpenStudioConversionOptions { AirBoundaryAirChangesPerHour = 0.5 }; + OpenStudioConversionResult result = AdiabaticAirPanelModel().ToOpenStudio(options); + + global::OpenStudio.ConstructionAirBoundary constructionAirBoundary = AirBoundary(result.Model); + Assert.That(constructionAirBoundary, Is.Not.Null); + Assert.That(constructionAirBoundary.airExchangeMethod(), Is.EqualTo("SimpleMixing")); + Assert.That(constructionAirBoundary.simpleMixingAirChangesPerHour(), Is.EqualTo(0.5).Within(1e-9)); + Assert.That(result.Diagnostics.Any(d => d.Message.Contains("SimpleMixing") && d.Message.Contains("0.5") && d.Message.Contains("caller-supplied assumption")), Is.True, "The assumed rate is named: " + string.Join(" | ", result.Diagnostics.Select(d => d.Message))); + + // The surfaces still pair — mixing is a property of the construction, not the boundary. + Assert.That(Surfaces(result.Model).Count(s => s.outsideBoundaryCondition() == "Surface"), Is.EqualTo(2)); + } + + [Test] + public void AirBoundary_ZeroAirChangesPerHour_IsAnExplicitChoice_NotOff() + { + // 0 is a valid rate the caller asked for (mixing modelled, schedule always on, no + // flow) and must not be silently reinterpreted as "no option supplied". + Core.OpenStudio.OpenStudioConversionOptions options = new Core.OpenStudio.OpenStudioConversionOptions { AirBoundaryAirChangesPerHour = 0 }; + OpenStudioConversionResult result = AdiabaticAirPanelModel().ToOpenStudio(options); + + global::OpenStudio.ConstructionAirBoundary constructionAirBoundary = AirBoundary(result.Model); + Assert.That(constructionAirBoundary.airExchangeMethod(), Is.EqualTo("SimpleMixing")); + Assert.That(constructionAirBoundary.simpleMixingAirChangesPerHour(), Is.EqualTo(0.0).Within(1e-9)); + } + + [Test] + [Category("Simulation")] + public void AirBoundary_SimpleMixing_ReachesEnergyPlus() + { + // Setting the option is only half the claim — EnergyPlus has to accept it. This runs + // the real model through the CLI and reads the generated IDF back. + Core.OpenStudio.OpenStudioConversionOptions options = new Core.OpenStudio.OpenStudioConversionOptions { AirBoundaryAirChangesPerHour = 0.5 }; + string outputDirectory = Path.Combine(TestContext.CurrentContext.WorkDirectory, "c1_airmixing_" + System.Guid.NewGuid().ToString("N").Substring(0, 8)); + + OpenStudioConversionResult result = AdiabaticAirPanelModel().ToOpenStudio(null, outputDirectory, options); + + Assert.That(result.RunResult?.Success, Is.True, "EnergyPlus must accept the mixing air boundary: " + string.Join(" | ", result.Diagnostics.Where(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error).Select(d => d.Message))); + Assert.That(result.RunResult.SevereErrors, Is.Empty, "No severe errors: " + string.Join(" | ", result.RunResult.SevereErrors)); + + string idfPath = Directory.GetFiles(outputDirectory, "in.idf", SearchOption.AllDirectories).FirstOrDefault(); + Assert.That(idfPath, Is.Not.Null, "The run produced an IDF"); + + string idf = File.ReadAllText(idfPath); + int index = idf.IndexOf("Construction:AirBoundary", System.StringComparison.Ordinal); + Assert.That(index, Is.GreaterThanOrEqualTo(0), "The IDF carries the air boundary"); + + string block = idf.Substring(index, System.Math.Min(400, idf.Length - index)); + Assert.That(block, Does.Contain("SimpleMixing"), "The air exchange method reaches EnergyPlus: " + block); + Assert.That(block, Does.Contain("0.5"), "The air change rate reaches EnergyPlus: " + block); + } + + [Test] + public void AirBoundary_InvalidAirChangesPerHour_KeepsNone_WithWarning() + { + Core.OpenStudio.OpenStudioConversionOptions options = new Core.OpenStudio.OpenStudioConversionOptions { AirBoundaryAirChangesPerHour = -1 }; + OpenStudioConversionResult result = AdiabaticAirPanelModel().ToOpenStudio(options); + + global::OpenStudio.ConstructionAirBoundary constructionAirBoundary = AirBoundary(result.Model); + Assert.That(constructionAirBoundary.airExchangeMethod(), Is.EqualTo("None"), "A negative rate is rejected, never clamped"); + Assert.That(result.Diagnostics.Any(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning && d.Message.Contains("not a valid rate")), Is.True, "The rejected value is reported: " + string.Join(" | ", result.Diagnostics.Select(d => d.Message))); + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/C2/InternalConditionCompletenessTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/C2/InternalConditionCompletenessTests.cs new file mode 100644 index 0000000..6b3daa3 --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/C2/InternalConditionCompletenessTests.cs @@ -0,0 +1,277 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using System.IO; +using System.Linq; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// C2: internal conditions, schedules and conditioning modes — dedicated latent equipment + /// instances, native ACH infiltration, SpaceType outdoor air with ventilation schedule, + /// single-mode thermostats, ZoneControlHumidistat with Percent schedules and Ideal Loads + /// humidity-control wiring, pollutant/ventilation-function diagnostics, and an end-to-end + /// EnergyPlus gate exercising latent gains + humidistat. + /// + [TestFixture] + public class InternalConditionCompletenessTests + { + private static string WeatherPath(string extension) + { + return Path.GetFullPath(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "..", "..", "..", "resources", "weather", "USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2004-2018" + extension)); + } + + private static double[] Constant(double value) + { + double[] result = new double[24]; + for (int i = 0; i < result.Length; i++) + { + result[i] = value; + } + + return result; + } + + private static ProfileLibrary ExtendedProfileLibrary() + { + ProfileLibrary result = AnalyticalModelFixtures.CreateProfileLibrary(); + result.Add(new Profile("Office Equipment Latent", ProfileType.EquipmentLatent, Constant(0.5))); + result.Add(new Profile("Office Humidification", ProfileType.Humidification, Constant(40))); + result.Add(new Profile("Office Dehumidification", ProfileType.Dehumidification, Constant(60))); + result.Add(new Profile("Office Ventilation", ProfileType.Ventilation, Constant(1))); + return result; + } + + private static InternalCondition OfficeWithExtras() + { + InternalCondition result = AnalyticalModelFixtures.CreateOfficeInternalCondition(); + result.SetValue(InternalConditionParameter.EquipmentLatentGainPerArea, 5.0); + result.SetValue(InternalConditionParameter.EquipmentLatentProfileName, "Office Equipment Latent"); + return result; + } + + [Test] + public void LatentEquipment_CreatesDedicatedLatentInstance() + { + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox(internalConditionOverride: OfficeWithExtras(), profileLibraryOverride: ExtendedProfileLibrary()).ToOpenStudio(); + + Assert.That(result.IsValid, Is.True); + Assert.That(result.Model.getElectricEquipmentDefinitions().Count, Is.EqualTo(2), "Sensible + dedicated latent equipment instances"); + + global::OpenStudio.ElectricEquipmentDefinition latent = result.Model.getElectricEquipmentDefinitions().Single(x => x.nameString().Contains("Latent")); + Assert.That(latent.fractionLatent(), Is.EqualTo(1.0).Within(1e-9)); + Assert.That(latent.fractionRadiant(), Is.EqualTo(0.0).Within(1e-9), "Fractions must sum to 1 — a fully latent instance carries no radiant part"); + Assert.That(latent.wattsperSpaceFloorArea().get(), Is.EqualTo(5.0).Within(1e-9)); + + global::OpenStudio.ElectricEquipmentDefinition sensible = result.Model.getElectricEquipmentDefinitions().Single(x => !x.nameString().Contains("Latent")); + Assert.That(sensible.fractionLatent(), Is.EqualTo(0.0).Within(1e-9)); + + Assert.That(result.Model.getElectricEquipments().Count, Is.EqualTo(2)); + string sensibleScheduleName = result.Model.getElectricEquipments().Single(x => !x.nameString().Contains("Latent")).schedule().get().nameString(); + string latentScheduleName = result.Model.getElectricEquipments().Single(x => x.nameString().Contains("Latent")).schedule().get().nameString(); + Assert.That(latentScheduleName, Is.Not.EqualTo(sensibleScheduleName), "Asymmetric sensible/latent profiles keep independent schedules"); + } + + [Test] + public void Thermostat_HeatingOnly_CreatesSingleModeThermostat() + { + InternalCondition internalCondition = AnalyticalModelFixtures.CreateOfficeInternalCondition(); + InternalCondition heatingOnly = new InternalCondition("Office Heating Only"); + heatingOnly.SetValue(InternalConditionParameter.HeatingProfileName, "Office Heating"); + + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox(internalConditionOverride: heatingOnly).ToOpenStudio(); + + Assert.That(result.IsValid, Is.True); + Assert.That(result.Model.getThermostatSetpointDualSetpoints().Count, Is.EqualTo(1)); + + global::OpenStudio.ThermostatSetpointDualSetpoint thermostat = result.Model.getThermostatSetpointDualSetpoints()[0]; + Assert.That(thermostat.heatingSetpointTemperatureSchedule().isNull(), Is.False, "Heating schedule must be set"); + Assert.That(thermostat.coolingSetpointTemperatureSchedule().isNull(), Is.True, "Cooling schedule must stay empty — no invented setpoints"); + Assert.That(result.Model.getZoneHVACIdealLoadsAirSystems().Count, Is.EqualTo(1)); + } + + [Test] + public void Thermostat_CoolingOnly_CreatesSingleModeThermostat() + { + InternalCondition coolingOnly = new InternalCondition("Office Cooling Only"); + coolingOnly.SetValue(InternalConditionParameter.CoolingProfileName, "Office Cooling"); + + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox(internalConditionOverride: coolingOnly).ToOpenStudio(); + + Assert.That(result.IsValid, Is.True); + global::OpenStudio.ThermostatSetpointDualSetpoint thermostat = result.Model.getThermostatSetpointDualSetpoints()[0]; + Assert.That(thermostat.coolingSetpointTemperatureSchedule().isNull(), Is.False); + Assert.That(thermostat.heatingSetpointTemperatureSchedule().isNull(), Is.True); + } + + [Test] + public void Thermostat_MissingBothSetpoints_RaisesError() + { + InternalCondition bare = new InternalCondition("Office Bare"); + + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox(internalConditionOverride: bare).ToOpenStudio(); + + Assert.That(result.IsValid, Is.False); + Assert.That(result.Diagnostics.Any(d => d.Code == "SAM-OS-HVAC-001" && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error), Is.True); + Assert.That(result.Model.getThermostatSetpointDualSetpoints().Count, Is.EqualTo(0)); + Assert.That(result.Model.getZoneHVACIdealLoadsAirSystems().Count, Is.EqualTo(0)); + } + + [Test] + public void Humidistat_HumidificationOnly_WiresIdealLoads() + { + InternalCondition internalCondition = AnalyticalModelFixtures.CreateOfficeInternalCondition(); + internalCondition.SetValue(InternalConditionParameter.HumidificationProfileName, "Office Humidification"); + + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox(internalConditionOverride: internalCondition, profileLibraryOverride: ExtendedProfileLibrary()).ToOpenStudio(); + + Assert.That(result.IsValid, Is.True); + Assert.That(result.Model.getZoneControlHumidistats().Count, Is.EqualTo(1)); + + global::OpenStudio.ZoneControlHumidistat humidistat = result.Model.getZoneControlHumidistats()[0]; + Assert.That(humidistat.humidifyingRelativeHumiditySetpointSchedule().isNull(), Is.False); + Assert.That(humidistat.dehumidifyingRelativeHumiditySetpointSchedule().isNull(), Is.True); + + global::OpenStudio.ZoneHVACIdealLoadsAirSystem idealLoads = result.Model.getZoneHVACIdealLoadsAirSystems()[0]; + Assert.That(idealLoads.humidificationControlType(), Is.EqualTo("Humidistat")); + Assert.That(idealLoads.dehumidificationControlType(), Is.Not.EqualTo("Humidistat"), "Dehumidification stays at the documented EnergyPlus default without a dehumidification profile"); + + global::OpenStudio.Schedule schedule = humidistat.humidifyingRelativeHumiditySetpointSchedule().get(); + global::OpenStudio.OptionalScheduleTypeLimits limits = schedule.scheduleTypeLimits(); + Assert.That(limits.isNull(), Is.False); + Assert.That(limits.get().upperLimitValue().get(), Is.EqualTo(100).Within(1e-9), "Percent type limits"); + } + + [Test] + public void Humidistat_DehumidificationOnly_WiresIdealLoads() + { + InternalCondition internalCondition = AnalyticalModelFixtures.CreateOfficeInternalCondition(); + internalCondition.SetValue(InternalConditionParameter.DehumidificationProfileName, "Office Dehumidification"); + + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox(internalConditionOverride: internalCondition, profileLibraryOverride: ExtendedProfileLibrary()).ToOpenStudio(); + + Assert.That(result.IsValid, Is.True); + + global::OpenStudio.ZoneControlHumidistat humidistat = result.Model.getZoneControlHumidistats()[0]; + Assert.That(humidistat.dehumidifyingRelativeHumiditySetpointSchedule().isNull(), Is.False); + Assert.That(humidistat.humidifyingRelativeHumiditySetpointSchedule().isNull(), Is.True); + + global::OpenStudio.ZoneHVACIdealLoadsAirSystem idealLoads = result.Model.getZoneHVACIdealLoadsAirSystems()[0]; + Assert.That(idealLoads.dehumidificationControlType(), Is.EqualTo("Humidistat")); + Assert.That(idealLoads.humidificationControlType(), Is.EqualTo("None"), "Humidification stays off without a humidification profile"); + } + + [Test] + public void Humidistat_NamedButUnresolvedProfile_RaisesError() + { + InternalCondition internalCondition = AnalyticalModelFixtures.CreateOfficeInternalCondition(); + internalCondition.SetValue(InternalConditionParameter.HumidificationProfileName, "Missing Humidification Profile"); + + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox(internalConditionOverride: internalCondition, profileLibraryOverride: ExtendedProfileLibrary()).ToOpenStudio(); + + Assert.That(result.IsValid, Is.False); + Assert.That(result.Diagnostics.Any(d => d.Code == "SAM-OS-SCH-001" && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error && d.Message.Contains("Missing Humidification Profile")), Is.True); + Assert.That(result.Model.getZoneControlHumidistats().Count, Is.EqualTo(0)); + } + + [Test] + public void Ventilation_CreatesSpaceTypeOutdoorAir_WithSchedule() + { + InternalCondition internalCondition = AnalyticalModelFixtures.CreateOfficeInternalCondition(); + internalCondition.SetValue(InternalConditionParameter.SupplyAirFlowPerArea, 0.001); + internalCondition.SetValue(InternalConditionParameter.SupplyAirFlowPerPerson, 0.005); + internalCondition.SetValue(InternalConditionParameter.VentilationProfileName, "Office Ventilation"); + + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox(internalConditionOverride: internalCondition, profileLibraryOverride: ExtendedProfileLibrary()).ToOpenStudio(); + + Assert.That(result.IsValid, Is.True); + Assert.That(result.Model.getDesignSpecificationOutdoorAirs().Count, Is.EqualTo(2), "SpaceType DSOA plus the per-space override (SpaceParameter.OutsideSupplyAirFlow)"); + + global::OpenStudio.DesignSpecificationOutdoorAir spaceTypeOutdoorAir = result.Model.getDesignSpecificationOutdoorAirs().Single(x => x.nameString().Contains("InternalCondition")); + Assert.That(spaceTypeOutdoorAir.outdoorAirMethod(), Is.EqualTo("Sum")); + Assert.That(spaceTypeOutdoorAir.outdoorAirFlowperFloorArea(), Is.EqualTo(0.001).Within(1e-9)); + Assert.That(spaceTypeOutdoorAir.outdoorAirFlowperPerson(), Is.EqualTo(0.005).Within(1e-9)); + Assert.That(spaceTypeOutdoorAir.outdoorAirFlowRateFractionSchedule().isNull(), Is.False, "Ventilation profile mapped to the outdoor-air schedule"); + } + + [Test] + public void Pollutant_RaisesUnsupportedDiagnostic() + { + InternalCondition internalCondition = AnalyticalModelFixtures.CreateOfficeInternalCondition(); + internalCondition.SetValue(InternalConditionParameter.PollutantGenerationPerArea, 0.5); + + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox(internalConditionOverride: internalCondition).ToOpenStudio(); + + Assert.That(result.Diagnostics.Any(d => d.Code == "SAM-OS-IC-001" && d.Message.Contains("Pollutant")), Is.True, "Pollutant data must be reported, never silently dropped"); + Assert.That(result.Statistics.UnsupportedObjects, Is.GreaterThan(0)); + } + + [Test] + public void RadiantProportions_ComeFromSamParameters() + { + InternalCondition internalCondition = AnalyticalModelFixtures.CreateOfficeInternalCondition(); + internalCondition.SetValue(InternalConditionParameter.OccupancyRadiantProportion, 0.5); + internalCondition.SetValue(InternalConditionParameter.LightingRadiantProportion, 0.2); + internalCondition.SetValue(InternalConditionParameter.EquipmentRadiantProportion, 0.1); + + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox(internalConditionOverride: internalCondition).ToOpenStudio(); + + Assert.That(result.Model.getPeopleDefinitions()[0].fractionRadiant(), Is.EqualTo(0.5).Within(1e-9)); + Assert.That(result.Model.getLightsDefinitions()[0].fractionRadiant(), Is.EqualTo(0.2).Within(1e-9)); + Assert.That(result.Model.getElectricEquipmentDefinitions()[0].fractionRadiant(), Is.EqualTo(0.1).Within(1e-9)); + } + + [Test] + [Category("Simulation")] + public void LatentAndHumidistat_EndToEnd_EnergyPlusRun() + { + string epwPath = WeatherPath(".epw"); + Assert.That(File.Exists(epwPath), Is.True, $"Pinned weather fixture missing: {epwPath}"); + + string outputDirectory = Path.Combine(TestContext.CurrentContext.WorkDirectory, "c2_latent_humidistat"); + if (Directory.Exists(outputDirectory)) + { + Directory.Delete(outputDirectory, true); + } + + InternalCondition internalCondition = OfficeWithExtras(); + internalCondition.SetValue(InternalConditionParameter.HumidificationProfileName, "Office Humidification"); + internalCondition.SetValue(InternalConditionParameter.DehumidificationProfileName, "Office Dehumidification"); + + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox(internalConditionOverride: internalCondition, profileLibraryOverride: ExtendedProfileLibrary()).ToOpenStudio(epwPath, outputDirectory); + + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in result.Diagnostics) + { + TestContext.Out.WriteLine(diagnostic.ToString()); + } + + Assert.That(result.IsValid, Is.True); + Assert.That(result.RunResult, Is.Not.Null); + Assert.That(result.RunResult.ExitCode, Is.EqualTo(0)); + Assert.That(result.RunResult.FatalErrors, Is.Empty); + Assert.That(result.RunResult.SevereErrors, Is.Empty); + Assert.That(result.RunResult.Success, Is.True); + Assert.That(result.Loads, Is.Not.Null); + Assert.That(result.Loads.TotalHeating + result.Loads.TotalCooling, Is.GreaterThan(0)); + + using (System.Data.SQLite.SQLiteConnection connection = new System.Data.SQLite.SQLiteConnection("Data Source=" + result.RunResult.SqlPath + ";Read Only=True")) + { + connection.Open(); + using (System.Data.SQLite.SQLiteCommand command = connection.CreateCommand()) + { + command.CommandText = "SELECT MIN(rd.Value), MAX(rd.Value) FROM ReportData rd JOIN ReportDataDictionary rdd ON rd.ReportDataDictionaryIndex = rdd.ReportDataDictionaryIndex WHERE rdd.Name = 'Zone Air Relative Humidity'"; + using (System.Data.SQLite.SQLiteDataReader reader = command.ExecuteReader()) + { + Assert.That(reader.Read(), Is.True, "Zone Air Relative Humidity output must be present"); + double min = reader.GetDouble(0); + double max = reader.GetDouble(1); + TestContext.Out.WriteLine($"Zone Air Relative Humidity range: {min:0.0}–{max:0.0} %"); + Assert.That(min, Is.GreaterThanOrEqualTo(0).And.LessThan(100)); + Assert.That(max, Is.GreaterThan(0).And.LessThanOrEqualTo(100), "Humidity output must be a sane percentage"); + } + } + } + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/C3/FenestrationTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/C3/FenestrationTests.cs new file mode 100644 index 0000000..9cdf6cf --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/C3/FenestrationTests.cs @@ -0,0 +1,392 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using SAM.Core; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using AnalyticalCreate = SAM.Analytical.Create; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// C3: fenestration, frames and constructions — WindowPropertyFrameAndDivider with pane + /// geometry, frameless fallback on invalid frame data, composite-frame conductance, opaque + /// vs glazed doors, internal glazed openings, hole diagnostics with Guid + geometry summary, + /// unsupported-data diagnostics (shades, blinds, TAS heat-transfer percentages) and an + /// end-to-end EnergyPlus gate for a window with frame. + /// + [TestFixture] + public class FenestrationTests + { + private static string WeatherPath(string extension) + { + return Path.GetFullPath(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "..", "..", "..", "resources", "weather", "USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2004-2018" + extension)); + } + + [Test] + public void Frame_WindowWithFrameData_CreatesFrameAndDivider_OnPaneGeometry() + { + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox(apertureConstructionOverride: AnalyticalModelFixtures.CreateFramedWindowConstruction(), includeFrameMaterial: true).ToOpenStudio(); + + Assert.That(result.IsValid, Is.True); + Assert.That(result.Model.getWindowPropertyFrameAndDividers().Count, Is.EqualTo(1)); + + global::OpenStudio.WindowPropertyFrameAndDivider frameAndDivider = result.Model.getWindowPropertyFrameAndDividers()[0]; + Assert.That(frameAndDivider.frameWidth(), Is.EqualTo(0.05).Within(1e-9)); + Assert.That(frameAndDivider.frameConductance(), Is.EqualTo(0.17 / 0.05).Within(1e-9), "U = λ/t of the single PVC frame layer"); + Assert.That(frameAndDivider.frameSolarAbsorptance(), Is.EqualTo(0.6).Within(1e-9), "1 − ExternalSolarReflectance 0.4"); + Assert.That(frameAndDivider.frameVisibleAbsorptance(), Is.EqualTo(0.6).Within(1e-9)); + + global::OpenStudio.SubSurface subSurface = result.Model.getSubSurfaces()[0]; + Assert.That(subSurface.windowPropertyFrameAndDivider().isNull(), Is.False); + Assert.That(subSurface.grossArea(), Is.EqualTo(1.9 * 1.3).Within(1e-4), "SubSurface polygon is the PANE (frame grows outward per the EnergyPlus convention), not the full 2×1.4 m aperture"); + } + + [Test] + public void Frame_FramelessAperture_KeepsFullPolygon_NoFrameObject() + { + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox().ToOpenStudio(); + + Assert.That(result.Model.getWindowPropertyFrameAndDividers().Count, Is.EqualTo(0)); + Assert.That(result.Model.getSubSurfaces()[0].grossArea(), Is.EqualTo(2.8).Within(1e-6)); + } + + [Test] + public void Frame_InvalidFrameData_FallsBack_WithWarning_NeverWrongGeometry() + { + ApertureConstruction apertureConstruction = AnalyticalModelFixtures.CreateFramedWindowConstruction(frameMaterialName: "Frame Missing"); + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox(apertureConstructionOverride: apertureConstruction, includeFrameMaterial: true).ToOpenStudio(); + + Assert.That(result.Model.getWindowPropertyFrameAndDividers().Count, Is.EqualTo(0), "Missing frame material → frameless fallback"); + Assert.That(result.Model.getSubSurfaces()[0].grossArea(), Is.EqualTo(2.8).Within(1e-6), "Full aperture polygon kept"); + Assert.That(result.Diagnostics.Any(d => d.Code == "SAM-OS-CON-002" && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning && d.Message.Contains("frameless conversion")), Is.True); + } + + [Test] + public void Frame_CompositeFrame_ConductanceFromLayerSum() + { + ApertureConstruction apertureConstruction = new ApertureConstruction(new System.Guid("22222222-4444-4444-4444-444444444444"), "Composite Frame Window", ApertureType.Window, new List + { + new ConstructionLayer("Glass", 0.006), + new ConstructionLayer("Air", 0.012), + new ConstructionLayer("Glass", 0.006), + }, new List + { + new ConstructionLayer("Frame PVC", 0.03), + new ConstructionLayer("Brick", 0.02), + }); + apertureConstruction.SetValue(ApertureConstructionParameter.DefaultFrameWidth, 0.05); + + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox(apertureConstructionOverride: apertureConstruction, includeFrameMaterial: true).ToOpenStudio(); + + Assert.That(result.Model.getWindowPropertyFrameAndDividers().Count, Is.EqualTo(1)); + double expectedConductance = 1.0 / (0.03 / 0.17 + 0.02 / 0.84); + Assert.That(result.Model.getWindowPropertyFrameAndDividers()[0].frameConductance(), Is.EqualTo(expectedConductance).Within(1e-9), "U = 1/Σ(t/λ) over the frame layers"); + } + + [Test] + public void Doors_OpaqueAndGlazed_AreClassifiedByPaneFamily() + { + ApertureConstruction opaqueDoorConstruction = new ApertureConstruction(new System.Guid("22222222-5555-5555-5555-555555555555"), "Opaque Door", ApertureType.Door, new List + { + new ConstructionLayer("Plasterboard", 0.0125), + new ConstructionLayer("Brick", 0.1), + }); + + OpenStudioConversionResult opaqueResult = AnalyticalModelFixtures.SingleBox(apertureConstructionOverride: opaqueDoorConstruction).ToOpenStudio(); + Assert.That(opaqueResult.Model.getSubSurfaces()[0].subSurfaceType(), Is.EqualTo("Door")); + + ApertureConstruction glazedDoorConstruction = new ApertureConstruction(AnalyticalModelFixtures.WindowConstruction, ApertureType.Door); + OpenStudioConversionResult glazedResult = AnalyticalModelFixtures.SingleBox(apertureConstructionOverride: glazedDoorConstruction).ToOpenStudio(); + Assert.That(glazedResult.Model.getSubSurfaces()[0].subSurfaceType(), Is.EqualTo("GlassDoor")); + } + + [Test] + public void InternalGlazedOpening_IsPairedBetweenAdjacentSpaces() + { + OpenStudioConversionResult result = AnalyticalModelFixtures.TwoAdjacentBoxes(sharedWallWindow: true).ToOpenStudio(); + + Assert.That(result.IsValid, Is.True); + Assert.That(result.Model.getSubSurfaces().Count, Is.EqualTo(3), "Exterior window (1 side) + internal window (2 sides)"); + + List internalSubSurfaces = result.Model.getSubSurfaces().Where(x => x.adjacentSubSurface().isNull() == false).ToList(); + Assert.That(internalSubSurfaces.Count, Is.EqualTo(2), "The internal aperture produces a paired subsurface on each side"); + Assert.That(internalSubSurfaces[0].construction().isNull(), Is.False, "Paired internal glazing carries a construction"); + Assert.That(internalSubSurfaces[1].construction().isNull(), Is.False); + } + + [Test] + public void Holes_AreReported_WithGuidAndGeometrySummary_NeverFabricated() + { + AdjacencyCluster adjacencyCluster = new AdjacencyCluster(); + + Space space = new Space(new System.Guid("77777777-0000-0000-0000-000000000077"), "Space Hole", new Geometry.Spatial.Point3D(2.5, 2, 1.5)); + space.SetValue(SpaceParameter.Area, 20.0); + space.SetValue(SpaceParameter.Volume, 60.0); + space.InternalCondition = AnalyticalModelFixtures.CreateOfficeInternalCondition(); + adjacencyCluster.AddObject(space); + + Geometry.Planar.Polygon2D outer2D = new Geometry.Planar.Polygon2D(new List + { + new Geometry.Planar.Point2D(0, 0), new Geometry.Planar.Point2D(5, 0), new Geometry.Planar.Point2D(5, 4), new Geometry.Planar.Point2D(0, 4), + }); + Geometry.Planar.Polygon2D hole2D = new Geometry.Planar.Polygon2D(new List + { + new Geometry.Planar.Point2D(2, 1), new Geometry.Planar.Point2D(3, 1), new Geometry.Planar.Point2D(3, 2), new Geometry.Planar.Point2D(2, 2), + }); + Geometry.Spatial.Face3D floorWithHole = Geometry.Spatial.Face3D.Create(new Geometry.Spatial.Plane(new Geometry.Spatial.Point3D(0, 0, 0), Geometry.Spatial.Vector3D.WorldZ), outer2D, new List { hole2D }); + + Geometry.Spatial.Point3D P(double x, double y, double z) => new Geometry.Spatial.Point3D(x, y, z); + Geometry.Spatial.Face3D F(params Geometry.Spatial.Point3D[] point3Ds) => new Geometry.Spatial.Face3D(new Geometry.Spatial.Polygon3D(point3Ds)); + + Panel holedFloor = AnalyticalCreate.Panel(AnalyticalModelFixtures.WallConstruction, PanelType.SlabOnGrade, floorWithHole); + List panels = new List + { + holedFloor, + AnalyticalCreate.Panel(AnalyticalModelFixtures.WallConstruction, PanelType.Roof, F(P(0, 0, 3), P(5, 0, 3), P(5, 4, 3), P(0, 4, 3))), + AnalyticalCreate.Panel(AnalyticalModelFixtures.WallConstruction, PanelType.WallExternal, F(P(0, 0, 0), P(5, 0, 0), P(5, 0, 3), P(0, 0, 3))), + AnalyticalCreate.Panel(AnalyticalModelFixtures.WallConstruction, PanelType.WallExternal, F(P(0, 0, 0), P(0, 4, 0), P(0, 4, 3), P(0, 0, 3))), + AnalyticalCreate.Panel(AnalyticalModelFixtures.WallConstruction, PanelType.WallExternal, F(P(0, 4, 0), P(5, 4, 0), P(5, 4, 3), P(0, 4, 3))), + AnalyticalCreate.Panel(AnalyticalModelFixtures.WallConstruction, PanelType.WallExternal, F(P(5, 0, 0), P(5, 4, 0), P(5, 4, 3), P(5, 0, 3))), + }; + + foreach (Panel panel in panels) + { + adjacencyCluster.AddObject(panel); + adjacencyCluster.AddRelation(space, panel); + } + + AnalyticalModel analyticalModel = new AnalyticalModel("Holed Floor Model", "C3 hole diagnostic fixture", null, null, adjacencyCluster, AnalyticalModelFixtures.CreateMaterialLibrary(), AnalyticalModelFixtures.CreateProfileLibrary()); + OpenStudioConversionResult result = analyticalModel.ToOpenStudio(); + + Core.OpenStudio.OpenStudioDiagnostic diagnostic = result.Diagnostics.FirstOrDefault(d => d.Message.Contains("hole")); + Assert.That(diagnostic, Is.Not.Null, "A hole must be reported"); + Assert.That(diagnostic.Severity, Is.EqualTo(Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning)); + Assert.That(diagnostic.SamGuid, Is.EqualTo(holedFloor.Guid), "The diagnostic carries the panel Guid"); + Assert.That(diagnostic.Message, Does.Contain("1 m²"), "The diagnostic carries the hole area summary"); + Assert.That(result.Model.getSubSurfaces().Count, Is.EqualTo(0), "Holes are never fabricated into windows"); + } + + [Test] + public void SimpleGlazingFallback_NoPaneLayers_UsesPerformanceParameters() + { + ApertureConstruction apertureConstruction = new ApertureConstruction(new System.Guid("22222222-8888-8888-8888-888888888888"), "Performance Window", ApertureType.Window); + apertureConstruction.SetValue(ApertureConstructionParameter.ThermalTransmittance, 2.8); + apertureConstruction.SetValue(ApertureConstructionParameter.TotalSolarEnergyTransmittance, 0.6); + apertureConstruction.SetValue(ApertureConstructionParameter.LightTransmittance, 0.7); + + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox(apertureConstructionOverride: apertureConstruction).ToOpenStudio(); + + Assert.That(result.IsValid, Is.True); + Assert.That(result.Model.getSimpleGlazings().Count, Is.EqualTo(1), "No pane layers + complete performance parameters → SimpleGlazingSystem fallback"); + + global::OpenStudio.SimpleGlazing simpleGlazing = result.Model.getSimpleGlazings()[0]; + Assert.That(simpleGlazing.uFactor(), Is.EqualTo(2.8).Within(1e-9)); + Assert.That(simpleGlazing.solarHeatGainCoefficient(), Is.EqualTo(0.6).Within(1e-9)); + Assert.That(simpleGlazing.visibleTransmittance().get(), Is.EqualTo(0.7).Within(1e-9)); + Assert.That(result.Model.getSubSurfaces()[0].construction().isNull(), Is.False); + Assert.That(result.Diagnostics.Any(d => d.Code == "SAM-OS-CON-001" && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Information && d.Message.Contains("SimpleGlazingSystem fallback")), Is.True, "The fallback is never silent"); + } + + [Test] + public void SimpleGlazingFallback_ApertureOverrides_AreNotCacheCollided() + { + // The fallback takes U/SHGC/visible transmittance from the + // Aperture before the shared ApertureConstruction, but the cache key held only the + // construction Guid and direction. Two apertures sharing one construction with + // different aperture-level overrides therefore collided: the second window silently + // reused the first window's SimpleGlazing and simulated the wrong performance. + ApertureConstruction apertureConstruction = new ApertureConstruction(new System.Guid("22222222-7777-7777-7777-777777777777"), "Shared Performance Window", ApertureType.Window); + apertureConstruction.SetValue(ApertureConstructionParameter.ThermalTransmittance, 2.8); + apertureConstruction.SetValue(ApertureConstructionParameter.TotalSolarEnergyTransmittance, 0.6); + apertureConstruction.SetValue(ApertureConstructionParameter.LightTransmittance, 0.7); + + AnalyticalModel analyticalModel = AnalyticalModelFixtures.SingleBox(apertureConstructionOverride: apertureConstruction); + Panel glazedPanel = analyticalModel.AdjacencyCluster.GetPanels().Single(x => x.HasApertures); + glazedPanel.RemoveApertures(); + glazedPanel.AddAperture(OverriddenAperture(apertureConstruction, 1.0, 3.0, 1.2, 0.3, 0.4)); + glazedPanel.AddAperture(OverriddenAperture(apertureConstruction, 3.5, 4.5, 3.4, 0.5, 0.6)); + + OpenStudioConversionResult result = analyticalModel.ToOpenStudio(); + + Assert.That(result.IsValid, Is.True); + Assert.That(result.Model.getSubSurfaces().Count, Is.EqualTo(2), "Both windows converted"); + Assert.That(result.Model.getSimpleGlazings().Count, Is.EqualTo(2), "Each aperture-level performance set gets its own SimpleGlazing — never one shared by Guid alone"); + + // Every window carries ITS OWN performance, matched by area (the wider window is the + // 1.2 W/m²K one), so a collision cannot pass by coincidence. + foreach (global::OpenStudio.SubSurface subSurface in result.Model.getSubSurfaces()) + { + global::OpenStudio.Construction construction = subSurface.construction().get().to_Construction().get(); + global::OpenStudio.SimpleGlazing simpleGlazing = construction.layers()[0].to_SimpleGlazing().get(); + + bool wide = subSurface.grossArea() > 2.0; + Assert.That(simpleGlazing.uFactor(), Is.EqualTo(wide ? 1.2 : 3.4).Within(1e-9), subSurface.nameString()); + Assert.That(simpleGlazing.solarHeatGainCoefficient(), Is.EqualTo(wide ? 0.3 : 0.5).Within(1e-9), subSurface.nameString()); + Assert.That(simpleGlazing.visibleTransmittance().get(), Is.EqualTo(wide ? 0.4 : 0.6).Within(1e-9), subSurface.nameString()); + } + + Assert.That(result.Model.getConstructions().Select(x => x.nameString()).Distinct().Count(), Is.EqualTo(result.Model.getConstructions().Count), "Deterministic naming survives: the two glazing constructions are distinctly named, not auto-renamed by OpenStudio"); + } + + /// South-wall window between x0 and x1 (z 0.8-2.2) carrying aperture-level performance overrides. + private static Aperture OverriddenAperture(ApertureConstruction apertureConstruction, double x0, double x1, double uFactor, double solarHeatGainCoefficient, double visibleTransmittance) + { + Geometry.Spatial.Face3D face3D = new Geometry.Spatial.Face3D(new Geometry.Spatial.Polygon3D(new List + { + new Geometry.Spatial.Point3D(x0, 0, 0.8), + new Geometry.Spatial.Point3D(x1, 0, 0.8), + new Geometry.Spatial.Point3D(x1, 0, 2.2), + new Geometry.Spatial.Point3D(x0, 0, 2.2), + })); + + Aperture result = AnalyticalCreate.Aperture(apertureConstruction, face3D); + result.SetValue(ApertureParameter.ThermalTransmittance, uFactor); + result.SetValue(ApertureParameter.TotalSolarEnergyTransmittance, solarHeatGainCoefficient); + result.SetValue(ApertureParameter.LightTransmittance, visibleTransmittance); + return result; + } + + [Test] + public void SimpleGlazingFallback_IncompleteParameters_RaisesError() + { + ApertureConstruction apertureConstruction = new ApertureConstruction(new System.Guid("22222222-9999-9999-9999-999999999999"), "Incomplete Performance Window", ApertureType.Window); + apertureConstruction.SetValue(ApertureConstructionParameter.ThermalTransmittance, 2.8); + + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox(apertureConstructionOverride: apertureConstruction).ToOpenStudio(); + + Assert.That(result.Model.getSimpleGlazings().Count, Is.EqualTo(0)); + Assert.That(result.Diagnostics.Any(d => d.Code == "SAM-OS-CON-001" && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error && d.Message.Contains("no complete performance parameters")), Is.True, "No hidden defaults"); + } + + [Test] + public void UnsupportedApertureData_RaisesStructuredDiagnostics() + { ApertureConstruction apertureConstruction = new ApertureConstruction(new System.Guid("22222222-6666-6666-6666-666666666666"), AnalyticalModelFixtures.WindowConstruction, "Pane Adjust Window"); + apertureConstruction.SetValue(ApertureConstructionParameter.PaneAdditionalHeatTransfer, 10.0); + + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox(apertureConstructionOverride: apertureConstruction).ToOpenStudio(); + + Assert.That(result.Diagnostics.Any(d => d.Code == "SAM-OS-CON-002" && d.Message.Contains("Pane additional heat transfer")), Is.True); + } + + [Test] + public void BlindMaterial_RaisesDiagnostic_ConvertedAsPlainGlazing() + { + MaterialLibrary materialLibrary = AnalyticalModelFixtures.CreateMaterialLibrary(); + TransparentMaterial blindGlass = new TransparentMaterial(new System.Guid("33333333-0000-0000-0000-000000000008"), "Blind Glass", "Glass", "Fixture blind glass", 1.0, 2500, 840); + blindGlass.SetValue(TransparentMaterialParameter.IsBlind, true); + blindGlass.SetValue(TransparentMaterialParameter.SolarTransmittance, 0.7); + blindGlass.SetValue(TransparentMaterialParameter.LightTransmittance, 0.8); + materialLibrary.Add(blindGlass); + + ApertureConstruction blindConstruction = new ApertureConstruction(new System.Guid("22222222-7777-7777-7777-777777777777"), "Blind Window", ApertureType.Window, new List + { + new ConstructionLayer("Blind Glass", 0.006), + }); + + AdjacencyCluster adjacencyCluster = new AdjacencyCluster(); + Space space = new Space(new System.Guid("77777777-0000-0000-0000-000000000078"), "Space Blind", new Geometry.Spatial.Point3D(2.5, 2, 1.5)); + space.SetValue(SpaceParameter.Area, 20.0); + space.SetValue(SpaceParameter.Volume, 60.0); + space.InternalCondition = AnalyticalModelFixtures.CreateOfficeInternalCondition(); + adjacencyCluster.AddObject(space); + + Geometry.Spatial.Point3D P(double x, double y, double z) => new Geometry.Spatial.Point3D(x, y, z); + Geometry.Spatial.Face3D F(params Geometry.Spatial.Point3D[] point3Ds) => new Geometry.Spatial.Face3D(new Geometry.Spatial.Polygon3D(point3Ds)); + + List panels = new List + { + AnalyticalCreate.Panel(AnalyticalModelFixtures.WallConstruction, PanelType.SlabOnGrade, F(P(0, 0, 0), P(5, 0, 0), P(5, 4, 0), P(0, 4, 0))), + AnalyticalCreate.Panel(AnalyticalModelFixtures.WallConstruction, PanelType.Roof, F(P(0, 0, 3), P(5, 0, 3), P(5, 4, 3), P(0, 4, 3))), + AnalyticalCreate.Panel(AnalyticalModelFixtures.WallConstruction, PanelType.WallExternal, F(P(0, 0, 0), P(5, 0, 0), P(5, 0, 3), P(0, 0, 3))), + AnalyticalCreate.Panel(AnalyticalModelFixtures.WallConstruction, PanelType.WallExternal, F(P(0, 0, 0), P(0, 4, 0), P(0, 4, 3), P(0, 0, 3))), + AnalyticalCreate.Panel(AnalyticalModelFixtures.WallConstruction, PanelType.WallExternal, F(P(0, 4, 0), P(5, 4, 0), P(5, 4, 3), P(0, 4, 3))), + AnalyticalCreate.Panel(AnalyticalModelFixtures.WallConstruction, PanelType.WallExternal, F(P(5, 0, 0), P(5, 4, 0), P(5, 4, 3), P(5, 0, 3))), + }; + + panels[2].AddAperture(AnalyticalCreate.Aperture(blindConstruction, F(P(1, 0, 0.8), P(3, 0, 0.8), P(3, 0, 2.2), P(1, 0, 2.2)))); + + foreach (Panel panel in panels) + { + adjacencyCluster.AddObject(panel); + adjacencyCluster.AddRelation(space, panel); + } + + AnalyticalModel analyticalModel = new AnalyticalModel("Blind Glass Model", "C3 blind diagnostic fixture", null, null, adjacencyCluster, materialLibrary, AnalyticalModelFixtures.CreateProfileLibrary()); + OpenStudioConversionResult result = analyticalModel.ToOpenStudio(); + + Assert.That(result.Diagnostics.Any(d => d.Code == "SAM-OS-MAT-002" && d.Message.Contains("blind")), Is.True, "The blind flag must be reported"); + Assert.That(result.Model.getSubSurfaces().Count, Is.EqualTo(1), "Converted as plain glazing"); + Assert.That(result.Model.objects().Count(x => !x.to_Blind().isNull()), Is.EqualTo(0), "No WindowMaterial:Blind is fabricated"); + } + + [Test] + [Category("Simulation")] + public void FramedWindow_EndToEnd_EnergyPlusRun() + { + string epwPath = WeatherPath(".epw"); + Assert.That(File.Exists(epwPath), Is.True, $"Pinned weather fixture missing: {epwPath}"); + + string outputDirectory = Path.Combine(TestContext.CurrentContext.WorkDirectory, "c3_framed_window"); + if (Directory.Exists(outputDirectory)) + { + Directory.Delete(outputDirectory, true); + } + + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox(apertureConstructionOverride: AnalyticalModelFixtures.CreateFramedWindowConstruction(), includeFrameMaterial: true).ToOpenStudio(epwPath, outputDirectory); + + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in result.Diagnostics) + { + TestContext.Out.WriteLine(diagnostic.ToString()); + } + + Assert.That(result.IsValid, Is.True); + Assert.That(result.RunResult, Is.Not.Null); + Assert.That(result.RunResult.ExitCode, Is.EqualTo(0)); + Assert.That(result.RunResult.FatalErrors, Is.Empty); + Assert.That(result.RunResult.SevereErrors, Is.Empty); + Assert.That(result.RunResult.Success, Is.True); + + string idf = File.ReadAllText(Path.Combine(Path.GetDirectoryName(result.OsmPath), "run", "in.idf")); + Assert.That(idf, Does.Contain("WindowProperty:FrameAndDivider"), "The frame must reach the IDF"); + + using (System.Data.SQLite.SQLiteConnection connection = new System.Data.SQLite.SQLiteConnection("Data Source=" + result.RunResult.SqlPath + ";Read Only=True")) + { + connection.Open(); + using (System.Data.SQLite.SQLiteCommand command = connection.CreateCommand()) + { + // The EnergyPlus glass area is the PANE area (2.47 m²), not the full + // aperture (2.8 m²) — proving the pane+frame conversion (not the frameless + // full-polygon path) reached the simulation; the frame object itself is + // asserted in the IDF above. + command.CommandText = "SELECT SurfaceName, ClassName, Area FROM Surfaces WHERE SurfaceName LIKE '%SUBSURFACE%'"; + using (System.Data.SQLite.SQLiteDataReader reader = command.ExecuteReader()) + { + Assert.That(reader.Read(), Is.True, "The window must appear in the SQL surfaces table"); + TestContext.Out.WriteLine($"Window row: {reader.GetValue(0)} | {reader.GetValue(1)} | {reader.GetValue(2)}"); + Assert.That(reader.GetDouble(2), Is.EqualTo(1.9 * 1.3).Within(0.01), "EnergyPlus glass area must be the pane area"); + } + } + } + + Assert.That(result.Loads, Is.Not.Null); + Assert.That(result.Loads.TotalHeating + result.Loads.TotalCooling, Is.GreaterThan(0)); + } + + [Test] + public void Degenerate_SliverAperture_SkippedWithWarning_NeverReachesEnergyPlus() + { + // Real-model reproduction (HungaryHouse): a 1.6 mm wide door passes the + // converter's own cleaning and minimum-area check, but EnergyPlus collapses it + // under its 0.01 m vertex-proximity rule and reports a severe "degenerate + // surface". The converter must reject it first — EnergyPlus never sees it. + OpenStudioConversionResult result = AnalyticalModelFixtures.SliverApertureBox().ToOpenStudio(); + + Assert.That(result.Model.getSubSurfaces().Count, Is.EqualTo(0), "The sliver door never reaches the OSM"); + Assert.That(result.Diagnostics.Count(d => d.Code == "SAM-OS-GEO-001" && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning && d.Message.Contains("degenerate") && d.Message.Contains("0.01")), Is.EqualTo(1), "One warning naming the EnergyPlus proximity rule"); + Assert.That(result.IsValid, Is.True, "A warning-level skip keeps the conversion valid"); + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/C4/EmbeddedWeatherDesignDaysTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/C4/EmbeddedWeatherDesignDaysTests.cs new file mode 100644 index 0000000..7a1c324 --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/C4/EmbeddedWeatherDesignDaysTests.cs @@ -0,0 +1,401 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using SAM.Core; +using System; +using System.IO; +using System.Linq; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// Embedded weather/design-day sources (human-Rhino validation, fix 1): the AnalyticalModel + /// WeatherData and HeatingDesignDays/CoolingDesignDays feed the conversion when no explicit + /// _epwPath/ddyPath_ exists; explicit paths override the embedded sources (never merged); + /// a run without any usable annual EPW source is a blocking error; conversion-only stays + /// valid with a warning. + /// + [TestFixture] + public class EmbeddedWeatherDesignDaysTests + { + private static string WeatherPath(string extension) + { + return Path.GetFullPath(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "..", "..", "..", "resources", "weather", "USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2004-2018" + extension)); + } + + private static string OutputDirectory(string name) + { + return Path.Combine(TestContext.CurrentContext.WorkDirectory, "c4_embedded", name + "_" + Guid.NewGuid().ToString("N").Substring(0, 8)); + } + + private static AnalyticalModel ModelWithEmbeddedWeather() + { + string epwPath = WeatherPath(".epw"); + Assert.That(File.Exists(epwPath), Is.True, $"Pinned weather fixture missing: {epwPath}"); + + Weather.WeatherData weatherData = Weather.Convert.ToSAM(epwPath); + Assert.That(weatherData, Is.Not.Null); + Assert.That(weatherData.WeatherYears, Is.Not.Null.And.Count.GreaterThan(0), "The pinned EPW must import hourly weather years"); + + DesignDay heatingDesignDay = weatherData.HeatingDesignDay(); + DesignDay coolingDesignDay = weatherData.CoolingDesignDay(); + Assert.That(heatingDesignDay, Is.Not.Null); + Assert.That(coolingDesignDay, Is.Not.Null); + + AnalyticalModel analyticalModel = AnalyticalModelFixtures.SingleBox(); + Analytical.Modify.UpdateWeather(analyticalModel, weatherData, new System.Collections.Generic.List { coolingDesignDay }, new System.Collections.Generic.List { heatingDesignDay }); + return analyticalModel; + } + + [Test] + public void EmbeddedDesignDays_UsedWhenNoDdyPath() + { + AnalyticalModel analyticalModel = ModelWithEmbeddedWeather(); + + OpenStudioConversionResult result = analyticalModel.ToOpenStudio(WeatherPath(".epw"), OutputDirectory("embedded_dd"), run: false); + + System.Collections.Generic.List designDays = result.Model.getDesignDays().ToList(); + Assert.That(designDays.Count, Is.EqualTo(2), "One heating + one cooling embedded design day: " + string.Join(" | ", designDays.Select(x => x.nameString()))); + Assert.That(designDays.Count(x => x.dayType() == "WinterDesignDay"), Is.EqualTo(1), "The embedded heating day becomes a WinterDesignDay"); + Assert.That(designDays.Count(x => x.dayType() == "SummerDesignDay"), Is.EqualTo(1), "The embedded cooling day becomes a SummerDesignDay"); + Assert.That(result.Model.getSimulationControl().runSimulationforSizingPeriods(), Is.True, "Embedded design days enable sizing periods"); + Assert.That(result.Diagnostics.Any(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Information && d.Message.Contains("Design-day source: AnalyticalModel heating/cooling design days")), Is.True, "The embedded source is named"); + Assert.That(result.DesignDaySource, Is.EqualTo(Core.OpenStudio.OpenStudioDesignDaySource.EmbeddedModel), "The established basis is reported structurally (provenance reads this, not the diagnostic text)"); + } + + [Test] + public void EmbeddedDesignDay_ValuesTranslate() + { + AnalyticalModel analyticalModel = ModelWithEmbeddedWeather(); + analyticalModel.TryGetValue(AnalyticalModelParameter.HeatingDesignDays, out SAMCollection heatingDesignDays); + DesignDay heatingDesignDay = heatingDesignDays.First(); + + OpenStudioConversionResult result = analyticalModel.ToOpenStudio(WeatherPath(".epw"), OutputDirectory("embedded_dd_values"), run: false); + + global::OpenStudio.DesignDay designDay = result.Model.getDesignDays().Single(x => x.dayType() == "WinterDesignDay"); + double[] samTemperatures = heatingDesignDay[Weather.WeatherDataType.DryBulbTemperature]; + Assert.That(designDay.maximumDryBulbTemperature(), Is.EqualTo(samTemperatures.Max()).Within(1e-9), "Maximum dry bulb comes from the SAM hourly profile"); + Assert.That(designDay.dailyDryBulbTemperatureRange(), Is.EqualTo(samTemperatures.Max() - samTemperatures.Min()).Within(1e-9), "Daily range is the 24 h spread"); + Assert.That(designDay.month(), Is.EqualTo((int)heatingDesignDay.Month)); + Assert.That(designDay.dayOfMonth(), Is.EqualTo((int)heatingDesignDay.Day)); + Assert.That(result.Diagnostics.Any(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning && d.Message.Contains("approximat")), Is.True, "Every approximation is named in a warning"); + } + + [Test] + public void EmbeddedDesignDay_ImplausiblePressure_RejectedWithDiagnostic() + { + // Some SAM embedded (TRY-derived) design days carry an implausible barometric + // pressure — a London day reported ~31000 Pa at a 25 m site. EnergyPlus rejects + // anything more than 10% off the elevation-based standard and substitutes the + // standard; the converter mirrors that rule and names the rejection instead of + // propagating a value that only triggers a confusing EnergyPlus warning. + AnalyticalModel analyticalModel = ModelWithEmbeddedWeather(); + analyticalModel.TryGetValue(AnalyticalModelParameter.HeatingDesignDays, out SAMCollection heatingDesignDays); + DesignDay heatingDesignDay = new DesignDay(heatingDesignDays.First()); + for (int i = 0; i < 24; i++) + { + heatingDesignDay[Weather.WeatherDataType.AtmosphericPressure, i] = 31000.0; + } + + Analytical.Modify.UpdateWeather(analyticalModel, null, null, new System.Collections.Generic.List { heatingDesignDay }); + + OpenStudioConversionResult result = analyticalModel.ToOpenStudio(WeatherPath(".epw"), OutputDirectory("dd_bad_pressure"), run: false); + + Assert.That(result.Diagnostics.Any(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning && d.Message.Contains("barometric pressure") && d.Message.Contains("31000")), Is.True, "The rejected implausible pressure is named: " + string.Join(" | ", result.Diagnostics.Select(d => d.Message))); + + // The implausible 31000 Pa (which also happens to be the unset OpenStudio IDD + // floor) never reaches the IDF: the field carries the elevation-based standard. + global::OpenStudio.DesignDay designDay = result.Model.getDesignDays().Single(x => x.dayType() == "WinterDesignDay"); + Assert.That(designDay.barometricPressure(), Is.GreaterThan(90000.0).And.LessThan(110000.0), "Elevation-based standard pressure is written in place of the implausible SAM value"); + } + + [Test] + public void EmbeddedDesignDay_MissingPressure_WritesElevationStandardNotTheIddFloor() + { + // Many real SAM embedded design days carry no barometric-pressure profile at all + // (the HungaryHouse benchmark model is one: its design-day data holds dry bulb, + // RH, wind and solar only). The conversion must still WRITE the field: an unset + // OpenStudio design-day pressure is the 31000 Pa IDD floor, which reached the IDF + // of a real benchmark run and made EnergyPlus log a substitution warning. + AnalyticalModel analyticalModel = ModelWithEmbeddedWeather(); + analyticalModel.TryGetValue(AnalyticalModelParameter.HeatingDesignDays, out SAMCollection heatingDesignDays); + DesignDay heatingDesignDay = new DesignDay(heatingDesignDays.First()); + Assert.That(heatingDesignDay.Remove(Weather.WeatherDataType.AtmosphericPressure), Is.True, "The fixture design day must start with a pressure profile for this test to remove it"); + + Analytical.Modify.UpdateWeather(analyticalModel, null, null, new System.Collections.Generic.List { heatingDesignDay }); + + OpenStudioConversionResult result = analyticalModel.ToOpenStudio(WeatherPath(".epw"), OutputDirectory("dd_missing_pressure"), run: false); + + global::OpenStudio.DesignDay designDay = result.Model.getDesignDays().Single(x => x.dayType() == "WinterDesignDay"); + Assert.That(designDay.barometricPressure(), Is.GreaterThan(90000.0).And.LessThan(110000.0), "The elevation-based standard is written when SAM has no pressure"); + Assert.That(designDay.barometricPressure(), Is.Not.EqualTo(31000.0), "The EnergyPlus 31000 Pa IDD floor must never reach the IDF"); + Assert.That(result.Diagnostics.Any(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning && d.Message.Contains("no usable barometric-pressure profile")), Is.True, "The substitution is named: " + string.Join(" | ", result.Diagnostics.Select(d => d.Message))); + } + + [Test] + public void EmbeddedDesignDay_PlausiblePressure_IsRetained() + { + // The complement of the two substitution cases: a pressure within 10% of the + // elevation-based standard is the SAM value and must be converted unchanged. + AnalyticalModel analyticalModel = ModelWithEmbeddedWeather(); + analyticalModel.TryGetValue(AnalyticalModelParameter.HeatingDesignDays, out SAMCollection heatingDesignDays); + DesignDay heatingDesignDay = new DesignDay(heatingDesignDays.First()); + const double plausiblePressure = 100200.0; + for (int i = 0; i < 24; i++) + { + heatingDesignDay[Weather.WeatherDataType.AtmosphericPressure, i] = plausiblePressure; + } + + Analytical.Modify.UpdateWeather(analyticalModel, null, null, new System.Collections.Generic.List { heatingDesignDay }); + + OpenStudioConversionResult result = analyticalModel.ToOpenStudio(WeatherPath(".epw"), OutputDirectory("dd_good_pressure"), run: false); + + global::OpenStudio.DesignDay designDay = result.Model.getDesignDays().Single(x => x.dayType() == "WinterDesignDay"); + Assert.That(designDay.barometricPressure(), Is.EqualTo(plausiblePressure).Within(1e-6), "A plausible SAM pressure is retained, not replaced"); + Assert.That(result.Diagnostics.Any(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning && d.Message.Contains("barometric-pressure")), Is.False, "No substitution is reported when nothing was substituted"); + } + + [Test] + public void ExplicitDdy_OverridesEmbeddedDesignDays_NoDuplicates() + { + AnalyticalModel analyticalModel = ModelWithEmbeddedWeather(); + + Core.OpenStudio.OpenStudioConversionOptions options = new Core.OpenStudio.OpenStudioConversionOptions { DdyPath = WeatherPath(".ddy") }; + OpenStudioConversionResult result = analyticalModel.ToOpenStudio(WeatherPath(".epw"), OutputDirectory("explicit_ddy"), openStudioConversionOptions: options, run: false); + + System.Collections.Generic.List names = result.Model.getDesignDays().Select(x => x.nameString()).ToList(); + Assert.That(names.Count, Is.EqualTo(2), "No merge of explicit DDY and embedded days: " + string.Join(" | ", names)); + Assert.That(names.Count(x => System.Text.RegularExpressions.Regex.IsMatch(x, @"Ann\s+Htg\s+99\.6\s*%\s+Condns\s+DB", System.Text.RegularExpressions.RegexOptions.IgnoreCase)), Is.EqualTo(1), "The DDY heating 99.6% day wins"); + Assert.That(names.Count(x => System.Text.RegularExpressions.Regex.IsMatch(x, @"Ann\s+Clg\s+0?\.4\s*%\s+Condns\s+DB\s*=>\s*M(C)?WB", System.Text.RegularExpressions.RegexOptions.IgnoreCase)), Is.EqualTo(1), "The DDY cooling .4% day wins"); + Assert.That(result.Diagnostics.Any(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Information && d.Message.Contains("Design-day source: explicit DDY")), Is.True, "The explicit source is named"); + Assert.That(result.DesignDaySource, Is.EqualTo(Core.OpenStudio.OpenStudioDesignDaySource.Ddy), "An explicit DDY is reported as the established basis, not the embedded model"); + } + + [Test] + public void RunOptionDdy_OverridesConversionOptionDdy() + { + // Two different DDY sources: the conversion option points at the full Boston DDY, + // the run option at a heating-only extract. The run option must win. + string[] lines = File.ReadAllLines(WeatherPath(".ddy")); + System.Text.StringBuilder heatingOnly = new System.Text.StringBuilder(); + for (int i = 0; i < lines.Length; i++) + { + if (lines[i].TrimStart().StartsWith("SizingPeriod:DesignDay", StringComparison.OrdinalIgnoreCase) && i + 1 < lines.Length && lines[i + 1].Contains("Ann Htg 99.6% Condns DB")) + { + for (int j = i; j < lines.Length; j++) + { + heatingOnly.AppendLine(lines[j]); + + string code = lines[j]; + int commentIndex = code.IndexOf('!'); + if (commentIndex >= 0) + { + code = code.Substring(0, commentIndex); + } + + if (code.TrimEnd().EndsWith(";")) + { + break; + } + } + + break; + } + } + + string heatingOnlyPath = Path.Combine(TestContext.CurrentContext.WorkDirectory, "embedded_heating_only.ddy"); + File.WriteAllText(heatingOnlyPath, heatingOnly.ToString()); + + Core.OpenStudio.OpenStudioConversionOptions options = new Core.OpenStudio.OpenStudioConversionOptions { DdyPath = WeatherPath(".ddy") }; + Core.OpenStudio.OpenStudioRunOptions runOptions = new Core.OpenStudio.OpenStudioRunOptions { DdyPath = heatingOnlyPath }; + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox().ToOpenStudio(WeatherPath(".epw"), OutputDirectory("runoption_ddy"), openStudioConversionOptions: options, openStudioRunOptions: runOptions, run: false); + + System.Collections.Generic.List names = result.Model.getDesignDays().Select(x => x.nameString()).ToList(); + Assert.That(names.Count, Is.EqualTo(1), "The run-option DDY takes precedence over the conversion option: " + string.Join(" | ", names)); + Assert.That(names[0], Does.Contain("Ann Htg 99.6% Condns DB")); + } + + [Test] + public void ExplicitEpw_OverridesEmbeddedWeather() + { + AnalyticalModel analyticalModel = ModelWithEmbeddedWeather(); + string epwPath = WeatherPath(".epw"); + + OpenStudioConversionResult result = analyticalModel.ToOpenStudio(epwPath, OutputDirectory("explicit_epw"), run: false); + + Assert.That(result.Diagnostics.Any(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Information && d.Message.Contains("Annual weather source: explicit EPW")), Is.True, "The explicit source is named"); + Assert.That(File.ReadAllText(result.OswPath), Does.Contain(epwPath.Replace('\\', '/')), "The OSW references the explicit EPW, not the embedded export"); + } + + [Test] + public void EmbeddedWeather_UsedWhenNoEpw() + { + AnalyticalModel analyticalModel = ModelWithEmbeddedWeather(); + + OpenStudioConversionResult result = analyticalModel.ToOpenStudio(null, OutputDirectory("embedded_epw"), run: false); + + Assert.That(result.IsValid, Is.True, "Conversion-only with embedded weather is valid: " + string.Join(" | ", result.Diagnostics.Where(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error).Select(d => d.Message))); + Assert.That(result.Diagnostics.Any(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Information && d.Message.Contains("Annual weather source: AnalyticalModel WeatherData")), Is.True, "The embedded source is named"); + Assert.That(result.Diagnostics.Any(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Information && d.Message.Contains("Ground temperatures taken from the SAM model WeatherData")), Is.True, "Embedded ground temperatures still apply"); + + global::OpenStudio.EpwFile epwFile = global::OpenStudio.EpwFile.load(global::OpenStudio.OpenStudioUtilitiesCore.toPath(WeatherPath(".epw"))).get(); + Assert.That(result.Model.getSite().latitude(), Is.EqualTo(epwFile.latitude()).Within(1e-6), "The exported EPW drives the site"); + Assert.That(result.OswPath, Is.Not.Null); + Assert.That(File.ReadAllText(result.OswPath), Does.Contain("SAM_WeatherData_"), "The OSW references the exported EPW"); + } + + [Test] + public void ExportedEpw_DaylightSavingHeader_IsEnergyPlusValid() + { + // Human-Rhino validation: every embedded-weather run ended with + // ** Severe ** Invalid date field=NO + // ProcessEPWHeader: Invalid Daylight Saving Period Start Date Field(WeatherFile)=NO + // The exported header carried an extra empty leading field + // (HOLIDAYS/DAYLIGHT SAVINGS,,No,0,0,0), shifting "No" into the DST start-date slot. + AnalyticalModel analyticalModel = ModelWithEmbeddedWeather(); + + string epwPath = analyticalModel.EmbeddedAnnualWeatherPath(); + Assert.That(epwPath, Is.Not.Null.And.Not.Empty, "The embedded WeatherData exports an EPW"); + Assert.That(File.Exists(epwPath), Is.True, epwPath); + + string line = File.ReadLines(epwPath).FirstOrDefault(x => x.StartsWith("HOLIDAYS/DAYLIGHT SAVINGS", StringComparison.OrdinalIgnoreCase)); + Assert.That(line, Is.Not.Null, "The exported EPW carries the header EnergyPlus parses"); + + // EPW field order after the keyword: leap year observed, daylight saving start day, + // daylight saving end day, number of holidays. + string[] fields = line.Split(','); + Assert.That(fields.Length, Is.GreaterThanOrEqualTo(5), "No empty padding field: " + line); + Assert.That(fields[1].Trim(), Is.EqualTo("No"), "Field 1 is the leap-year flag: " + line); + Assert.That(fields[2].Trim(), Is.EqualTo("0"), "Field 2 is the DST start day - EnergyPlus rejects a Yes/No token here with a Severe: " + line); + Assert.That(fields[3].Trim(), Is.EqualTo("0"), "Field 3 is the DST end day: " + line); + Assert.That(fields[4].Trim(), Is.EqualTo("0"), "Field 4 is the holiday count: " + line); + } + + [Test] + public void EmbeddedWeatherMetadata_WithoutYears_UsedWhenNoEpw() + { + Weather.WeatherData weatherData = new Weather.WeatherData(42.36, -71.01, 6.0); + Weather.GroundTemperature groundTemperature = new Weather.GroundTemperature(0.5, double.NaN, double.NaN, double.NaN, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); + weatherData.SetValue(Weather.WeatherDataParameter.GroundTemperatures, new SAMCollection(groundTemperature)); + + AnalyticalModel analyticalModel = AnalyticalModelFixtures.SingleBox(); + analyticalModel.SetValue(AnalyticalModelParameter.WeatherData, weatherData); + + OpenStudioConversionResult result = analyticalModel.ToOpenStudio(null, OutputDirectory("embedded_metadata"), run: false); + + Assert.That(result.IsValid, Is.True, "Conversion-only without any EPW stays valid"); + Assert.That(result.Diagnostics.Any(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning && d.Message.Contains("No usable annual EPW source")), Is.True, "The missing annual source is a warning when not running"); + Assert.That(result.Model.getSite().latitude(), Is.EqualTo(42.36).Within(1e-9), "Location still comes from the embedded WeatherData"); + Assert.That(result.Model.getSiteGroundTemperatureBuildingSurface().januaryGroundTemperature(), Is.EqualTo(1.0).Within(1e-9), "Ground temperatures still come from the embedded WeatherData"); + Assert.That(result.Diagnostics.Any(d => d.Message.Contains("an EPW path is still required for an annual run")), Is.True, "The metadata fallback names the annual-run limitation"); + } + + [Test] + public void RunTrue_NoWeatherSource_FailsClearly() + { + AnalyticalModel analyticalModel = AnalyticalModelFixtures.SingleBox(); + + OpenStudioConversionResult result = analyticalModel.ToOpenStudio(null, OutputDirectory("no_weather_run"), run: true); + + Assert.That(result.Diagnostics.Any(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error && d.Message.Contains("EPW")), Is.True, "A blocking error names the missing EPW source"); + Assert.That(result.RunResult, Is.Null, "The simulation is not executed without a weather source"); + Assert.That(result.OsmPath, Is.Not.Null, "The OSM stays on disk for inspection"); + } + + [Test] + public void ConversionOnly_NoWeather_SucceedsWithWarning() + { + AnalyticalModel analyticalModel = AnalyticalModelFixtures.SingleBox(); + + OpenStudioConversionResult result = analyticalModel.ToOpenStudio(null, OutputDirectory("no_weather_convert"), run: false); + + Assert.That(result.IsValid, Is.True, "Conversion-only without weather is valid"); + Assert.That(result.Diagnostics.Any(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning && d.Message.Contains("No usable annual EPW source")), Is.True); + Assert.That(result.Diagnostics.Any(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error), Is.False, "No error when no annual run was requested"); + Assert.That(result.DesignDaySource, Is.EqualTo(Core.OpenStudio.OpenStudioDesignDaySource.None), "A model with no design days establishes no basis"); + Assert.That(File.Exists(result.OsmPath), Is.True, "The OSM is saved"); + } + + [Test] + public void InvalidExplicitEpw_FallsBackToEmbeddedWeather_WithWarning() + { + AnalyticalModel analyticalModel = ModelWithEmbeddedWeather(); + + OpenStudioConversionResult result = analyticalModel.ToOpenStudio(Path.Combine(OutputDirectory("invalid_epw"), "missing.epw"), OutputDirectory("invalid_epw"), run: false); + + Assert.That(result.Diagnostics.Any(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning && d.Message.Contains("The explicit EPW path is not usable")), Is.True, "The rejected explicit path is named"); + Assert.That(result.Diagnostics.Any(d => d.Message.Contains("Annual weather source: AnalyticalModel WeatherData")), Is.True, "The embedded fallback applies"); + } + + [Test] + [Category("Simulation")] + public void EmbeddedWeatherAndDesignDays_EndToEnd_RunAndResults() + { + // The human Rhino route, fully embedded: no _epwPath, no ddyPath_ — WeatherData + // and heating/cooling design days come from the AnalyticalModel only. + AnalyticalModel analyticalModel = ModelWithEmbeddedWeather(); + + string outputDirectory = OutputDirectory("embedded_endtoend"); + OpenStudioConversionResult result = analyticalModel.ToOpenStudio(null, outputDirectory, run: true); + + Assert.That(result.RunResult?.Success, Is.True, "The run succeeds with the exported EPW: " + string.Join(" | ", result.Diagnostics.Where(d => d.Severity >= Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning).Select(d => d.Message))); + Assert.That(result.Diagnostics.Any(d => d.Message.Contains("Annual weather source: AnalyticalModel WeatherData")), Is.True); + Assert.That(result.Diagnostics.Any(d => d.Message.Contains("Design-day source: AnalyticalModel heating/cooling design days")), Is.True); + + System.Collections.Generic.List environments = new System.Collections.Generic.List(); + using (System.Data.SQLite.SQLiteConnection connection = new System.Data.SQLite.SQLiteConnection("Data Source=" + result.RunResult.SqlPath + ";Read Only=True")) + { + connection.Open(); + using (System.Data.SQLite.SQLiteCommand command = connection.CreateCommand()) + { + command.CommandText = "SELECT EnvironmentName, EnvironmentType FROM EnvironmentPeriods"; + using (System.Data.SQLite.SQLiteDataReader reader = command.ExecuteReader()) + { + while (reader.Read()) + { + environments.Add(reader.GetString(0) + " [type " + reader.GetInt32(1) + "]"); + } + } + } + } + + TestContext.Out.WriteLine(string.Join("\n", environments)); + Assert.That(environments.Count(x => x.Contains("[type 3]")), Is.EqualTo(1), "One annual environment"); + Assert.That(environments.Count(x => x.IndexOf("HTG", StringComparison.OrdinalIgnoreCase) >= 0), Is.EqualTo(1), "The embedded heating day was simulated"); + Assert.That(environments.Count(x => x.IndexOf("CLG", StringComparison.OrdinalIgnoreCase) >= 0), Is.EqualTo(1), "The embedded cooling day was simulated"); + + // The SQL design-day reader (fix 2) reads those same environments without a + // DateTime exception, and the results attachment (fix 3) maps the annual family. + System.Collections.Generic.List designDays = Create.DesignDays(result.RunResult.SqlPath, out System.Collections.Generic.List designDayDiagnostics); + Assert.That(designDays, Is.Not.Null.And.Count.EqualTo(2), "Create.DesignDays round-trips the embedded days: " + string.Join(" | ", designDayDiagnostics)); + + AdjacencyCluster adjacencyCluster = new AdjacencyCluster(analyticalModel.AdjacencyCluster); + System.Collections.Generic.List results = Modify.AddResults(adjacencyCluster, result.RunResult.SqlPath, out System.Collections.Generic.List resultDiagnostics); + Assert.That(results.Count(x => x is SpaceSimulationResult), Is.GreaterThanOrEqualTo(2), "Annual space results attached"); + Assert.That(results.Count(x => x is SurfaceSimulationResult), Is.GreaterThanOrEqualTo(6), "Surface results attached"); + Assert.That(adjacencyCluster.GetResults(adjacencyCluster.GetSpaces().Single()), Is.Not.Null.And.Count.GreaterThanOrEqualTo(2), "The space carries its results"); + TestContext.Out.WriteLine(string.Join("\n", resultDiagnostics)); + } + + [Test] + public void EmbeddedFingerprint_ChangesWithContent_SameModelGuid() + { + AnalyticalModel analyticalModel = AnalyticalModelFixtures.SingleBox(); + Assert.That(Query.EmbeddedWeatherFingerprint(analyticalModel), Is.EqualTo(string.Empty), "Nothing embedded → empty fingerprint"); + + string fingerprint_1 = ModelWithEmbeddedWeather().EmbeddedWeatherFingerprint(); + string fingerprint_2 = ModelWithEmbeddedWeather().EmbeddedWeatherFingerprint(); + Assert.That(fingerprint_2, Is.EqualTo(fingerprint_1), "Identical embedded content → identical fingerprint"); + + AnalyticalModel analyticalModel_Modified = ModelWithEmbeddedWeather(); + analyticalModel_Modified.TryGetValue(AnalyticalModelParameter.HeatingDesignDays, out SAMCollection heatingDesignDays); + DesignDay designDay = new DesignDay(heatingDesignDays.First()); + designDay[Weather.WeatherDataType.DryBulbTemperature, 0] = designDay[Weather.WeatherDataType.DryBulbTemperature, 0] + 1.0; + Analytical.Modify.UpdateWeather(analyticalModel_Modified, null, null, new System.Collections.Generic.List { designDay }); + + string fingerprint_3 = analyticalModel_Modified.EmbeddedWeatherFingerprint(); + Assert.That(fingerprint_3, Is.Not.EqualTo(fingerprint_1), "Changed design-day content on the same model Guid must change the fingerprint"); + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/C4/SiteWeatherSettingsTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/C4/SiteWeatherSettingsTests.cs new file mode 100644 index 0000000..1967387 --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/C4/SiteWeatherSettingsTests.cs @@ -0,0 +1,403 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using SAM.Core; +using System; +using System.IO; +using System.Linq; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// C4: site, weather, design days and simulation settings — north rotation (radians → + /// degrees, solar-gain shift proven end-to-end), SAM Location precedence, ground-temperature + /// precedence, DDY import with sizing enablement and the annual environment-period filter, + /// custom RunPeriod/timestep, leap-year schedules and daylight saving time. + /// + [TestFixture] + public class SiteWeatherSettingsTests + { + private static string WeatherPath(string extension) + { + return Path.GetFullPath(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "..", "..", "..", "resources", "weather", "USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2004-2018" + extension)); + } + + private static string Convert_NoRun(AnalyticalModel analyticalModel, Core.OpenStudio.OpenStudioConversionOptions options, out OpenStudioConversionResult result) + { + string epwPath = WeatherPath(".epw"); + Assert.That(File.Exists(epwPath), Is.True, $"Pinned weather fixture missing: {epwPath}"); + + string outputDirectory = Path.Combine(TestContext.CurrentContext.WorkDirectory, "c4_convert", Guid.NewGuid().ToString("N").Substring(0, 8)); + result = analyticalModel.ToOpenStudio(epwPath, outputDirectory, openStudioConversionOptions: options, run: false); + return outputDirectory; + } + + [Test] + public void NorthAngle_FromSamModel_RotatesBuilding_RadiansToDegrees() + { + AnalyticalModel analyticalModel = AnalyticalModelFixtures.SingleBox(); + analyticalModel.SetValue(AnalyticalModelParameter.NorthAngle, Math.PI / 2); + + Convert_NoRun(analyticalModel, null, out OpenStudioConversionResult result); + + Assert.That(result.Model.getBuilding().northAxis(), Is.EqualTo(90).Within(1e-9), "SAM NorthAngle is stored in radians; 90° expected"); + + Convert_NoRun(analyticalModel, new Core.OpenStudio.OpenStudioConversionOptions { NorthAngleDegrees = 45 }, out OpenStudioConversionResult overridden); + Assert.That(overridden.Model.getBuilding().northAxis(), Is.EqualTo(45).Within(1e-9), "The explicit option overrides the SAM value"); + } + + [Test] + public void Location_OverridesEpwCoordinates() + { + AnalyticalModel analyticalModel = AnalyticalModelFixtures.SingleBox(); + AnalyticalModel located = new AnalyticalModel(analyticalModel, new Location("SAM Test Location", -0.1278, 51.5074, 11.0)); + + Convert_NoRun(located, null, out OpenStudioConversionResult result); + + global::OpenStudio.Site site = result.Model.getSite(); + Assert.That(site.latitude(), Is.EqualTo(51.5074).Within(1e-9), "SAM Location takes precedence over the EPW header"); + Assert.That(site.longitude(), Is.EqualTo(-0.1278).Within(1e-9)); + Assert.That(site.elevation(), Is.EqualTo(11.0).Within(1e-9)); + Assert.That(result.Diagnostics.Any(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Information && d.Message.Contains("SAM model Location")), Is.True, "The override is never silent"); + } + + [Test] + public void Location_InvalidCoordinates_KeepEpwSite_AndWarn() + { + // Review P2-03: a SAM Location carrying NaN or out-of-range coordinates must not + // reach OS:Site — the EPW site is kept and the rejection is named in a warning. + Convert_NoRun(AnalyticalModelFixtures.SingleBox(), null, out OpenStudioConversionResult baseline); + double epwLatitude = baseline.Model.getSite().latitude(); + double epwLongitude = baseline.Model.getSite().longitude(); + + AnalyticalModel nanModel = new AnalyticalModel(AnalyticalModelFixtures.SingleBox(), new Location("NaN Location", -0.1278, double.NaN, 11.0)); + Convert_NoRun(nanModel, null, out OpenStudioConversionResult nanResult); + + Assert.That(nanResult.Model.getSite().latitude(), Is.EqualTo(epwLatitude).Within(1e-9), "NaN latitude: the EPW site is kept"); + Assert.That(nanResult.Model.getSite().longitude(), Is.EqualTo(epwLongitude).Within(1e-9)); + Assert.That(nanResult.Diagnostics.Any(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning && d.Message.Contains("Location") && d.Message.Contains("NaN")), Is.True, "The rejected values are named"); + Assert.That(nanResult.Diagnostics.Any(d => d.Message.Contains("Site coordinates taken from the SAM model Location")), Is.False, "No override-info diagnostic for a rejected Location"); + + AnalyticalModel outOfRangeModel = new AnalyticalModel(AnalyticalModelFixtures.SingleBox(), new Location("Out Of Range", 200.0, 51.5074, 11.0)); + Convert_NoRun(outOfRangeModel, null, out OpenStudioConversionResult outOfRangeResult); + + Assert.That(outOfRangeResult.Model.getSite().longitude(), Is.EqualTo(epwLongitude).Within(1e-9), "Longitude 200 is out of range: the EPW site is kept"); + Assert.That(outOfRangeResult.Diagnostics.Any(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning && d.Message.Contains("200")), Is.True); + } + + [Test] + public void Location_NonFiniteElevation_KeepsEpwElevation_ButOverridesCoordinates() + { + // Valid latitude/longitude with a NaN elevation: coordinates override, the EPW + // elevation stays (never a NaN into OS:Site), and the message says so. + Convert_NoRun(AnalyticalModelFixtures.SingleBox(), null, out OpenStudioConversionResult baseline); + double epwElevation = baseline.Model.getSite().elevation(); + + AnalyticalModel model = new AnalyticalModel(AnalyticalModelFixtures.SingleBox(), new Location("No Elevation", -0.1278, 51.5074, double.NaN)); + Convert_NoRun(model, null, out OpenStudioConversionResult result); + + Assert.That(result.Model.getSite().latitude(), Is.EqualTo(51.5074).Within(1e-9), "Valid coordinates still override"); + Assert.That(result.Model.getSite().elevation(), Is.EqualTo(epwElevation).Within(1e-9), "NaN elevation: the EPW elevation is kept"); + Assert.That(result.Diagnostics.Any(d => d.Message.Contains("SAM model Location") && d.Message.Contains("elevation kept from the EPW header")), Is.True); + } + + [Test] + public void GroundTemperatures_ComeFromEpwHeader_WhenNoSamWeatherData() + { + Convert_NoRun(AnalyticalModelFixtures.SingleBox(), null, out OpenStudioConversionResult result); + + Assert.That(result.Diagnostics.Any(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Information && d.Message.Contains("GROUND TEMPERATURES")), Is.True, "The pinned Boston EPW carries a GROUND TEMPERATURES header"); + + string groundLine = File.ReadLines(WeatherPath(".epw")).First(x => x.IndexOf("GROUND TEMPERATURES", StringComparison.OrdinalIgnoreCase) >= 0); + string[] values = groundLine.Substring(groundLine.IndexOf(',') + 1).Split(','); + double expectedJanuary = double.Parse(values[5], System.Globalization.CultureInfo.InvariantCulture); // count, depth, conductivity, density, specific heat, then 12 temperatures (first set is 0.5 m) + + Assert.That(result.Model.getSiteGroundTemperatureBuildingSurface().januaryGroundTemperature(), Is.EqualTo(expectedJanuary).Within(1e-9), "EPW-header ground temperatures must reach the model"); + } + + [Test] + public void GroundTemperatures_SamWeatherData_TakesPrecedence() + { + double[] temperatures = Enumerable.Range(1, 12).Select(x => (double)x).ToArray(); + Weather.GroundTemperature groundTemperature = new Weather.GroundTemperature(0.5, double.NaN, double.NaN, double.NaN, temperatures[0], temperatures[1], temperatures[2], temperatures[3], temperatures[4], temperatures[5], temperatures[6], temperatures[7], temperatures[8], temperatures[9], temperatures[10], temperatures[11]); + + Weather.WeatherData weatherData = new Weather.WeatherData(42.36, -71.01, 6.0); + weatherData.SetValue(Weather.WeatherDataParameter.GroundTemperatures, new SAMCollection(groundTemperature)); + + AnalyticalModel analyticalModel = AnalyticalModelFixtures.SingleBox(); + analyticalModel.SetValue(AnalyticalModelParameter.WeatherData, weatherData); + + Convert_NoRun(analyticalModel, null, out OpenStudioConversionResult result); + + Assert.That(result.Model.getSiteGroundTemperatureBuildingSurface().januaryGroundTemperature(), Is.EqualTo(1.0).Within(1e-9), "SAM WeatherData takes precedence over the EPW header"); + Assert.That(result.Model.getSiteGroundTemperatureBuildingSurface().decemberGroundTemperature(), Is.EqualTo(12.0).Within(1e-9)); + Assert.That(result.Diagnostics.Any(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Information && d.Message.Contains("SAM model WeatherData")), Is.True); + } + + [Test] + public void DdyImport_AddsDesignDays_EnablesSizing() + { + // Review P1-02: ASHRAE DDYs name the annual pair "… Ann Htg 99.6% Condns DB" and + // "… Ann Clg .4% Condns DB=>MWB" (no leading zero). The default import must select + // exactly that pair — never the humidification (Hum_n) or wind (Htg Wind) 99.6% days. + Core.OpenStudio.OpenStudioConversionOptions options = new Core.OpenStudio.OpenStudioConversionOptions { DdyPath = WeatherPath(".ddy") }; + + Convert_NoRun(AnalyticalModelFixtures.SingleBox(), options, out OpenStudioConversionResult result); + + System.Collections.Generic.List names = result.Model.getDesignDays().Select(x => x.nameString()).ToList(); + Assert.That(names.Count, Is.EqualTo(2), "Exactly the heating 99.6% + cooling .4% pair: " + string.Join(" | ", names)); + Assert.That(names.Count(x => System.Text.RegularExpressions.Regex.IsMatch(x, @"Ann\s+Htg\s+99\.6\s*%\s+Condns\s+DB", System.Text.RegularExpressions.RegexOptions.IgnoreCase)), Is.EqualTo(1), "The annual heating 99.6% dry-bulb day is imported"); + Assert.That(names.Count(x => System.Text.RegularExpressions.Regex.IsMatch(x, @"Ann\s+Clg\s+0?\.4\s*%\s+Condns\s+DB\s*=>\s*M(C)?WB", System.Text.RegularExpressions.RegexOptions.IgnoreCase)), Is.EqualTo(1), "The annual cooling .4% DB=>MWB day is imported"); + Assert.That(names.Any(x => x.IndexOf("Hum_n", StringComparison.OrdinalIgnoreCase) >= 0 || x.IndexOf("Wind", StringComparison.OrdinalIgnoreCase) >= 0), Is.False, "No humidification or wind design days in the default pair"); + Assert.That(result.Model.getSimulationControl().runSimulationforSizingPeriods(), Is.True, "Sizing periods enabled when design days are imported"); + Assert.That(result.Model.getSimulationControl().doZoneSizingCalculation(), Is.True); + } + + [Test] + public void DdyImport_MissingCoolingDay_ImportsHeatingAndWarns() + { + // A DDY carrying only the heating day (site-specific files exist without the + // cooling row): the heating day imports and the missing cooling side is reported — + // never a silent fallback onto humidification/wind days. + string[] lines = File.ReadAllLines(WeatherPath(".ddy")); + System.Text.StringBuilder heatingOnly = new System.Text.StringBuilder(); + for (int i = 0; i < lines.Length; i++) + { + if (lines[i].TrimStart().StartsWith("SizingPeriod:DesignDay", StringComparison.OrdinalIgnoreCase) && i + 1 < lines.Length && lines[i + 1].Contains("Ann Htg 99.6% Condns DB")) + { + for (int j = i; j < lines.Length; j++) + { + heatingOnly.AppendLine(lines[j]); + + // The object terminator ';' precedes an inline "!- field name" comment. + string code = lines[j]; + int commentIndex = code.IndexOf('!'); + if (commentIndex >= 0) + { + code = code.Substring(0, commentIndex); + } + + if (code.TrimEnd().EndsWith(";")) + { + break; + } + } + + break; + } + } + + string heatingOnlyPath = Path.Combine(TestContext.CurrentContext.WorkDirectory, "c4_heating_only.ddy"); + File.WriteAllText(heatingOnlyPath, heatingOnly.ToString()); + + Core.OpenStudio.OpenStudioConversionOptions options = new Core.OpenStudio.OpenStudioConversionOptions { DdyPath = heatingOnlyPath }; + Convert_NoRun(AnalyticalModelFixtures.SingleBox(), options, out OpenStudioConversionResult result); + + Assert.That(result.Model.getDesignDays().Count, Is.EqualTo(1), "The heating day imports on its own"); + Assert.That(result.Model.getDesignDays().First().nameString(), Does.Contain("Ann Htg 99.6% Condns DB")); + Assert.That(result.Diagnostics.Any(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning && d.Message.Contains("cooling")), Is.True, "The missing cooling design day is reported"); + } + + [Test] + public void DdyImport_ImportAllDesignDays() + { + Core.OpenStudio.OpenStudioConversionOptions options = new Core.OpenStudio.OpenStudioConversionOptions { DdyPath = WeatherPath(".ddy"), ImportAllDesignDays = true }; + + Convert_NoRun(AnalyticalModelFixtures.SingleBox(), options, out OpenStudioConversionResult result); + + Assert.That(result.Model.getDesignDays().Count, Is.GreaterThan(2), "All DDY design days imported"); + } + + [Test] + public void NonHourlyOutputFrequency_WarnsThatPeaksAssumeHourly() + { + // Review P2-02 (mitigation): the extractor converts per-row energies with a fixed + // 3600 s interval — a non-hourly reporting frequency mis-scales peaks and series. + // Until frequency-aware extraction lands, the conversion must say so out loud. + Core.OpenStudio.OpenStudioConversionOptions options = new Core.OpenStudio.OpenStudioConversionOptions { OutputVariableFrequency = "Timestep" }; + + Convert_NoRun(AnalyticalModelFixtures.SingleBox(), options, out OpenStudioConversionResult result); + + Assert.That(result.IsValid, Is.True, "A non-hourly frequency stays usable (annual sums are unaffected)"); + Assert.That(result.Diagnostics.Count(d => d.Code == "SAM-OS-RUN-003" && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning && d.Message.Contains("Timestep")), Is.EqualTo(1), "One warning naming the non-hourly frequency"); + Assert.That(result.Model.getOutputVariables().All(x => x.reportingFrequency() == "Timestep"), Is.True, "The requested frequency is still honoured on the Output:Variable requests"); + + Convert_NoRun(AnalyticalModelFixtures.SingleBox(), new Core.OpenStudio.OpenStudioConversionOptions { OutputVariableFrequency = "Hourly" }, out OpenStudioConversionResult hourly); + Assert.That(hourly.Diagnostics.Any(d => d.Code == "SAM-OS-RUN-003"), Is.False, "The default hourly frequency stays silent"); + } + + [Test] + public void CustomRunPeriod_And_Timestep_And_DaylightSaving() + { + Core.OpenStudio.OpenStudioConversionOptions options = new Core.OpenStudio.OpenStudioConversionOptions + { + RunPeriodBeginMonth = 6, + RunPeriodBeginDay = 1, + RunPeriodEndMonth = 8, + RunPeriodEndDay = 31, + TimestepsPerHour = 4, + DaylightSavingsTime = true, + CalendarYear = 2024, + IsLeapYear = true, + }; + + Convert_NoRun(AnalyticalModelFixtures.SingleBox(), options, out OpenStudioConversionResult result); + + global::OpenStudio.RunPeriod runPeriod = result.Model.getRunPeriod(); + Assert.That(runPeriod.getBeginMonth(), Is.EqualTo(6)); + Assert.That(runPeriod.getBeginDayOfMonth(), Is.EqualTo(1)); + Assert.That(runPeriod.getEndMonth(), Is.EqualTo(8)); + Assert.That(runPeriod.getEndDayOfMonth(), Is.EqualTo(31)); + Assert.That(result.Model.getTimestep().numberOfTimestepsPerHour(), Is.EqualTo(4)); + Assert.That(result.Model.getOptionalRunPeriodControlDaylightSavingTime().isNull(), Is.False, "DST object present when optioned on"); + Assert.That(result.Model.calendarYear().get(), Is.EqualTo(2024)); + Assert.That(result.Model.isLeapYear(), Is.True); + + Convert_NoRun(AnalyticalModelFixtures.SingleBox(), null, out OpenStudioConversionResult defaults); + Assert.That(defaults.Model.getOptionalRunPeriodControlDaylightSavingTime().isNull(), Is.True, "DST stays OFF by default (energy-model convention; SAM carries no DST data)"); + } + + [Test] + public void ShadingCalculationMethod_DefaultsToPixelCounting() + { + // PixelCounting default: PolygonClipping flags every non-convex casting surface as a + // severe DetermineShadowingCombinations error; PixelCounting has no concavity + // limitation (same default as Ladybug Tools' FullInterior workflows). + Convert_NoRun(AnalyticalModelFixtures.SingleBox(), null, out OpenStudioConversionResult result); + Assert.That(result.Model.getShadowCalculation().shadingCalculationMethod(), Is.EqualTo("PixelCounting"), "PixelCounting is the default shading calculation method"); + + Convert_NoRun(AnalyticalModelFixtures.SingleBox(), new Core.OpenStudio.OpenStudioConversionOptions { ShadingCalculationMethod = "PolygonClipping" }, out OpenStudioConversionResult overridden); + Assert.That(overridden.Model.getShadowCalculation().shadingCalculationMethod(), Is.EqualTo("PolygonClipping"), "An explicit method is honoured"); + + Convert_NoRun(AnalyticalModelFixtures.SingleBox(), new Core.OpenStudio.OpenStudioConversionOptions { ShadingCalculationMethod = null }, out OpenStudioConversionResult untouched); + Assert.That(untouched.Model.getShadowCalculation().shadingCalculationMethod(), Is.EqualTo("PolygonClipping"), "Null leaves the OpenStudio default (PolygonClipping) untouched"); + } + + [Test] + public void ShadingCalculationMethod_InvalidValue_Warns() + { + Convert_NoRun(AnalyticalModelFixtures.SingleBox(), new Core.OpenStudio.OpenStudioConversionOptions { ShadingCalculationMethod = "NotAMethod" }, out OpenStudioConversionResult result); + + Assert.That(result.Diagnostics.Count(d => d.Code == "SAM-OS-SET-001" && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning && d.Message.Contains("NotAMethod")), Is.EqualTo(1), "One warning naming the rejected method"); + Assert.That(result.IsValid, Is.True, "A rejected method stays a warning — the OpenStudio default applies"); + } + + [Test] + public void NonConvexCasting_PolygonClippingNamesThePanel_PixelCountingAdvisesAboutGpuFallback() + { + // Real-model reproduction (HungaryHouse): an L-shaped exposed roof is non-convex + // and casts shadows — PolygonClipping reports it as a severe + // DetermineShadowingCombinations error. The conversion names the SAM panel so it + // can be split into convex parts; PixelCounting itself has no concavity + // limitation, but a GPU-less machine warns and reverts to PolygonClipping, so an + // Information-level advisory is still emitted. + AnalyticalModel analyticalModel = AnalyticalModelFixtures.LShapedBox(); + + Convert_NoRun(analyticalModel, new Core.OpenStudio.OpenStudioConversionOptions { ShadingCalculationMethod = "PolygonClipping" }, out OpenStudioConversionResult polygonClipping); + Assert.That(polygonClipping.Diagnostics.Count(d => d.Code == "SAM-OS-GEO-003" && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning), Is.EqualTo(1), "Exactly the L-shaped roof is named (slab is ground-coupled, walls are convex)"); + + Convert_NoRun(analyticalModel, null, out OpenStudioConversionResult pixelCounting); + Assert.That(pixelCounting.Diagnostics.Count(d => d.Code == "SAM-OS-GEO-003" && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Information && d.Message.Contains("GPU")), Is.EqualTo(1), "PixelCounting (default): advisory about the no-GPU PolygonClipping fallback"); + } + + [Test] + public void LeapYear_Generates8784ValueSchedules() + { + Core.OpenStudio.OpenStudioConversionOptions options = new Core.OpenStudio.OpenStudioConversionOptions { IsLeapYear = true }; + + Convert_NoRun(AnalyticalModelFixtures.SingleBox(), options, out OpenStudioConversionResult result); + + Assert.That(result.Model.isLeapYear(), Is.True); + + global::OpenStudio.ScheduleFixedInterval schedule = result.Model.getScheduleFixedIntervals().First(x => x.nameString().Contains("Heating")); + Assert.That((int)schedule.timeSeries().values().size(), Is.EqualTo(8784), "Leap-year runs generate 8784-value schedules (8760 store + repeated 31 Dec)"); + } + + [Test] + [Category("Simulation")] + public void NorthRotation_ShiftsSolarGains_EndToEnd() + { + string epwPath = WeatherPath(".epw"); + Assert.That(File.Exists(epwPath), Is.True); + + string baselineDirectory = Path.Combine(TestContext.CurrentContext.WorkDirectory, "c4_north_0"); + string rotatedDirectory = Path.Combine(TestContext.CurrentContext.WorkDirectory, "c4_north_180"); + foreach (string directory in new[] { baselineDirectory, rotatedDirectory }) + { + if (Directory.Exists(directory)) + { + Directory.Delete(directory, true); + } + } + + OpenStudioConversionResult baseline = AnalyticalModelFixtures.SingleBox().ToOpenStudio(epwPath, baselineDirectory); + OpenStudioConversionResult rotated = AnalyticalModelFixtures.SingleBox().ToOpenStudio(epwPath, rotatedDirectory, openStudioConversionOptions: new Core.OpenStudio.OpenStudioConversionOptions { NorthAngleDegrees = 180 }); + + Assert.That(baseline.RunResult?.Success, Is.True); + Assert.That(rotated.RunResult?.Success, Is.True); + Assert.That(rotated.Model.getBuilding().northAxis(), Is.EqualTo(180).Within(1e-9)); + + // The box's only window faces south at 0°: rotating 180° turns it north — less + // winter solar gain → strictly more heating, strictly less cooling. + TestContext.Out.WriteLine($"Heating 0°: {baseline.Loads.TotalHeating:0.0} kWh, 180°: {rotated.Loads.TotalHeating:0.0} kWh; Cooling 0°: {baseline.Loads.TotalCooling:0.0} kWh, 180°: {rotated.Loads.TotalCooling:0.0} kWh"); + Assert.That(rotated.Loads.TotalHeating, Is.GreaterThan(baseline.Loads.TotalHeating), "North-facing window → more heating"); + Assert.That(rotated.Loads.TotalCooling, Is.LessThan(baseline.Loads.TotalCooling), "North-facing window → less cooling"); + } + + [Test] + [Category("Simulation")] + public void DesignDaysRun_AnnualResultsExcludeSizingPeriods() + { + string epwPath = WeatherPath(".epw"); + Assert.That(File.Exists(epwPath), Is.True); + + string baselineDirectory = Path.Combine(TestContext.CurrentContext.WorkDirectory, "c4_annual_baseline"); + string designDayDirectory = Path.Combine(TestContext.CurrentContext.WorkDirectory, "c4_annual_designdays"); + foreach (string directory in new[] { baselineDirectory, designDayDirectory }) + { + if (Directory.Exists(directory)) + { + Directory.Delete(directory, true); + } + } + + OpenStudioConversionResult baseline = AnalyticalModelFixtures.SingleBox().ToOpenStudio(epwPath, baselineDirectory); + OpenStudioConversionResult withDesignDays = AnalyticalModelFixtures.SingleBox().ToOpenStudio(epwPath, designDayDirectory, openStudioConversionOptions: new Core.OpenStudio.OpenStudioConversionOptions { DdyPath = WeatherPath(".ddy") }); + + Assert.That(baseline.RunResult?.Success, Is.True); + Assert.That(withDesignDays.RunResult?.Success, Is.True); + Assert.That(withDesignDays.Model.getDesignDays().Count, Is.EqualTo(2), "Exactly the heating 99.6% + cooling .4% pair (review P1-02)"); + + // Review P1-02: the sizing environments actually simulated must be the heating + // 99.6% dry-bulb day AND the cooling .4% DB=>MWB day — no humidification/wind days. + System.Collections.Generic.List sizingEnvironments = new System.Collections.Generic.List(); + using (System.Data.SQLite.SQLiteConnection connection = new System.Data.SQLite.SQLiteConnection("Data Source=" + withDesignDays.RunResult.SqlPath + ";Read Only=True")) + { + connection.Open(); + using (System.Data.SQLite.SQLiteCommand command = connection.CreateCommand()) + { + command.CommandText = "SELECT EnvironmentName FROM EnvironmentPeriods WHERE EnvironmentType IN (1, 2)"; + using (System.Data.SQLite.SQLiteDataReader reader = command.ExecuteReader()) + { + while (reader.Read()) + { + sizingEnvironments.Add(reader.GetString(0)); + } + } + } + } + + Assert.That(sizingEnvironments.Count, Is.EqualTo(2), "Two sizing environments: " + string.Join(" | ", sizingEnvironments)); + Assert.That(sizingEnvironments.Count(x => x.IndexOf("HTG 99.6%", StringComparison.OrdinalIgnoreCase) >= 0 && x.IndexOf("WIND", StringComparison.OrdinalIgnoreCase) < 0), Is.EqualTo(1), "Heating sizing environment present"); + Assert.That(sizingEnvironments.Count(x => x.IndexOf("CLG .4%", StringComparison.OrdinalIgnoreCase) >= 0), Is.EqualTo(1), "Cooling sizing environment present"); + Assert.That(sizingEnvironments.Any(x => x.IndexOf("HUM_N", StringComparison.OrdinalIgnoreCase) >= 0 || x.IndexOf("WIND", StringComparison.OrdinalIgnoreCase) >= 0), Is.False, "No humidification/wind sizing environments"); + + // The environment-period filter must exclude the sizing days from the annual sums: + // identical model and weather → identical annual loads. + TestContext.Out.WriteLine($"Baseline: H {baseline.Loads.TotalHeating:0.000} / C {baseline.Loads.TotalCooling:0.000} kWh; with design days: H {withDesignDays.Loads.TotalHeating:0.000} / C {withDesignDays.Loads.TotalCooling:0.000} kWh"); + Assert.That(withDesignDays.Loads.TotalHeating, Is.EqualTo(baseline.Loads.TotalHeating).Within(Math.Max(1.0, baseline.Loads.TotalHeating * 0.01)), "Annual heating must not double-count design days"); + Assert.That(withDesignDays.Loads.TotalCooling, Is.EqualTo(baseline.Loads.TotalCooling).Within(Math.Max(1.0, baseline.Loads.TotalCooling * 0.01)), "Annual cooling must not double-count design days"); + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/C5/AddResultsBySqlTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/C5/AddResultsBySqlTests.cs new file mode 100644 index 0000000..86e63a2 --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/C5/AddResultsBySqlTests.cs @@ -0,0 +1,577 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using SAM.Core; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// Human-Rhino validation, fix 3: SAMAnalytical.AddResultsBySQL returned no space/panel + /// results — the annual family was never read (only design-day ZoneSizes data was mapped), + /// surface results were discarded whenever no space result carried a load time index, and + /// EnergyPlus names (SAM_<type>_<name>_<guid8>) were matched against full + /// 32-character Guids, so nothing ever related back to a SAM space or panel. Synthetic + /// EnergyPlus-schema SQL proves the mapping end to end: per-space results, per-surface + /// results with panel identity, internal-panel two-surface handling, zero-vs-missing, + /// rerun deduplication, annual/design-day environment separation and SAM serialization. + /// + [TestFixture] + public class AddResultsBySqlTests + { + /// SurfaceIndex -> BaseSurfaceIndex for subsurface rows; a surface not listed points at itself, like an EnergyPlus base surface. + private static string CreateResultsSql(string fileName, IReadOnlyList<(string ZoneName, string IdealLoadsKey, double FloorArea, double Volume)> zones, IReadOnlyList<(string SurfaceName, double Area, int ZoneIndex)> surfaces, double heatingPeakJoules, double coolingPeakJoules, bool withDesignDayEnvironment, double? zeroCoolingZone = null, IReadOnlyDictionary hostSurfaceIndexes = null) + { + string sqlPath = Path.Combine(TestContext.CurrentContext.WorkDirectory, fileName); + if (File.Exists(sqlPath)) + { + File.Delete(sqlPath); + } + + using (System.Data.SQLite.SQLiteConnection connection = new System.Data.SQLite.SQLiteConnection("Data Source=" + sqlPath)) + { + connection.Open(); + using (System.Data.SQLite.SQLiteCommand command = connection.CreateCommand()) + { + void Exec(string sql) + { + command.CommandText = sql; + command.ExecuteNonQuery(); + } + + Exec("CREATE TABLE EnvironmentPeriods (EnvironmentPeriodIndex INTEGER PRIMARY KEY, EnvironmentName TEXT, EnvironmentType INTEGER)"); + Exec("CREATE TABLE Time (TimeIndex INTEGER PRIMARY KEY, Year INTEGER, Month INTEGER, Day INTEGER, Hour INTEGER, Minute INTEGER, Dst INTEGER, EnvironmentPeriodIndex INTEGER)"); + Exec("CREATE TABLE ReportDataDictionary (ReportDataDictionaryIndex INTEGER PRIMARY KEY, KeyValue TEXT, Name TEXT, Units TEXT)"); + Exec("CREATE TABLE ReportData (ReportDataIndex INTEGER PRIMARY KEY, ReportDataDictionaryIndex INTEGER, TimeIndex INTEGER, Value REAL)"); + Exec("CREATE TABLE Zones (ZoneIndex INTEGER PRIMARY KEY, ZoneName TEXT, FloorArea REAL, Volume REAL)"); + Exec("CREATE TABLE Surfaces (SurfaceIndex INTEGER PRIMARY KEY, SurfaceName TEXT, Area REAL, ZoneIndex INTEGER, BaseSurfaceIndex INTEGER)"); + Exec("CREATE TABLE ZoneSizes (ZoneName TEXT, LoadType TEXT, CalcDesLoad REAL, DesDayName TEXT, PeakHrMin TEXT, PeakTemp REAL, PeakHumRat REAL)"); + Exec("CREATE TABLE NominalLighting (ZoneIndex INTEGER, DesignLevel REAL)"); + Exec("CREATE TABLE NominalInfiltration (ZoneIndex INTEGER, DesignLevel REAL)"); + Exec("CREATE TABLE NominalElectricEquipment (ZoneIndex INTEGER, DesignLevel REAL)"); + + Exec("INSERT INTO EnvironmentPeriods VALUES (1, 'SAM_RUNPERIOD_ANNUAL', 3)"); + if (withDesignDayEnvironment) + { + Exec("INSERT INTO EnvironmentPeriods VALUES (2, 'BOSTON ANN HTG 99.6% CONDNS DB', 1)"); + Exec("INSERT INTO EnvironmentPeriods VALUES (3, 'BOSTON ANN CLG .4% CONDNS DB=>MWB', 2)"); + } + + int timeIndex = 0; + int reportDataIndex = 0; + for (int hour = 1; hour <= 24; hour++) + { + timeIndex++; + Exec(string.Format(System.Globalization.CultureInfo.InvariantCulture, "INSERT INTO Time VALUES ({0}, 2006, 1, 1, {1}, 0, 0, 1)", timeIndex, hour)); + } + + int annualTimeIndexCount = timeIndex; + if (withDesignDayEnvironment) + { + for (int hour = 1; hour <= 24; hour++) + { + timeIndex++; + Exec(string.Format(System.Globalization.CultureInfo.InvariantCulture, "INSERT INTO Time VALUES ({0}, 0, 1, 21, {1}, 0, 0, 2)", timeIndex, hour)); + } + + for (int hour = 1; hour <= 24; hour++) + { + timeIndex++; + Exec(string.Format(System.Globalization.CultureInfo.InvariantCulture, "INSERT INTO Time VALUES ({0}, 0, 7, 21, {1}, 0, 0, 3)", timeIndex, hour)); + } + } + + int dictionaryIndex = 0; + void Variable(string key, string name, string units) + { + dictionaryIndex++; + Exec(string.Format(System.Globalization.CultureInfo.InvariantCulture, "INSERT INTO ReportDataDictionary VALUES ({0}, '{1}', '{2}', '{3}')", dictionaryIndex, key, name, units)); + } + + void Values(string name, string key, double v1, double vPeak, int peakHour, int environmentOffset) + { + for (int hour = 1; hour <= 24; hour++) + { + reportDataIndex++; + double value = hour == peakHour ? vPeak : v1; + Exec(string.Format(System.Globalization.CultureInfo.InvariantCulture, "INSERT INTO ReportData VALUES ({0}, (SELECT ReportDataDictionaryIndex FROM ReportDataDictionary WHERE KeyValue = '{1}' AND Name = '{2}'), {3}, {4})", reportDataIndex, key, name, environmentOffset + hour, value)); + } + } + + for (int i = 0; i < zones.Count; i++) + { + (string zoneName, string idealLoadsKey, double floorArea, double volume) = zones[i]; + Exec(string.Format(System.Globalization.CultureInfo.InvariantCulture, "INSERT INTO Zones VALUES ({0}, '{1}', {2}, {3})", i + 1, zoneName, floorArea, volume)); + + Variable(idealLoadsKey, "Zone Ideal Loads Supply Air Total Heating Energy", "J"); + Variable(idealLoadsKey, "Zone Ideal Loads Supply Air Total Cooling Energy", "J"); + Variable(zoneName, "Zone Heating Setpoint Not Met Time", "hr"); + Variable(zoneName, "Zone Cooling Setpoint Not Met Time", "hr"); + + // Heating peaks at hour 10, cooling at hour 15 — except the designated + // zero-cooling zone, whose cooling series is a genuine all-zero. + double coolingPeak = zeroCoolingZone.HasValue && i == zones.Count - 1 && zeroCoolingZone.Value == 0 ? 0 : coolingPeakJoules; + Values("Zone Ideal Loads Supply Air Total Heating Energy", idealLoadsKey, heatingPeakJoules / 100.0, heatingPeakJoules, 10, 0); + Values("Zone Ideal Loads Supply Air Total Cooling Energy", idealLoadsKey, coolingPeak > 0 ? coolingPeak / 100.0 : 0, coolingPeak, 15, 0); + Values("Zone Heating Setpoint Not Met Time", zoneName, 0, 1, 12, 0); + Values("Zone Cooling Setpoint Not Met Time", zoneName, 0, zeroCoolingZone.HasValue && i == zones.Count - 1 ? 0 : 2, 16, 0); + + if (withDesignDayEnvironment) + { + Exec(string.Format(System.Globalization.CultureInfo.InvariantCulture, "INSERT INTO ZoneSizes VALUES ('{0}', 'Heating', {1}, 'BOSTON ANN HTG 99.6% CONDNS DB', ' 1/21 10:00', -10.0, 0.001)", zoneName, heatingPeakJoules / 3600.0)); + Exec(string.Format(System.Globalization.CultureInfo.InvariantCulture, "INSERT INTO ZoneSizes VALUES ('{0}', 'Cooling', {1}, 'BOSTON ANN CLG .4% CONDNS DB=>MWB', ' 7/21 15:00', 33.0, 0.01)", zoneName, coolingPeakJoules / 3600.0)); + } + } + + for (int i = 0; i < surfaces.Count; i++) + { + int surfaceIndex = i + 1; + int baseSurfaceIndex = surfaceIndex; + if (hostSurfaceIndexes != null && hostSurfaceIndexes.TryGetValue(surfaceIndex, out int hostSurfaceIndex)) + { + baseSurfaceIndex = hostSurfaceIndex; + } + + Exec(string.Format(System.Globalization.CultureInfo.InvariantCulture, "INSERT INTO Surfaces VALUES ({0}, '{1}', {2}, {3}, {4})", surfaceIndex, surfaces[i].SurfaceName, surfaces[i].Area, surfaces[i].ZoneIndex, baseSurfaceIndex)); + } + } + } + + return sqlPath; + } + + private static string ZoneName(Space space) + { + return Core.OpenStudio.Query.OpenStudioName("ThermalZone", space.Name, space.Guid).ToUpperInvariant(); + } + + private static string IdealLoadsKey(Space space) + { + return Core.OpenStudio.Query.OpenStudioName("IdealLoads", space.Name, space.Guid).ToUpperInvariant(); + } + + private static string SurfaceName(Panel panel, int spaceIndex) + { + return Core.OpenStudio.Query.OpenStudioName("Surface", string.Format("{0}_{1}", panel.Name, spaceIndex), panel.Guid).ToUpperInvariant(); + } + + private static string SubSurfaceName(Aperture aperture, int spaceIndex) + { + return Core.OpenStudio.Query.OpenStudioName("SubSurface", string.Format("{0}_{1}", aperture.Name, spaceIndex), aperture.Guid).ToUpperInvariant(); + } + + [Test] + public void OneZone_SpaceAndPanelResults_AttachedAndRelated() + { + AnalyticalModel analyticalModel = AnalyticalModelFixtures.SingleBox(); + AdjacencyCluster adjacencyCluster = new AdjacencyCluster(analyticalModel.AdjacencyCluster); + Space space = adjacencyCluster.GetSpaces().Single(); + List panels = adjacencyCluster.GetPanels(); + + string sqlPath = CreateResultsSql( + "c5_addresults_onezone.sql", + new[] { (ZoneName(space), IdealLoadsKey(space), 20.0, 60.0) }, + panels.Select((p, i) => (SurfaceName(p, 0), 20.0 - i, 1)).ToArray(), + 3_600_000.0, 7_200_000.0, false); + + List results = Modify.AddResults(adjacencyCluster, sqlPath, out List diagnostics); + + List spaceResults = results.FindAll(x => x is SpaceSimulationResult); + List panelResults = results.FindAll(x => x is SurfaceSimulationResult); + Assert.That(spaceResults.Count, Is.EqualTo(2), "Heating + cooling per-LoadType space results: " + string.Join(" | ", diagnostics)); + Assert.That(panelResults.Count, Is.EqualTo(panels.Count), "One surface result per engine surface"); + + foreach (Result result in spaceResults) + { + List related = adjacencyCluster.GetResults(space); + Assert.That(related.Any(x => x.Guid == result.Guid), Is.True, "Space relation attached for " + result.Name); + } + + foreach (Panel panel in panels) + { + List related = adjacencyCluster.GetResults(panel); + Assert.That(related, Is.Not.Null.And.Count.EqualTo(1), $"Panel {panel.Name} keeps its own surface result (Guid mapping, not display name)"); + } + + SpaceSimulationResult heating = spaceResults.Cast().Single(x => x.TryGetValue(Analytical.SpaceSimulationResultParameter.LoadType, out string loadType) && loadType == LoadType.Heating.ToString()); + Assert.That(heating.TryGetValue(Analytical.SpaceSimulationResultParameter.Load, out double load), Is.True); + Assert.That(load, Is.GreaterThan(0), "Peak heating load present [W]"); + Assert.That(heating.TryGetValue(Analytical.SpaceSimulationResultParameter.LoadIndex, out double loadIndex), Is.True); + Assert.That(loadIndex, Is.EqualTo(9), "Peak at hour 10 -> interval index 9"); + Assert.That(heating.TryGetValue(Analytical.SpaceSimulationResultParameter.UnmetHours, out double unmet), Is.True); + Assert.That(unmet, Is.EqualTo(1.0).Within(1e-9)); + + Assert.That(diagnostics.Count(d => d.Contains("matched no SAM")), Is.EqualTo(0), "Every SQL name resolved: " + string.Join(" | ", diagnostics)); + } + + [Test] + public void SubSurfaceResults_AttachToHostPanel() + { + // Human-Rhino validation: every window row of the live eplusout.sql + // (SAM_SUBSURFACE__) was reported as "matched no SAM panel; left + // unattached" — the EnergyPlus Surfaces table lists subsurfaces alongside base + // surfaces, and a subsurface carries the APERTURE Guid, which no panel Guid can + // ever equal. The window result belongs to the panel hosting the aperture. + AnalyticalModel analyticalModel = AnalyticalModelFixtures.SingleBox(); + AdjacencyCluster adjacencyCluster = new AdjacencyCluster(analyticalModel.AdjacencyCluster); + Space space = adjacencyCluster.GetSpaces().Single(); + List panels = adjacencyCluster.GetPanels(); + Panel glazedPanel = panels.Single(x => x.HasApertures); + Aperture aperture = glazedPanel.Apertures.Single(); + + List<(string SurfaceName, double Area, int ZoneIndex)> surfaces = panels.Select((p, i) => (SurfaceName(p, 0), 20.0 - i, 1)).ToList(); + surfaces.Add((SubSurfaceName(aperture, 0), 2.64, 1)); + + string sqlPath = CreateResultsSql( + "c5_addresults_subsurface.sql", + new[] { (ZoneName(space), IdealLoadsKey(space), 20.0, 60.0) }, + surfaces, + 3_600_000.0, 7_200_000.0, false); + + List results = Modify.AddResults(adjacencyCluster, sqlPath, out List diagnostics); + + Assert.That(diagnostics.Where(d => d.Contains("matched no SAM panel")), Is.Empty, "A window row is not an orphan: " + string.Join(" | ", diagnostics)); + + List glazedResults = adjacencyCluster.GetResults(glazedPanel); + Assert.That(glazedResults, Is.Not.Null.And.Count.EqualTo(2), "The host panel keeps its own opaque surface result AND the hosted window result"); + Assert.That(glazedResults.Any(x => x.Name == SubSurfaceName(aperture, 0)), Is.True, "The window result is related to the panel hosting the aperture, its SQL identity preserved"); + + // Never leaks onto a neighbouring panel: only the host receives it. + foreach (Panel panel in panels.Where(x => !x.HasApertures)) + { + Assert.That(adjacencyCluster.GetResults(panel), Is.Not.Null.And.Count.EqualTo(1), $"Panel {panel.Name} keeps only its own surface result"); + } + + Assert.That(results.Count(x => x is SurfaceSimulationResult), Is.EqualTo(panels.Count + 1), "One result per engine surface, subsurfaces included"); + } + + [Test] + public void SubSurfaceResult_UnknownAperture_StillResolvesThroughItsHostSurface() + { + // Second Rhino validation round: one window of twelve still reported "matched no SAM + // panel" because its aperture Guid was not in the cluster the results were attached + // to (apertures are re-created - trimmed, merged, re-hosted - so a Guid that existed + // at conversion time need not survive). EnergyPlus records the base surface each + // subsurface sits in, and THAT name carries the panel Guid, so the window resolves + // regardless of what happened to the aperture. + AnalyticalModel analyticalModel = AnalyticalModelFixtures.SingleBox(); + AdjacencyCluster adjacencyCluster = new AdjacencyCluster(analyticalModel.AdjacencyCluster); + Space space = adjacencyCluster.GetSpaces().Single(); + List panels = adjacencyCluster.GetPanels(); + Panel glazedPanel = panels.Single(x => x.HasApertures); + + // A subsurface whose Guid suffix belongs to no SAM object at all, hosted by the + // glazed panel's engine surface (SurfaceIndex 1 in the list below). + int hostIndex = panels.IndexOf(glazedPanel) + 1; + List<(string SurfaceName, double Area, int ZoneIndex)> surfaces = panels.Select((p, i) => (SurfaceName(p, 0), 20.0 - i, 1)).ToList(); + surfaces.Add(("SAM_SUBSURFACE_ORPHANED_GLZ_0_6F64626E", 2.64, 1)); + + string sqlPath = CreateResultsSql( + "c5_addresults_orphaned_subsurface.sql", + new[] { (ZoneName(space), IdealLoadsKey(space), 20.0, 60.0) }, + surfaces, + 3_600_000.0, 7_200_000.0, false, + hostSurfaceIndexes: new Dictionary { { surfaces.Count, hostIndex } }); + + Modify.AddResults(adjacencyCluster, sqlPath, out List diagnostics); + + Assert.That(diagnostics.Where(d => d.Contains("matched no SAM panel")), Is.Empty, "The host surface resolves the window even with an unknown aperture: " + string.Join(" | ", diagnostics)); + + List glazedResults = adjacencyCluster.GetResults(glazedPanel); + Assert.That(glazedResults, Is.Not.Null.And.Count.EqualTo(2), "The host panel keeps its own surface result AND the orphaned window"); + SurfaceSimulationResult window = glazedResults.Single(x => x.Name == "SAM_SUBSURFACE_ORPHANED_GLZ_0_6F64626E"); + Assert.That(window.TryGetValue(SurfaceSimulationResultParameter.HostSurfaceName, out string hostSurfaceName), Is.True); + Assert.That(hostSurfaceName, Is.EqualTo(SurfaceName(glazedPanel, 0)), "The EnergyPlus host link is recorded on the result"); + } + + [Test] + public void Results_Reference_CarriesTheMatchedSamGuid() + { + // Requested after the Rhino review: a consumer holding only the result list must be + // able to map back to the model, so Reference carries the SAM Space / Panel Guid. + // The engine identity it replaces stays available as parameters. + AnalyticalModel analyticalModel = AnalyticalModelFixtures.SingleBox(); + AdjacencyCluster adjacencyCluster = new AdjacencyCluster(analyticalModel.AdjacencyCluster); + Space space = adjacencyCluster.GetSpaces().Single(); + List panels = adjacencyCluster.GetPanels(); + + string sqlPath = CreateResultsSql( + "c5_addresults_reference.sql", + new[] { (ZoneName(space), IdealLoadsKey(space), 20.0, 60.0) }, + panels.Select((p, i) => (SurfaceName(p, 0), 20.0 - i, 1)).ToArray(), + 3_600_000.0, 7_200_000.0, true); + + List results = Modify.AddResults(adjacencyCluster, sqlPath, out List diagnostics); + + // Both space families - annual (named after the SAM space) and design-day (named + // after the EnergyPlus zone) - now reference the same SAM Space Guid. + List spaceResults = results.OfType().ToList(); + Assert.That(spaceResults, Is.Not.Empty); + Assert.That(spaceResults.Select(x => x.Name).Distinct().Count(), Is.EqualTo(2), "The two families keep their own names (SAM space vs EnergyPlus zone)"); + Assert.That(spaceResults.All(x => x.Reference == space.Guid.ToString("N")), Is.True, "Every space result references the SAM Space Guid: " + string.Join(" | ", spaceResults.Select(x => x.Name + "=" + x.Reference))); + + SpaceSimulationResult designDayResult = spaceResults.First(x => x.TryGetValue(Analytical.SpaceSimulationResultParameter.DesignLoad, out double _)); + Assert.That(designDayResult.TryGetValue(SpaceSimulationResultParameter.ZoneIndex, out int zoneIndex), Is.True, "The SQL ZoneIndex survives the Reference change"); + Assert.That(zoneIndex, Is.EqualTo(1)); + Assert.That(designDayResult.TryGetValue(SpaceSimulationResultParameter.ZoneName, out string zoneName), Is.True); + Assert.That(zoneName, Is.EqualTo(ZoneName(space))); + + foreach (Panel panel in panels) + { + SurfaceSimulationResult surfaceResult = adjacencyCluster.GetResults(panel).Single(); + Assert.That(surfaceResult.Reference, Is.EqualTo(panel.Guid.ToString("N")), $"Panel {panel.Name} result references the SAM Panel Guid"); + Assert.That(surfaceResult.TryGetValue(SurfaceSimulationResultParameter.SurfaceIndex, out int surfaceIndex), Is.True, "The SQL SurfaceIndex survives the Reference change"); + Assert.That(surfaceIndex, Is.EqualTo(panels.IndexOf(panel) + 1)); + } + + // Rebuilding through JSON must not lose anything already asserted elsewhere. + SpaceSimulationResult annual = spaceResults.First(x => x.TryGetValue(Analytical.SpaceSimulationResultParameter.LoadIndex, out double _)); + Assert.That(annual.Source, Is.EqualTo(Query.Source()), "Source survives"); + Assert.That(annual.TryGetValue(Analytical.SpaceSimulationResultParameter.UnmetHours, out double unmet), Is.True, "Parameters survive"); + Assert.That(unmet, Is.EqualTo(1.0).Within(1e-9)); + } + + [Test] + public void TwoZones_InternalPanels_KeepSourceIdentity() + { + AnalyticalModel analyticalModel = AnalyticalModelFixtures.TwoAdjacentBoxes(); + AdjacencyCluster adjacencyCluster = new AdjacencyCluster(analyticalModel.AdjacencyCluster); + List spaces = adjacencyCluster.GetSpaces(); + Space spaceA = spaces.Single(x => x.Name == "Space A"); + Space spaceB = spaces.Single(x => x.Name == "Space B"); + List panels = adjacencyCluster.GetPanels(); + Panel sharedWall = panels.Single(x => x.PanelType == PanelType.WallInternal); + + // The shared wall appears as TWO engine surfaces (one per zone), like EnergyPlus + // writes it; everything else appears once. + List<(string SurfaceName, double Area, int ZoneIndex)> surfaces = new List<(string, double, int)>(); + foreach (Panel panel in panels) + { + if (panel == sharedWall) + { + surfaces.Add((SurfaceName(panel, 0), 12.0, 1)); + surfaces.Add((SurfaceName(panel, 1), 12.0, 2)); + } + else + { + surfaces.Add((SurfaceName(panel, 0), 10.0, adjacencyCluster.GetPanels(spaceA).Any(x => x.Guid == panel.Guid) ? 1 : 2)); + } + } + + string sqlPath = CreateResultsSql( + "c5_addresults_twozones.sql", + new[] { (ZoneName(spaceA), IdealLoadsKey(spaceA), 20.0, 60.0), (ZoneName(spaceB), IdealLoadsKey(spaceB), 20.0, 60.0) }, + surfaces, + 3_600_000.0, 7_200_000.0, false); + + List results = Modify.AddResults(adjacencyCluster, sqlPath, out List diagnostics); + + foreach (Space space in spaces) + { + List related = adjacencyCluster.GetResults(space); + Assert.That(related, Is.Not.Null.And.Count.EqualTo(2), $"Space '{space.Name}' receives its own heating+cooling results"); + } + + List sharedWallResults = adjacencyCluster.GetResults(sharedWall); + Assert.That(sharedWallResults, Is.Not.Null.And.Count.EqualTo(2), "An internal panel represented by two engine surfaces receives two results, never a collision"); + Assert.That(sharedWallResults.All(x => x.Reference == sharedWall.Guid.ToString("N")), Is.True, "Both engine surfaces reference the one SAM panel they belong to"); + Assert.That(sharedWallResults.Select(x => x.GetValue(SurfaceSimulationResultParameter.SurfaceIndex)).Distinct().Count(), Is.EqualTo(2), "Engine-surface identity is retained per result (SQL SurfaceIndex), values never summed"); + + // No result related to the wrong space: B-side results must not relate to A. + List resultsA = adjacencyCluster.GetResults(spaceA); + Assert.That(resultsA.All(x => x.Reference == spaceA.Guid.ToString("N")), Is.True, "Space A carries only its own results"); + } + + [Test] + public void DuplicateSanitizedNames_GuidMappingStaysCorrect() + { + // Two spaces whose names sanitize identically; only the Guid suffix separates them. + AnalyticalModel analyticalModel = AnalyticalModelFixtures.TwoAdjacentBoxes(); + AdjacencyCluster renamedCluster = new AdjacencyCluster(analyticalModel.AdjacencyCluster); + List renamedSpaces = renamedCluster.GetSpaces(); + Space spaceA = renamedSpaces.Single(x => x.Name == "Space A"); + Space spaceB = renamedSpaces.Single(x => x.Name == "Space B"); + spaceB.Name = "Space A"; + + string sqlPath = CreateResultsSql( + "c5_addresults_dupnames.sql", + new[] { (ZoneName(spaceA), IdealLoadsKey(spaceA), 20.0, 60.0), (ZoneName(spaceB), IdealLoadsKey(spaceB), 20.0, 60.0) }, + Array.Empty<(string, double, int)>(), + 3_600_000.0, 7_200_000.0, false); + + Modify.AddResults(renamedCluster, sqlPath, out List diagnostics); + + foreach (Space space in renamedSpaces) + { + List related = renamedCluster.GetResults(space); + Assert.That(related, Is.Not.Null.And.Count.EqualTo(2), $"Guid mapping holds under duplicate display names ({space.Guid.ToString("N").Substring(0, 8)})"); + Assert.That(related.All(x => x.Reference == space.Guid.ToString("N")), Is.True); + } + } + + [Test] + public void ZeroResult_IsValid_MissingResult_IsDiagnosed() + { + AnalyticalModel analyticalModel = AnalyticalModelFixtures.TwoAdjacentBoxes(); + AdjacencyCluster adjacencyCluster = new AdjacencyCluster(analyticalModel.AdjacencyCluster); + List spaces = adjacencyCluster.GetSpaces(); + Space spaceA = spaces.Single(x => x.Name == "Space A"); + Space spaceB = spaces.Single(x => x.Name == "Space B"); + + // Only zone A is in the SQL; B is genuinely missing (not zero). + string sqlPath = CreateResultsSql( + "c5_addresults_zeromissing.sql", + new[] { (ZoneName(spaceA), IdealLoadsKey(spaceA), 20.0, 60.0) }, + Array.Empty<(string, double, int)>(), + 3_600_000.0, 0.0, false, 0.0); + + List results = Modify.AddResults(adjacencyCluster, sqlPath, out List diagnostics); + + SpaceSimulationResult cooling = adjacencyCluster.GetResults(spaceA).Single(x => x.TryGetValue(Analytical.SpaceSimulationResultParameter.LoadType, out string loadType) && loadType == LoadType.Cooling.ToString()); + Assert.That(cooling.TryGetValue(Analytical.SpaceSimulationResultParameter.Load, out double load), Is.True); + Assert.That(load, Is.EqualTo(0.0), "A genuine zero peak stays a valid result"); + + Assert.That(adjacencyCluster.GetResults(spaceB), Is.Null.Or.Empty, "Space B is not in the SQL — no fabricated result"); + Assert.That(diagnostics.Any(d => d.Contains("No simulation result found for space") && d.Contains(spaceB.Guid.ToString("N").Substring(0, 8).ToUpperInvariant())), Is.True, "The missing result is diagnosed: " + string.Join(" | ", diagnostics)); + } + + [Test] + public void Rerun_NoDuplicateResults() + { + AnalyticalModel analyticalModel = AnalyticalModelFixtures.SingleBox(); + AdjacencyCluster adjacencyCluster = new AdjacencyCluster(analyticalModel.AdjacencyCluster); + Space space = adjacencyCluster.GetSpaces().Single(); + List panels = adjacencyCluster.GetPanels(); + + string sqlPath = CreateResultsSql( + "c5_addresults_rerun.sql", + new[] { (ZoneName(space), IdealLoadsKey(space), 20.0, 60.0) }, + panels.Select((p, i) => (SurfaceName(p, 0), 20.0 - i, 1)).ToArray(), + 3_600_000.0, 7_200_000.0, false); + + Modify.AddResults(adjacencyCluster, sqlPath, out _); + Modify.AddResults(adjacencyCluster, sqlPath, out _); + + Assert.That(adjacencyCluster.GetResults().Count, Is.EqualTo(2), "Rerunning must not duplicate space results"); + Assert.That(adjacencyCluster.GetResults().Count, Is.EqualTo(panels.Count), "Rerunning must not duplicate surface results"); + } + + [Test] + public void DesignDayPlusAnnualSql_AnnualResultsExcludeSizingPeriods() + { + AnalyticalModel analyticalModel = AnalyticalModelFixtures.SingleBox(); + AdjacencyCluster adjacencyCluster = new AdjacencyCluster(analyticalModel.AdjacencyCluster); + Space space = adjacencyCluster.GetSpaces().Single(); + + string sqlPath = CreateResultsSql( + "c5_addresults_designday.sql", + new[] { (ZoneName(space), IdealLoadsKey(space), 20.0, 60.0) }, + Array.Empty<(string, double, int)>(), + 3_600_000.0, 7_200_000.0, true); + + Modify.AddResults(adjacencyCluster, sqlPath, out List diagnostics); + + List related = adjacencyCluster.GetResults(space); + Assert.That(related, Is.Not.Null.And.Count.EqualTo(4), "Annual heating/cooling + design-day heating/cooling: " + string.Join(" | ", related.Select(x => x.Name))); + + // The annual family peaks come from the annual environment only (hour 10), never + // from the sizing environments — the C5 reader filters EnvironmentType 3. + SpaceSimulationResult annualHeating = related.Single(x => x.TryGetValue(Analytical.SpaceSimulationResultParameter.LoadType, out string lt) && lt == LoadType.Heating.ToString() && x.TryGetValue(Analytical.SpaceSimulationResultParameter.LoadIndex, out _)); + Assert.That(annualHeating.TryGetValue(Analytical.SpaceSimulationResultParameter.LoadIndex, out double loadIndex), Is.True); + Assert.That(loadIndex, Is.EqualTo(9), "Annual peak hour is not contaminated by the design-day environments"); + + // The design-day family carries the ZoneSizes design load. + SpaceSimulationResult designDayHeating = related.Single(x => x.TryGetValue(Analytical.SpaceSimulationResultParameter.LoadType, out string lt) && lt == LoadType.Heating.ToString() && x.TryGetValue(Analytical.SpaceSimulationResultParameter.DesignLoad, out _)); + Assert.That(designDayHeating.TryGetValue(Analytical.SpaceSimulationResultParameter.DesignLoad, out double designLoad), Is.True); + Assert.That(designLoad, Is.EqualTo(1000.0).Within(1e-6), "ZoneSizes design load mapped (3.6 MJ / 3600 s)"); + } + + [Test] + public void SaveReload_ResultsStayAttached() + { + AnalyticalModel analyticalModel = AnalyticalModelFixtures.SingleBox(); + AdjacencyCluster adjacencyCluster = new AdjacencyCluster(analyticalModel.AdjacencyCluster); + Space space = adjacencyCluster.GetSpaces().Single(); + List panels = adjacencyCluster.GetPanels(); + + string sqlPath = CreateResultsSql( + "c5_addresults_savereload.sql", + new[] { (ZoneName(space), IdealLoadsKey(space), 20.0, 60.0) }, + panels.Select((p, i) => (SurfaceName(p, 0), 20.0 - i, 1)).ToArray(), + 3_600_000.0, 7_200_000.0, false); + + Modify.AddResults(adjacencyCluster, sqlPath, out _); + AnalyticalModel withResults = new AnalyticalModel(analyticalModel, adjacencyCluster); + + Assert.That(withResults.AdjacencyCluster.GetResults()?.Count ?? 0, Is.EqualTo(2), "Space results attached before serialization"); + Assert.That(withResults.GetResults(withResults.AdjacencyCluster.GetSpaces().Single())?.Count ?? 0, Is.EqualTo(2), "Relations attached before serialization"); + + string json = Core.Convert.ToString(withResults); + AnalyticalModel reloaded = Core.Convert.ToSAM(json)?.FirstOrDefault(); + Assert.That(reloaded, Is.Not.Null, "The model round-trips through SAM JSON"); + + Space reloadedSpace = reloaded.AdjacencyCluster.GetSpaces().Single(); + Assert.That(reloaded.AdjacencyCluster.GetResults(reloadedSpace), Is.Not.Null.And.Count.EqualTo(2), "Space results survive serialization"); + Assert.That(reloaded.AdjacencyCluster.GetResults().Count, Is.EqualTo(panels.Count), "Surface results survive serialization"); + } + + [Test] + public void RealSqlFixture_SpaceAndSurfaceResults_NoThrow() + { + // Human-validation fixture (not committed): the annual-only eplusout.sql that + // produced empty spaceSimulationResults/panelSimulationResults in Grasshopper. + string sqlPath = System.Environment.GetEnvironmentVariable("SAM_OPENSTUDIO_TEST_SQL"); + if (string.IsNullOrWhiteSpace(sqlPath)) + { + string candidate = Path.GetFullPath(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "..", "..", "..", "resources", "sql", "eplusout.sql")); + if (File.Exists(candidate)) + { + sqlPath = candidate; + } + } + + if (string.IsNullOrWhiteSpace(sqlPath) || !File.Exists(sqlPath)) + { + Assert.Ignore("Real SQL fixture not present (set SAM_OPENSTUDIO_TEST_SQL or tests/resources/sql/eplusout.sql)"); + } + + AnalyticalModel analyticalModel = AnalyticalModelFixtures.SingleBox(); + AdjacencyCluster adjacencyCluster = new AdjacencyCluster(analyticalModel.AdjacencyCluster); + + List results = null; + List diagnostics = null; + Assert.DoesNotThrow(() => results = Modify.AddResults(adjacencyCluster, sqlPath, out diagnostics)); + + Assert.That(results, Is.Not.Null); + Assert.That(results.Count(x => x is SurfaceSimulationResult), Is.EqualTo(6), "The fixture's six engine surfaces produce surface results (the base list must survive an annual-only SQL)"); + Assert.That(results.Count(x => x is SpaceSimulationResult), Is.EqualTo(0), "The fixture model does not correspond to the SQL — nothing is fabricated"); + Assert.That(diagnostics.Any(d => d.Contains("matched no SAM space")), Is.True, "The unmatched SQL zone is named"); + TestContext.Out.WriteLine(string.Join("\n", diagnostics)); + } + + [Test] + public void ComponentPath_AnalyticalModelInput_IsNotMutated() + { + // The Grasshopper contract: the input model's own cluster must stay result-free. + AnalyticalModel analyticalModel = AnalyticalModelFixtures.SingleBox(); + AdjacencyCluster clonedCluster = new AdjacencyCluster(analyticalModel.AdjacencyCluster); + Space space = clonedCluster.GetSpaces().Single(); + + string sqlPath = CreateResultsSql( + "c5_addresults_nonmutating.sql", + new[] { (ZoneName(space), IdealLoadsKey(space), 20.0, 60.0) }, + Array.Empty<(string, double, int)>(), + 3_600_000.0, 7_200_000.0, false); + + Modify.AddResults(clonedCluster, sqlPath, out _); + AnalyticalModel returned = new AnalyticalModel(analyticalModel, clonedCluster); + + Assert.That(analyticalModel.AdjacencyCluster.GetResults(), Is.Null.Or.Empty, "The source model was not mutated"); + Assert.That(returned.AdjacencyCluster.GetResults().Count, Is.EqualTo(2), "The returned model carries the results"); + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/C5/EnergyPlusTimestampTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/C5/EnergyPlusTimestampTests.cs new file mode 100644 index 0000000..f5f7f07 --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/C5/EnergyPlusTimestampTests.cs @@ -0,0 +1,359 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Data; +using System.IO; +using System.Linq; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// Human-Rhino validation, fix 2: EnergyPlus SQL Time rows use the end-of-interval + /// convention (hour 0–24, minute 0–60, year 0 on sizing environments) and must be + /// normalised centrally — never passed raw into a DateTime constructor. Reproduces the + /// Grasshopper "Hour, Minute, and Second parameters describe an un-representable DateTime" + /// failure (live SQL carries hour-0 sub-hourly rows and hour-24 rows) and pins the + /// day/month/year rollover behaviour of the normalisation helper. + /// + [TestFixture] + public class EnergyPlusTimestampTests + { + [Test] + public void TryGetDateTime_OrdinaryHourlyTimestamp_IsIntervalEnd() + { + Assert.That(Core.Query.TryGetDateTime(2006, 7, 15, 1, 0, 0, 2017, out DateTime dateTime, out string diagnostic), Is.True); + Assert.That(diagnostic, Is.Null); + Assert.That(dateTime, Is.EqualTo(new DateTime(2006, 7, 15, 1, 0, 0)), "Hour 1 minute 0 is the end of the first hourly interval"); + } + + [Test] + public void TryGetDateTime_Hour24_RollsToNextDay() + { + Assert.That(Core.Query.TryGetDateTime(2006, 1, 1, 24, 0, 0, 2017, out DateTime dateTime, out _), Is.True); + Assert.That(dateTime, Is.EqualTo(new DateTime(2006, 1, 2, 0, 0, 0)), "24:00 is midnight at the end of the day, never clamped to 23:00"); + } + + [Test] + public void TryGetDateTime_Minute60_RollsToNextHour() + { + Assert.That(Core.Query.TryGetDateTime(2006, 1, 1, 1, 60, 0, 2017, out DateTime dateTime, out _), Is.True); + Assert.That(dateTime, Is.EqualTo(new DateTime(2006, 1, 1, 2, 0, 0)), "1:60 is the end of hour 2, never clamped to 1:59"); + } + + [Test] + public void TryGetDateTime_Hour24PlusMinute60_RollsToNextDayPlusHour() + { + Assert.That(Core.Query.TryGetDateTime(2006, 1, 1, 24, 60, 0, 2017, out DateTime dateTime, out _), Is.True); + Assert.That(dateTime, Is.EqualTo(new DateTime(2006, 1, 2, 1, 0, 0))); + } + + [Test] + public void TryGetDateTime_Hour0_SubHourlyRow_SameDayEarlyInterval() + { + // Live SQL rows: timestep data starts the day at Hour = 0 (00:10 … 00:50). + Assert.That(Core.Query.TryGetDateTime(2006, 1, 1, 0, 10, 0, 2017, out DateTime dateTime, out _), Is.True); + Assert.That(dateTime, Is.EqualTo(new DateTime(2006, 1, 1, 0, 10, 0)), "The hour-0 sub-hourly row that threw the Grasshopper exception"); + } + + [Test] + public void TryGetDateTime_Year0_UsesDefaultYear_SizingEnvironment() + { + Assert.That(Core.Query.TryGetDateTime(0, 1, 21, 13, 0, 0, 2017, out DateTime dateTime, out _), Is.True); + Assert.That(dateTime, Is.EqualTo(new DateTime(2017, 1, 21, 13, 0, 0)), "Sizing/design-day environments write Year = 0"); + } + + [Test] + public void TryGetDateTime_February28_Valid() + { + Assert.That(Core.Query.TryGetDateTime(2017, 2, 28, 24, 0, 0, 2017, out DateTime dateTime, out _), Is.True); + Assert.That(dateTime, Is.EqualTo(new DateTime(2017, 3, 1, 0, 0, 0)), "Non-leap February rolls into March"); + } + + [Test] + public void TryGetDateTime_February29_LeapYear_Valid() + { + Assert.That(Core.Query.TryGetDateTime(2020, 2, 29, 24, 0, 0, 2017, out DateTime dateTime, out _), Is.True); + Assert.That(dateTime, Is.EqualTo(new DateTime(2020, 3, 1, 0, 0, 0)), "Leap-day 24:00 rolls into March of the leap year"); + } + + [Test] + public void TryGetDateTime_February29_NonLeapCalendar_DiagnosticNotException() + { + Assert.That(Core.Query.TryGetDateTime(2017, 2, 29, 12, 0, 0, 2017, out _, out string diagnostic), Is.False); + Assert.That(diagnostic, Does.Contain("2017").And.Contain("leap"), "The diagnostic names the calendar conflict"); + } + + [Test] + public void TryGetDateTime_February29_Year0NonLeapDefault_DiagnosticNotException() + { + Assert.That(Core.Query.TryGetDateTime(0, 2, 29, 12, 0, 0, 2017, out _, out string diagnostic), Is.False); + Assert.That(diagnostic, Is.Not.Null); + } + + [Test] + public void TryGetDateTime_December31_FinalTimestep_RollsYear() + { + Assert.That(Core.Query.TryGetDateTime(2006, 12, 31, 24, 0, 0, 2017, out DateTime dateTime, out _), Is.True); + Assert.That(dateTime, Is.EqualTo(new DateTime(2007, 1, 1, 0, 0, 0)), "The year's final interval ends on 1 Jan of the next year"); + } + + [Test] + public void TryGetDateTime_Month0_WarmupRow_DiagnosticNotException() + { + Assert.That(Core.Query.TryGetDateTime(2006, 0, 1, 1, 0, 0, 2017, out _, out string diagnostic), Is.False); + Assert.That(diagnostic, Is.Not.Null); + } + + [Test] + public void IntervalHourOfYear_MatchesLegacyHourlyConvention() + { + Assert.That(Core.Query.IntervalHourOfYear(new DateTime(2006, 1, 1, 1, 0, 0)), Is.EqualTo(0), "End of interval 0"); + Assert.That(Core.Query.IntervalHourOfYear(new DateTime(2006, 1, 2, 0, 0, 0)), Is.EqualTo(23), "24:00 ends interval 23"); + Assert.That(Core.Query.IntervalHourOfYear(new DateTime(2006, 12, 31, 23, 0, 0)), Is.EqualTo(8758)); + Assert.That(Core.Query.IntervalHourOfYear(new DateTime(2007, 1, 1, 0, 0, 0)), Is.EqualTo(8759), "Dec 31 24:00 (normalised to 1 Jan) ends interval 8759"); + } + + [Test] + public void TimeIndexDictionary_LiveEdgeRows_NoThrow_NoCollapsedTimestamps() + { + // Mirrors the live eplusout.sql Time table: sub-hourly hour-0 rows, hour-24 rows + // and the duplicate hour-boundary rows EnergyPlus writes per reporting frequency. + DataTable dataTable = new DataTable(); + dataTable.Columns.Add("TimeIndex", typeof(int)); + dataTable.Columns.Add("Year", typeof(int)); + dataTable.Columns.Add("Month", typeof(int)); + dataTable.Columns.Add("Day", typeof(int)); + dataTable.Columns.Add("Hour", typeof(int)); + dataTable.Columns.Add("Minute", typeof(int)); + dataTable.Columns.Add("Dst", typeof(int)); + dataTable.Columns.Add("EnvironmentPeriodIndex", typeof(int)); + + void Row(int timeIndex, int hour, int minute) + { + dataTable.Rows.Add(timeIndex, 2006, 1, 1, hour, minute, 0, 1); + } + + Row(1, 0, 10); + Row(2, 0, 20); + Row(3, 0, 30); + Row(4, 0, 40); + Row(5, 0, 50); + Row(6, 1, 0); + Row(7, 1, 0); // duplicate hour-boundary row (timestep + hourly frequencies) + Row(8, 24, 0); + + List diagnostics = new List(); + SortedDictionary result = Core.OpenStudio.Query.TimeIndexDictionary(dataTable, 1, 2017, diagnostics); + + Assert.That(result, Is.Not.Null); + Assert.That(result.Count, Is.EqualTo(8), "Every TimeIndex survives — duplicates are keyed by index, never collapsed"); + Assert.That(result[1], Is.EqualTo(new DateTime(2006, 1, 1, 0, 10, 0))); + Assert.That(result[6], Is.EqualTo(new DateTime(2006, 1, 1, 1, 0, 0))); + Assert.That(result[8], Is.EqualTo(new DateTime(2006, 1, 2, 0, 0, 0)), "Hour 24 rolls into the next day"); + Assert.That(diagnostics, Is.Empty); + } + + [Test] + public void TimeIndexDictionary_MalformedRows_SkippedWithDiagnostics() + { + DataTable dataTable = new DataTable(); + dataTable.Columns.Add("TimeIndex", typeof(int)); + dataTable.Columns.Add("Year", typeof(int)); + dataTable.Columns.Add("Month", typeof(int)); + dataTable.Columns.Add("Day", typeof(int)); + dataTable.Columns.Add("Hour", typeof(int)); + dataTable.Columns.Add("Minute", typeof(int)); + dataTable.Columns.Add("Dst", typeof(int)); + dataTable.Columns.Add("EnvironmentPeriodIndex", typeof(int)); + + dataTable.Rows.Add(1, 2017, 2, 29, 12, 0, 0, 1); // Feb 29 in a non-leap calendar + dataTable.Rows.Add(2, 2006, 1, 1, 1, 0, 0, 1); + + List diagnostics = new List(); + SortedDictionary result = Core.OpenStudio.Query.TimeIndexDictionary(dataTable, 1, 2017, diagnostics); + + Assert.That(result.Count, Is.EqualTo(1), "The malformed row is skipped, the valid row kept"); + Assert.That(diagnostics.Count, Is.EqualTo(1)); + Assert.That(diagnostics[0], Does.Contain("TimeIndex 1")); + } + + [Test] + public void CreateDesignDays_SizingEnvironment_Reads24HoursAndClassifies() + { + string sqlPath = CreateDesignDaySql("c5_designdays.sql"); + + List designDays = Create.DesignDays(sqlPath, out List diagnostics); + + Assert.That(designDays, Is.Not.Null); + Assert.That(designDays.Count, Is.EqualTo(2), "Only the two sizing environments — the annual environment is not a design day"); + + DesignDay heating = designDays.FirstOrDefault(x => x.Name.IndexOf("HTG", StringComparison.OrdinalIgnoreCase) >= 0); + DesignDay cooling = designDays.FirstOrDefault(x => x.Name.IndexOf("CLG", StringComparison.OrdinalIgnoreCase) >= 0); + Assert.That(heating, Is.Not.Null); + Assert.That(cooling, Is.Not.Null); + Assert.That(heating.Month, Is.EqualTo((byte)1)); + Assert.That(heating.Day, Is.EqualTo((byte)21)); + Assert.That(heating[Weather.WeatherDataType.DryBulbTemperature, 0], Is.EqualTo(-10.0).Within(1e-9)); + Assert.That(heating[Weather.WeatherDataType.DryBulbTemperature, 23], Is.EqualTo(-9.77).Within(1e-9), "Interval-end 24:00 maps to hourly index 23"); + Assert.That(cooling[Weather.WeatherDataType.DryBulbTemperature, 13], Is.EqualTo(33.0).Within(1e-9), "Interval-end 14:00 maps to hourly index 13"); + } + + [Test] + public void CreateDesignDays_AnnualOnlySql_NoThrow_NoDesignDays_StructuredDiagnostic() + { + // The reproduction fixture: an annual-only SQL whose Time table carries the hour-0 + // sub-hourly rows that threw the un-representable DateTime exception. + string sqlPath = CreateAnnualOnlySql("c5_annual_only.sql"); + + List designDays = null; + List diagnostics = null; + Assert.DoesNotThrow(() => designDays = Create.DesignDays(sqlPath, out diagnostics)); + Assert.That(designDays, Is.Not.Null); + Assert.That(designDays.Count, Is.EqualTo(0), "An annual environment is not a design day"); + Assert.That(diagnostics.Any(d => d.Contains("No design-day environments")), Is.True, "The empty result is explained"); + } + + [Test] + public void CreateDesignDays_RealSqlReproductionFixture_NoThrow() + { + // Human-validation fixture (not committed — 30 MB): the annual-only eplusout.sql + // whose hour-0 sub-hourly and hour-24 Time rows threw the un-representable + // DateTime exception in Grasshopper. Drop the file at tests/resources/sql or set + // SAM_OPENSTUDIO_TEST_SQL to run this gate. + string sqlPath = System.Environment.GetEnvironmentVariable("SAM_OPENSTUDIO_TEST_SQL"); + if (string.IsNullOrWhiteSpace(sqlPath)) + { + string candidate = Path.GetFullPath(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "..", "..", "..", "resources", "sql", "eplusout.sql")); + if (File.Exists(candidate)) + { + sqlPath = candidate; + } + } + + if (string.IsNullOrWhiteSpace(sqlPath) || !File.Exists(sqlPath)) + { + Assert.Ignore("Real SQL fixture not present (set SAM_OPENSTUDIO_TEST_SQL or tests/resources/sql/eplusout.sql)"); + } + + List designDays = null; + List diagnostics = null; + Assert.DoesNotThrow(() => designDays = Create.DesignDays(sqlPath, out diagnostics), "The live reproduction fixture must never throw the un-representable DateTime exception"); + Assert.That(designDays, Is.Not.Null); + TestContext.Out.WriteLine($"Design days: {designDays.Count}; diagnostics: {string.Join(" | ", diagnostics)}"); + } + + /// + /// Synthetic SQL with a heating and a cooling sizing environment (EnvironmentType 1, + /// Year = 0, hourly rows ending 01:00…24:00) plus an annual environment that must be + /// ignored. Dry-bulb values encode the hour so interval mapping is provable. + /// + private static string CreateDesignDaySql(string fileName) + { + string sqlPath = Path.Combine(TestContext.CurrentContext.WorkDirectory, fileName); + if (File.Exists(sqlPath)) + { + File.Delete(sqlPath); + } + + using (System.Data.SQLite.SQLiteConnection connection = new System.Data.SQLite.SQLiteConnection("Data Source=" + sqlPath)) + { + connection.Open(); + using (System.Data.SQLite.SQLiteCommand command = connection.CreateCommand()) + { + command.CommandText = "CREATE TABLE EnvironmentPeriods (EnvironmentPeriodIndex INTEGER PRIMARY KEY, EnvironmentName TEXT, EnvironmentType INTEGER)"; + command.ExecuteNonQuery(); + command.CommandText = "CREATE TABLE Time (TimeIndex INTEGER PRIMARY KEY, Year INTEGER, Month INTEGER, Day INTEGER, Hour INTEGER, Minute INTEGER, Dst INTEGER, EnvironmentPeriodIndex INTEGER)"; + command.ExecuteNonQuery(); + command.CommandText = "CREATE TABLE ReportDataDictionary (ReportDataDictionaryIndex INTEGER PRIMARY KEY, KeyValue TEXT, Name TEXT, Units TEXT)"; + command.ExecuteNonQuery(); + command.CommandText = "CREATE TABLE ReportData (ReportDataIndex INTEGER PRIMARY KEY, ReportDataDictionaryIndex INTEGER, TimeIndex INTEGER, Value REAL)"; + command.ExecuteNonQuery(); + + command.CommandText = "INSERT INTO EnvironmentPeriods VALUES (1, 'BOSTON ANN HTG 99.6% CONDNS DB', 1)"; + command.ExecuteNonQuery(); + command.CommandText = "INSERT INTO EnvironmentPeriods VALUES (2, 'BOSTON ANN CLG .4% CONDNS DB=>MWB', 2)"; + command.ExecuteNonQuery(); + command.CommandText = "INSERT INTO EnvironmentPeriods VALUES (3, 'SAM_RUNPERIOD_ANNUAL', 3)"; + command.ExecuteNonQuery(); + command.CommandText = "INSERT INTO ReportDataDictionary VALUES (1, 'Environment', 'Site Outdoor Air Drybulb Temperature', 'C')"; + command.ExecuteNonQuery(); + + int timeIndex = 0; + for (int hour = 1; hour <= 24; hour++) + { + timeIndex++; + command.CommandText = string.Format(System.Globalization.CultureInfo.InvariantCulture, "INSERT INTO Time VALUES ({0}, 0, 1, 21, {1}, 0, 0, 1)", timeIndex, hour); + command.ExecuteNonQuery(); + command.CommandText = string.Format(System.Globalization.CultureInfo.InvariantCulture, "INSERT INTO ReportData VALUES ({0}, 1, {0}, {1})", timeIndex, -10.0 + (hour - 1) * 0.01); + command.ExecuteNonQuery(); + } + + for (int hour = 1; hour <= 24; hour++) + { + timeIndex++; + command.CommandText = string.Format(System.Globalization.CultureInfo.InvariantCulture, "INSERT INTO Time VALUES ({0}, 0, 7, 21, {1}, 0, 0, 2)", timeIndex, hour); + command.ExecuteNonQuery(); + command.CommandText = string.Format(System.Globalization.CultureInfo.InvariantCulture, "INSERT INTO ReportData VALUES ({0}, 1, {0}, {1})", timeIndex, 20.0 + hour - 1); + command.ExecuteNonQuery(); + } + + // A few annual rows including the hour-0 sub-hourly edge — must be ignored + // with the environment, never parsed into a design day. + for (int minute = 10; minute <= 50; minute += 10) + { + timeIndex++; + command.CommandText = string.Format(System.Globalization.CultureInfo.InvariantCulture, "INSERT INTO Time VALUES ({0}, 2006, 1, 1, 0, {1}, 0, 3)", timeIndex, minute); + command.ExecuteNonQuery(); + } + } + } + + return sqlPath; + } + + private static string CreateAnnualOnlySql(string fileName) + { + string sqlPath = Path.Combine(TestContext.CurrentContext.WorkDirectory, fileName); + if (File.Exists(sqlPath)) + { + File.Delete(sqlPath); + } + + using (System.Data.SQLite.SQLiteConnection connection = new System.Data.SQLite.SQLiteConnection("Data Source=" + sqlPath)) + { + connection.Open(); + using (System.Data.SQLite.SQLiteCommand command = connection.CreateCommand()) + { + command.CommandText = "CREATE TABLE EnvironmentPeriods (EnvironmentPeriodIndex INTEGER PRIMARY KEY, EnvironmentName TEXT, EnvironmentType INTEGER)"; + command.ExecuteNonQuery(); + command.CommandText = "CREATE TABLE Time (TimeIndex INTEGER PRIMARY KEY, Year INTEGER, Month INTEGER, Day INTEGER, Hour INTEGER, Minute INTEGER, Dst INTEGER, EnvironmentPeriodIndex INTEGER)"; + command.ExecuteNonQuery(); + command.CommandText = "CREATE TABLE ReportDataDictionary (ReportDataDictionaryIndex INTEGER PRIMARY KEY, KeyValue TEXT, Name TEXT, Units TEXT)"; + command.ExecuteNonQuery(); + command.CommandText = "CREATE TABLE ReportData (ReportDataIndex INTEGER PRIMARY KEY, ReportDataDictionaryIndex INTEGER, TimeIndex INTEGER, Value REAL)"; + command.ExecuteNonQuery(); + + command.CommandText = "INSERT INTO EnvironmentPeriods VALUES (1, 'SAM_RUNPERIOD_ANNUAL', 3)"; + command.ExecuteNonQuery(); + + int timeIndex = 0; + for (int minute = 10; minute <= 50; minute += 10) + { + timeIndex++; + command.CommandText = string.Format(System.Globalization.CultureInfo.InvariantCulture, "INSERT INTO Time VALUES ({0}, 2006, 1, 1, 0, {1}, 0, 1)", timeIndex, minute); + command.ExecuteNonQuery(); + } + + timeIndex++; + command.CommandText = string.Format(System.Globalization.CultureInfo.InvariantCulture, "INSERT INTO Time VALUES ({0}, 2006, 1, 1, 24, 0, 0, 1)", timeIndex); + command.ExecuteNonQuery(); + } + } + + return sqlPath; + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/C5/LeapYearIndexingTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/C5/LeapYearIndexingTests.cs new file mode 100644 index 0000000..6a52123 --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/C5/LeapYearIndexingTests.cs @@ -0,0 +1,130 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// Review P1-03: the SQL hour-of-year computation used a fixed non-leap reference year, so + /// in a leap-year run every Feb 29 row clamped onto Feb 28 (duplicate hour indices — the + /// coincident peak double-counts) and every date after February landed one day early. + /// Synthetic EnergyPlus-schema SQLite exercises the internal reader directly. + /// + [TestFixture] + public class LeapYearIndexingTests + { + private const string VariableName = "Zone Ideal Loads Supply Air Total Heating Energy"; + private const string KeyName = "ZONE LEAP"; + + /// + /// Minimal EnergyPlus-schema SQL: one hourly variable for one zone over the given + /// (month, day, hour) rows, all in the annual weather environment (EnvironmentType 3). + /// Values encode the row order (1-based) so indices can be traced back. + /// + private static string CreateSql(string fileName, List<(int Month, int Day, int Hour)> rows) + { + string sqlPath = Path.Combine(TestContext.CurrentContext.WorkDirectory, fileName); + if (File.Exists(sqlPath)) + { + File.Delete(sqlPath); + } + + using (System.Data.SQLite.SQLiteConnection connection = new System.Data.SQLite.SQLiteConnection("Data Source=" + sqlPath)) + { + connection.Open(); + using (System.Data.SQLite.SQLiteCommand command = connection.CreateCommand()) + { + command.CommandText = "CREATE TABLE ReportDataDictionary (ReportDataDictionaryIndex INTEGER PRIMARY KEY, Name TEXT, KeyValue TEXT)"; + command.ExecuteNonQuery(); + command.CommandText = "CREATE TABLE ReportData (ReportDataIndex INTEGER PRIMARY KEY, ReportDataDictionaryIndex INTEGER, TimeIndex INTEGER, Value REAL)"; + command.ExecuteNonQuery(); + command.CommandText = "CREATE TABLE Time (TimeIndex INTEGER PRIMARY KEY, Month INTEGER, Day INTEGER, Hour INTEGER, EnvironmentPeriodIndex INTEGER)"; + command.ExecuteNonQuery(); + command.CommandText = "CREATE TABLE EnvironmentPeriods (EnvironmentPeriodIndex INTEGER PRIMARY KEY, EnvironmentName TEXT, EnvironmentType INTEGER)"; + command.ExecuteNonQuery(); + + command.CommandText = "INSERT INTO EnvironmentPeriods VALUES (1, 'ANNUAL', 3)"; + command.ExecuteNonQuery(); + command.CommandText = "INSERT INTO ReportDataDictionary VALUES (1, @name, @key)"; + command.Parameters.AddWithValue("@name", VariableName); + command.Parameters.AddWithValue("@key", KeyName); + command.ExecuteNonQuery(); + + int timeIndex = 0; + foreach ((int month, int day, int hour) in rows) + { + timeIndex++; + command.Parameters.Clear(); + command.CommandText = string.Format(System.Globalization.CultureInfo.InvariantCulture, "INSERT INTO Time VALUES ({0}, {1}, {2}, {3}, 1)", timeIndex, month, day, hour); + command.ExecuteNonQuery(); + command.CommandText = string.Format(System.Globalization.CultureInfo.InvariantCulture, "INSERT INTO ReportData VALUES ({0}, 1, {0}, {1})", timeIndex, (double)timeIndex); + command.ExecuteNonQuery(); + } + } + } + + return sqlPath; + } + + [Test] + public void LeapYearSql_Feb29GetsOwnHourIndices_NoDuplicates() + { + // Feb 28 (24 h) + Feb 29 (24 h) + Mar 1 hour 1 + Dec 31 hour 24 of a leap year. + List<(int, int, int)> rows = new List<(int, int, int)>(); + for (int hour = 1; hour <= 24; hour++) + { + rows.Add((2, 28, hour)); + } + + for (int hour = 1; hour <= 24; hour++) + { + rows.Add((2, 29, hour)); + } + + rows.Add((3, 1, 1)); + rows.Add((12, 31, 24)); + + string sqlPath = CreateSql("c5_leap_year.sql", rows); + Dictionary>> series = OpenStudioSimulationRunner.ReadHourlyValueSeries(sqlPath, VariableName); + + Assert.That(series, Is.Not.Null); + Assert.That(series.ContainsKey(KeyName), Is.True); + + List> points = series[KeyName]; + Assert.That(points.Count, Is.EqualTo(50)); + + List indices = points.Select(x => x.Key).ToList(); + Assert.That(indices.Distinct().Count(), Is.EqualTo(50), "Feb 29 must produce its own 24 hour indices — duplicates double-count the coincident peak"); + Assert.That(indices[0], Is.EqualTo(1392), "Feb 28 hour 1 (day-of-year 59)"); + Assert.That(indices[24], Is.EqualTo(1416), "Feb 29 hour 1 (day-of-year 60, leap)"); + Assert.That(indices[48], Is.EqualTo(1440), "Mar 1 hour 1 starts at 1440 in a leap year"); + Assert.That(indices[49], Is.EqualTo(8783), "Dec 31 hour 24 is the 8784th leap-year hour (index 8783)"); + } + + [Test] + public void NonLeapSql_IndexingUnchanged() + { + // No Feb 29 rows → the non-leap calendar applies: Mar 1 follows Feb 28 directly. + List<(int, int, int)> rows = new List<(int, int, int)> + { + (2, 28, 24), + (3, 1, 1), + (12, 31, 24), + }; + + string sqlPath = CreateSql("c5_non_leap_year.sql", rows); + Dictionary>> series = OpenStudioSimulationRunner.ReadHourlyValueSeries(sqlPath, VariableName); + + Assert.That(series, Is.Not.Null); + List> points = series[KeyName]; + Assert.That(points.Count, Is.EqualTo(3)); + Assert.That(points[0].Key, Is.EqualTo(1415), "Feb 28 hour 24 (day-of-year 59, non-leap)"); + Assert.That(points[1].Key, Is.EqualTo(1416), "Mar 1 hour 1 starts at 1416 in a non-leap year"); + Assert.That(points[2].Key, Is.EqualTo(8759), "Dec 31 hour 24 is the 8760th hour (index 8759)"); + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/C5/ResultsExtractionTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/C5/ResultsExtractionTests.cs new file mode 100644 index 0000000..f14a6c7 --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/C5/ResultsExtractionTests.cs @@ -0,0 +1,182 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// C5: results extraction and SAM mapping — annual energies, peaks with timestamps, unmet + /// hours, gains breakdown, options-gated series, one unit authority (kWh), zero-vs-missing + /// semantics, SAM Guid ↔ zone identity and the AnalyticalModel/Space result mapping, + /// validated end-to-end on annual EnergyPlus runs. + /// + [TestFixture] + public class ResultsExtractionTests + { + private static string WeatherPath(string extension) + { + return Path.GetFullPath(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "..", "..", "..", "resources", "weather", "USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2004-2018" + extension)); + } + + private static OpenStudioConversionResult Run(AnalyticalModel analyticalModel, string name, bool extractTimeSeries = false, Core.OpenStudio.OpenStudioConversionOptions conversionOptions = null) + { + string epwPath = WeatherPath(".epw"); + Assert.That(File.Exists(epwPath), Is.True, $"Pinned weather fixture missing: {epwPath}"); + + string outputDirectory = Path.Combine(TestContext.CurrentContext.WorkDirectory, name); + if (Directory.Exists(outputDirectory)) + { + Directory.Delete(outputDirectory, true); + } + + OpenStudioConversionResult result = analyticalModel.ToOpenStudio(epwPath, outputDirectory, openStudioConversionOptions: conversionOptions, openStudioRunOptions: new Core.OpenStudio.OpenStudioRunOptions { ExtractTimeSeries = extractTimeSeries }); + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in result.Diagnostics) + { + TestContext.Out.WriteLine(diagnostic.ToString()); + } + + Assert.That(result.RunResult?.Success, Is.True, "The run must succeed"); + Assert.That(result.Results, Is.Not.Null, "The result set must be extracted"); + return result; + } + + [Test] + [Category("Simulation")] + public void AnnualEnergy_Peaks_UnmetHours_Gains_AndSeries_Extracted() + { + OpenStudioConversionResult result = Run(AnalyticalModelFixtures.SingleBox(), "c5_full_extraction", extractTimeSeries: true); + OpenStudioSimulationResultSet results = result.Results; + + string zoneKey = results.AnnualHeatingEnergy.Keys.Single(); + + // Annual energy (kWh authority) + Assert.That(results.AnnualHeatingEnergy[zoneKey], Is.GreaterThan(0)); + Assert.That(results.AnnualCoolingEnergy[zoneKey], Is.GreaterThan(0)); + Assert.That(results.TotalAnnualHeating, Is.EqualTo(result.Loads.TotalHeating).Within(1e-9), "Result set and legacy summary agree"); + + // Peaks with timestamps + Assert.That(results.PeakHeatingLoad[zoneKey], Is.GreaterThan(0)); + Assert.That(results.PeakCoolingLoad[zoneKey], Is.GreaterThan(0)); + Assert.That(results.PeakHeatingHour[zoneKey], Is.InRange(0, 8759)); + Assert.That(results.PeakCoolingHour[zoneKey], Is.InRange(0, 8759)); + Assert.That(results.PeakHeatingLoadTotal, Is.EqualTo(results.PeakHeatingLoad[zoneKey]).Within(1e-9), "One zone: coincident peak equals the zone peak"); + Assert.That(results.PeakHeatingHourTotal, Is.EqualTo(results.PeakHeatingHour[zoneKey])); + + // Unmet hours (present, non-negative; never missing for a conditioned zone; all + // per-zone dictionaries share one zone identity — the energy key) + Assert.That(results.UnmetHeatingHours.ContainsKey(zoneKey), Is.True); + Assert.That(results.UnmetHeatingHours[zoneKey], Is.GreaterThanOrEqualTo(0)); + Assert.That(results.UnmetCoolingHours[zoneKey], Is.GreaterThanOrEqualTo(0)); + + // Gains breakdown (normalised onto the energy key) + Assert.That(results.LightingGains[zoneKey], Is.GreaterThan(0), "8 W/m² office lighting must appear"); + Assert.That(results.EquipmentGains[zoneKey], Is.GreaterThan(0)); + Assert.That(results.PeopleGains[zoneKey], Is.GreaterThan(0)); + Assert.That(results.WindowSolarGains[zoneKey], Is.GreaterThan(0), "South window in Boston must transmit solar"); + Assert.That(results.InfiltrationGains.ContainsKey(zoneKey), Is.True); + Assert.That(results.VentilationHeatingEnergy.ContainsKey(zoneKey) || results.VentilationCoolingEnergy.ContainsKey(zoneKey), Is.True); + + // Series (requested) + Assert.That(results.TemperatureSeries, Is.Not.Null); + Assert.That(results.TemperatureSeries[zoneKey].Length, Is.EqualTo(8760)); + Assert.That(results.TemperatureSeries[zoneKey].Min(), Is.GreaterThan(-40)); + Assert.That(results.TemperatureSeries[zoneKey].Max(), Is.LessThan(60)); + Assert.That(results.OperativeTemperatureSeries[zoneKey].Length, Is.EqualTo(8760)); + Assert.That(results.RelativeHumiditySeries[zoneKey].Length, Is.EqualTo(8760)); + + // Runtime and error counts + Assert.That(results.RuntimeSeconds, Is.GreaterThan(0)); + Assert.That(results.FatalCount, Is.EqualTo(0)); + Assert.That(results.SevereCount, Is.EqualTo(0)); + } + + [Test] + [Category("Simulation")] + public void Series_AreNotLoaded_WhenNotRequested() + { + OpenStudioConversionResult result = Run(AnalyticalModelFixtures.SingleBox(), "c5_no_series"); + Assert.That(result.Results.TemperatureSeries, Is.Null); + Assert.That(result.Results.OperativeTemperatureSeries, Is.Null); + Assert.That(result.Results.RelativeHumiditySeries, Is.Null); + } + + [Test] + [Category("Simulation")] + public void Units_AnnualSum_MatchesHourlySeries_OneAuthority() + { + OpenStudioConversionResult result = Run(AnalyticalModelFixtures.SingleBox(), "c5_units"); + OpenStudioSimulationResultSet results = result.Results; + + using (System.Data.SQLite.SQLiteConnection connection = new System.Data.SQLite.SQLiteConnection("Data Source=" + result.RunResult.SqlPath + ";Read Only=True")) + { + connection.Open(); + using (System.Data.SQLite.SQLiteCommand command = connection.CreateCommand()) + { + command.CommandText = "SELECT SUM(rd.Value) FROM ReportData rd JOIN ReportDataDictionary rdd ON rd.ReportDataDictionaryIndex = rdd.ReportDataDictionaryIndex JOIN Time t ON rd.TimeIndex = t.TimeIndex WHERE rdd.Name = @name AND t.EnvironmentPeriodIndex IN (SELECT EnvironmentPeriodIndex FROM EnvironmentPeriods WHERE EnvironmentType = 3)"; + command.Parameters.AddWithValue("@name", "Zone Ideal Loads Supply Air Total Heating Energy"); + double joules = (double)command.ExecuteScalar(); + Assert.That(results.TotalAnnualHeating, Is.EqualTo(Core.OpenStudio.Query.JoulesToKilowattHours(joules)).Within(1e-6), "One J → kWh authority across all extraction paths"); + } + } + } + + [Test] + [Category("Simulation")] + public void TwoZones_ZeroVsMissing_IdentityMapping() + { + OpenStudioConversionResult result = Run(AnalyticalModelFixtures.TwoAdjacentBoxes(spaceBUnconditioned: true), "c5_two_zones"); + OpenStudioSimulationResultSet results = result.Results; + + Assert.That(results.AnnualHeatingEnergy.Count, Is.EqualTo(1), "Only the conditioned zone reports Ideal Loads energy — the unconditioned zone is absent, never zero-filled"); + + // The mapping needs the SOURCE model (fixture GUIDs are deterministic). + List spaceResults = results.ToSAM_SpaceSimulationResults(AnalyticalModelFixtures.TwoAdjacentBoxes(spaceBUnconditioned: true)); + Assert.That(spaceResults.Count, Is.EqualTo(2), "Heating + Cooling result per conditioned space"); + Assert.That(spaceResults.Select(x => x.LoadType()).Distinct().Count(), Is.EqualTo(2)); + + SpaceSimulationResult heating = spaceResults.Single(x => x.LoadType() == LoadType.Heating); + Assert.That(heating.TryGetValue(Analytical.SpaceSimulationResultParameter.Load, out double load), Is.True); + Assert.That(load, Is.GreaterThan(0)); + Assert.That(heating.TryGetValue(Analytical.SpaceSimulationResultParameter.LoadIndex, out int loadIndex), Is.True); + Assert.That(loadIndex, Is.InRange(0, 8759)); + Assert.That(heating.TryGetValue(Analytical.SpaceSimulationResultParameter.UnmetHours, out double unmet), Is.True); + Assert.That(unmet, Is.GreaterThanOrEqualTo(0)); + } + + [Test] + [Category("Simulation")] + public void AnalyticalModelResult_Mapped() + { + AnalyticalModel analyticalModel = AnalyticalModelFixtures.SingleBox(); + OpenStudioConversionResult result = Run(analyticalModel, "c5_model_result"); + + AnalyticalModelSimulationResult modelResult = result.Results.ToSAM(analyticalModel); + + Assert.That(modelResult.TryGetValue(AnalyticalModelSimulationResultParameter.ConsumptionHeating, out double consumptionHeating), Is.True); + Assert.That(consumptionHeating, Is.EqualTo(result.Results.TotalAnnualHeating).Within(1e-9)); + Assert.That(modelResult.TryGetValue(AnalyticalModelSimulationResultParameter.ConsumptionCooling, out double consumptionCooling), Is.True); + Assert.That(consumptionCooling, Is.EqualTo(result.Results.TotalAnnualCooling).Within(1e-9)); + Assert.That(modelResult.TryGetValue(AnalyticalModelSimulationResultParameter.PeakHeatingLoad, out double peakHeating), Is.True); + Assert.That(peakHeating, Is.EqualTo(result.Results.PeakHeatingLoadTotal).Within(1e-9)); + Assert.That(modelResult.TryGetValue(AnalyticalModelSimulationResultParameter.PeakHeatingHour, out int peakHeatingHour), Is.True); + Assert.That(peakHeatingHour, Is.EqualTo(result.Results.PeakHeatingHourTotal)); + Assert.That(modelResult.TryGetValue(AnalyticalModelSimulationResultParameter.FloorArea, out double floorArea), Is.True); + Assert.That(floorArea, Is.EqualTo(20.0).Within(1e-9)); + } + + [Test] + [Category("Simulation")] + public void DesignDayRun_PeaksAndAnnuals_StillExcludeSizingPeriods() + { + OpenStudioConversionResult result = Run(AnalyticalModelFixtures.SingleBox(), "c5_designday_exclusion", conversionOptions: new Core.OpenStudio.OpenStudioConversionOptions { DdyPath = WeatherPath(".ddy") }); + OpenStudioConversionResult baseline = Run(AnalyticalModelFixtures.SingleBox(), "c5_designday_baseline"); + + Assert.That(result.Results.TotalAnnualHeating, Is.EqualTo(baseline.Results.TotalAnnualHeating).Within(System.Math.Max(1.0, baseline.Results.TotalAnnualHeating * 0.01))); + Assert.That(result.Results.AnnualHeatingEnergy.Keys.Single(), Is.EqualTo(baseline.Results.AnnualHeatingEnergy.Keys.Single())); + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/C5/ZoneSizingDesignLoadTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/C5/ZoneSizingDesignLoadTests.cs new file mode 100644 index 0000000..4d4ea35 --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/C5/ZoneSizingDesignLoadTests.cs @@ -0,0 +1,417 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// Per-space design loads come from the route's zone sizing results (SQL ZoneSizes), mapped + /// onto . Before this existed the + /// benchmark reported every design load unavailable even though EnergyPlus had sized the zones. + /// + /// Fully offline: the result set is fabricated, so no OpenStudio install or EnergyPlus run is + /// involved. + /// + /// + [TestFixture] + public class ZoneSizingDesignLoadTests + { + private static OpenStudioZoneSizingResult Row(string zoneName, string loadType, double? userDesignLoad, double? calculatedDesignLoad = null, string designDayName = "WINTER_DD", string peakTime = "3/2 08:00:00", double? peakTemperature = -3.2, long sourceIndex = 0) + { + return new OpenStudioZoneSizingResult(zoneName, loadType, calculatedDesignLoad ?? userDesignLoad, userDesignLoad, 0.04, 0.05, designDayName, peakTime, peakTemperature, 0.00243652, sourceIndex); + } + + private static OpenStudioSimulationResultSet ResultSet(params OpenStudioZoneSizingResult[] rows) + { + var empty = new Dictionary(); + var emptyHours = new Dictionary(); + var emptySeries = new Dictionary(); + return new OpenStudioSimulationResultSet( + empty, empty, empty, empty, emptyHours, emptyHours, + 0, 0, 0, 0, + empty, empty, empty, empty, empty, empty, empty, empty, empty, + emptySeries, emptySeries, emptySeries, + 1.0, 0, 0, 0, + rows); + } + + private static List Spaces() + { + return AnalyticalModelFixtures.SingleBox().AdjacencyCluster.GetSpaces().ToList(); + } + + private static string ThermalZoneName(Space space) + { + return Core.OpenStudio.Query.OpenStudioName("ThermalZone", space.Name, space.Guid); + } + + private static double? DesignLoad(IEnumerable results, LoadType loadType) + { + SpaceSimulationResult result = results.FirstOrDefault(x => string.Equals(x.GetValue(Analytical.SpaceSimulationResultParameter.LoadType), loadType.ToString(), System.StringComparison.OrdinalIgnoreCase)); + if (result == null) + { + return null; + } + + return result.TryGetValue(Analytical.SpaceSimulationResultParameter.DesignLoad, out double value) ? value : (double?)null; + } + + [Test] + public void CalcDesLoad_PopulatesDesignLoad_NotUserDesLoad() + { + // CalcDesLoad is the unaltered thermal load from the design-day weather and schedules, which is + // what the documented result contract defines designLoad to be. UserDesLoad is that load AFTER + // sizing factors (the real HungaryHouse run applied 1.25, i.e. exactly the values below), so + // emitting it would fold a user-configured margin into a cross-engine physics comparison. + List spaces = Spaces(); + Space space = spaces.First(); + OpenStudioSimulationResultSet resultSet = ResultSet(Row(ThermalZoneName(space), "Heating", userDesignLoad: 1409.83, calculatedDesignLoad: 1127.86)); + + List results = resultSet.ToSAM_SpaceDesignLoadResults(spaces); + + Assert.That(DesignLoad(results, LoadType.Heating), Is.EqualTo(1127.86).Within(1e-9), "CalcDesLoad is the calculated load the metric reports"); + Assert.That(DesignLoad(results, LoadType.Heating), Is.Not.EqualTo(1409.83).Within(1e-9), "The post-sizing-factor capacity must not be emitted as the design load"); + Assert.That(resultSet.ZoneSizing.Single().UserDesignLoad, Is.EqualTo(1409.83).Within(1e-9), "…but it stays readable for the sizing-capacity audit"); + } + + [Test] + public void HeatingAndCooling_MapIndependently() + { + List spaces = Spaces(); + Space space = spaces.First(); + OpenStudioSimulationResultSet resultSet = ResultSet(Row(ThermalZoneName(space), "Heating", 1400.0)); + + List results = resultSet.ToSAM_SpaceDesignLoadResults(spaces); + + Assert.That(DesignLoad(results, LoadType.Heating), Is.EqualTo(1400.0).Within(1e-9)); + Assert.That(DesignLoad(results, LoadType.Cooling), Is.Null, "A zone sized for heating only yields no cooling design load"); + } + + [Test] + public void SizedZero_IsAnAvailableZero() + { + List spaces = Spaces(); + Space space = spaces.First(); + OpenStudioSimulationResultSet resultSet = ResultSet(Row(ThermalZoneName(space), "Cooling", 0.0)); + + List results = resultSet.ToSAM_SpaceDesignLoadResults(spaces); + + Assert.That(DesignLoad(results, LoadType.Cooling), Is.EqualTo(0.0), "A genuinely sized zero is a result, not a missing value"); + } + + [Test] + public void MissingLoad_StaysUnavailable_NeverZero() + { + List spaces = Spaces(); + Space space = spaces.First(); + // No calculated load, even though a post-factor capacity is present: the metric must stay + // unavailable rather than fall back to the other column or to a zero. + OpenStudioSimulationResultSet resultSet = ResultSet(new OpenStudioZoneSizingResult( + ThermalZoneName(space), "Heating", null, 500.0, 0.04, 0.05, "WINTER_DD", "3/2 08:00:00", -3.2, 0.00243652)); + + List results = resultSet.ToSAM_SpaceDesignLoadResults(spaces); + + Assert.That(results, Is.Empty, "A row without CalcDesLoad yields no design-load result at all, so the metric stays unavailable rather than becoming 0"); + } + + [Test] + public void NoZoneSizing_YieldsNoResultsAndNoDiagnostics() + { + List results = ResultSet().ToSAM_SpaceDesignLoadResults(Spaces(), out List diagnostics); + + Assert.That(results, Is.Empty, "A run that performed no sizing simply has no design loads"); + Assert.That(diagnostics, Is.Empty, "Absent sizing is not an anomaly worth warning about"); + } + + [Test] + public void PeakContext_IsCarriedForAudit() + { + List spaces = Spaces(); + Space space = spaces.First(); + OpenStudioSimulationResultSet resultSet = ResultSet(Row(ThermalZoneName(space), "Heating", 1400.0, designDayName: "LONDON_TRY_ANN_HTG_100%_CONDS_DB", peakTime: "3/2 08:20:00", peakTemperature: -3.2)); + + SpaceSimulationResult result = resultSet.ToSAM_SpaceDesignLoadResults(spaces).Single(); + + Assert.That(result.GetValue(SpaceSimulationResultParameter.DesignDayName), Is.EqualTo("LONDON_TRY_ANN_HTG_100%_CONDS_DB"), "The governing design day is recorded"); + Assert.That(result.GetValue(SpaceSimulationResultParameter.PeakDate), Is.Not.Null, "The peak time stamp is parsed"); + Assert.That(result.GetValue(SpaceSimulationResultParameter.ZoneName), Is.EqualTo(ThermalZoneName(space)), "The engine zone the row came from is recorded"); + } + + [Test] + public void PeakTemp_DoesNotPopulateDesignDayTemperature() + { + // ZoneSizes.PeakTemp has an unsettled scope: EnergyPlus documents the zone sizing peak + // temperature as a ZONE value, while on a real run every row equalled the design day's OUTDOOR + // maximum dry bulb. Mapping it onto a parameter that names it an outdoor design-day + // temperature would assert an interpretation this converter has no basis for, so it must not. + List spaces = Spaces(); + Space space = spaces.First(); + OpenStudioSimulationResultSet resultSet = ResultSet(Row(ThermalZoneName(space), "Heating", 1400.0, peakTemperature: -3.2)); + + SpaceSimulationResult result = resultSet.ToSAM_SpaceDesignLoadResults(spaces).Single(); + + Assert.That(result.TryGetValue(Analytical.SpaceSimulationResultParameter.DesignDayTemperature, out double _), Is.False, "A populated PeakTemp must not become DesignDayTemperature"); + Assert.That(resultSet.ZoneSizing.Single().PeakTemperature, Is.EqualTo(-3.2).Within(1e-9), "…but the value is still carried verbatim for the audit"); + } + + [Test] + public void OriginalResultSetConstructorSignatureStillExists() + { + // Binary compatibility: adding zone sizing as an OPTIONAL parameter on the original + // constructor would keep source calls compiling while removing the 26-argument constructor + // from metadata, so a Grasshopper or third-party assembly compiled against it would throw + // MissingMethodException. Reflection is required here — a 26-argument source call would also + // bind happily to an optional parameter and prove nothing. + System.Type[] original = new System.Type[] + { + typeof(IReadOnlyDictionary), typeof(IReadOnlyDictionary), + typeof(IReadOnlyDictionary), typeof(IReadOnlyDictionary), + typeof(IReadOnlyDictionary), typeof(IReadOnlyDictionary), + typeof(double), typeof(int), typeof(double), typeof(int), + typeof(IReadOnlyDictionary), typeof(IReadOnlyDictionary), + typeof(IReadOnlyDictionary), typeof(IReadOnlyDictionary), + typeof(IReadOnlyDictionary), typeof(IReadOnlyDictionary), + typeof(IReadOnlyDictionary), typeof(IReadOnlyDictionary), + typeof(IReadOnlyDictionary), + typeof(IReadOnlyDictionary), typeof(IReadOnlyDictionary), + typeof(IReadOnlyDictionary), + typeof(double), typeof(int), typeof(int), typeof(int) + }; + + System.Reflection.ConstructorInfo constructorInfo = typeof(OpenStudioSimulationResultSet).GetConstructor(original); + + Assert.That(constructorInfo, Is.Not.Null, "The original 26-argument constructor must remain in metadata for already-compiled consumers"); + Assert.That(constructorInfo.GetParameters().Length, Is.EqualTo(26)); + Assert.That(constructorInfo.GetParameters().Any(x => x.IsOptional), Is.False, "The preserved overload takes no optional parameters"); + + // The zone-sizing overload is a separate, explicit signature — also not optional. + System.Type[] withZoneSizing = original.Concat(new System.Type[] { typeof(IReadOnlyList) }).ToArray(); + System.Reflection.ConstructorInfo zoneSizingConstructor = typeof(OpenStudioSimulationResultSet).GetConstructor(withZoneSizing); + Assert.That(zoneSizingConstructor, Is.Not.Null, "The zone-sizing constructor exists as its own 27-argument signature"); + Assert.That(zoneSizingConstructor.GetParameters().Any(x => x.IsOptional), Is.False, "Two explicit overloads, no optional parameter"); + + // The preserved overload really does delegate: it yields an empty, non-null ZoneSizing. + OpenStudioSimulationResultSet resultSet = (OpenStudioSimulationResultSet)constructorInfo.Invoke(new object[] + { + new Dictionary(), new Dictionary(), + new Dictionary(), new Dictionary(), + new Dictionary(), new Dictionary(), + 0d, 0, 0d, 0, + new Dictionary(), new Dictionary(), + new Dictionary(), new Dictionary(), + new Dictionary(), new Dictionary(), + new Dictionary(), new Dictionary(), + new Dictionary(), + null, null, null, + 0d, 0, 0, 0 + }); + + Assert.That(resultSet.ZoneSizing, Is.Not.Null.And.Empty, "The old signature yields an empty zone-sizing list, never null"); + } + + [Test] + public void AnnualLoadAndIndex_AreNeverWrittenByTheSizingMapping() + { + // The sizing mapping must not be able to relabel a design load as an annual simulated peak. + List spaces = Spaces(); + OpenStudioSimulationResultSet resultSet = ResultSet(Row(ThermalZoneName(spaces.First()), "Heating", 1400.0)); + + SpaceSimulationResult result = resultSet.ToSAM_SpaceDesignLoadResults(spaces).Single(); + + Assert.That(result.TryGetValue(Analytical.SpaceSimulationResultParameter.Load, out double _), Is.False, "Load stays an annual-only result"); + Assert.That(result.TryGetValue(Analytical.SpaceSimulationResultParameter.LoadIndex, out int _), Is.False, "LoadIndex stays an annual-only result"); + } + + [Test] + public void UnmatchedEnergyPlusZone_RaisesADiagnostic() + { + List spaces = Spaces(); + OpenStudioSimulationResultSet resultSet = ResultSet(Row("SAM_THERMALZONE_A_ZONE_THAT_IS_NOT_IN_THE_MODEL", "Heating", 999.0)); + + List results = resultSet.ToSAM_SpaceDesignLoadResults(spaces, out List diagnostics); + + Assert.That(results, Is.Empty); + Assert.That(diagnostics.Count, Is.EqualTo(1), "An engine zone that matches no source space is named, not silently dropped"); + Assert.That(diagnostics[0].Severity, Is.EqualTo(Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning)); + Assert.That(diagnostics[0].Message, Does.Contain("matches no source SAM space")); + } + + [Test] + public void DuplicateZoneAndLoadTypeRows_FirstWinsExplicitly() + { + List spaces = Spaces(); + Space space = spaces.First(); + string zoneName = ThermalZoneName(space); + + // Deterministic: the result set orders rows ordinally by ZoneName|LoadType, so "first" is + // stable whatever order the SQL reader returned them in. + OpenStudioSimulationResultSet resultSet = ResultSet( + Row(zoneName, "Heating", 1400.0, sourceIndex: 1), + Row(zoneName, "Heating", 2800.0, sourceIndex: 2)); + + List results = resultSet.ToSAM_SpaceDesignLoadResults(spaces, out List diagnostics); + + Assert.That(results.Count, Is.EqualTo(1), "One design load per zone and load type"); + Assert.That(DesignLoad(results, LoadType.Heating), Is.EqualTo(1400.0).Within(1e-9), "The lowest source index wins"); + Assert.That(diagnostics.Count, Is.EqualTo(1), "The collision is reported rather than silently resolved"); + Assert.That(diagnostics[0].Message, Does.Contain("Duplicate zone sizing row")); + } + + [Test] + public void DuplicateRows_SurviveInputOrderReversalIdentically() + { + // The key alone cannot separate two rows sharing a zone and load type, and List.Sort is not a + // stable sort, so without the source-index tie-breaker the surviving row would depend on the + // order the database happened to return. + List spaces = Spaces(); + string zoneName = ThermalZoneName(spaces.First()); + + OpenStudioZoneSizingResult first = Row(zoneName, "Heating", 1400.0, sourceIndex: 1); + OpenStudioZoneSizingResult second = Row(zoneName, "Heating", 2800.0, sourceIndex: 2); + + double? forward = DesignLoad(ResultSet(first, second).ToSAM_SpaceDesignLoadResults(spaces), LoadType.Heating); + double? reversed = DesignLoad(ResultSet(second, first).ToSAM_SpaceDesignLoadResults(spaces), LoadType.Heating); + + Assert.That(reversed, Is.EqualTo(forward), "Reversing the row order must not change which design load is emitted"); + Assert.That(forward, Is.EqualTo(1400.0).Within(1e-9)); + } + + [Test] + public void DuplicateRows_WithoutSourceIndices_StillSurviveOrderReversalIdentically() + { + // The harder case: a caller that supplies no source index leaves duplicates sharing the + // default, so key AND index are equal and only the payload can separate them. Without that, + // the unstable sort would let the input order decide which design load is emitted. + List spaces = Spaces(); + string zoneName = ThermalZoneName(spaces.First()); + + OpenStudioZoneSizingResult low = Row(zoneName, "Heating", 1400.0); + OpenStudioZoneSizingResult high = Row(zoneName, "Heating", 2800.0); + + double? forward = DesignLoad(ResultSet(low, high).ToSAM_SpaceDesignLoadResults(spaces), LoadType.Heating); + double? reversed = DesignLoad(ResultSet(high, low).ToSAM_SpaceDesignLoadResults(spaces), LoadType.Heating); + + Assert.That(forward, Is.Not.Null); + Assert.That(reversed, Is.EqualTo(forward), "With no source index to separate them, the payload must still decide — not the input order"); + } + + [Test] + public void IndistinguishableRows_CompareEqualAndEitherIsTheSameAnswer() + { + List spaces = Spaces(); + string zoneName = ThermalZoneName(spaces.First()); + + OpenStudioZoneSizingResult one = Row(zoneName, "Heating", 1400.0); + OpenStudioZoneSizingResult two = Row(zoneName, "Heating", 1400.0); + + Assert.That(one.SortSignature, Is.EqualTo(two.SortSignature), "Identical rows are genuinely interchangeable"); + Assert.That(DesignLoad(ResultSet(one, two).ToSAM_SpaceDesignLoadResults(spaces), LoadType.Heating), Is.EqualTo(1400.0).Within(1e-9)); + } + + [Test] + public void DuplicateRows_OrderInTheResultSetIsTotal() + { + OpenStudioZoneSizingResult first = Row("ZONE_A", "Heating", 1.0, sourceIndex: 10); + OpenStudioZoneSizingResult second = Row("ZONE_A", "Heating", 2.0, sourceIndex: 20); + + List forward = ResultSet(first, second).ZoneSizing.Select(x => x.SourceIndex).ToList(); + List reversed = ResultSet(second, first).ZoneSizing.Select(x => x.SourceIndex).ToList(); + + Assert.That(forward, Is.EqualTo(new List { 10, 20 }), "Equal keys are ordered by source index"); + Assert.That(reversed, Is.EqualTo(forward), "…independently of construction order"); + } + + [Test] + public void ResultSetOrdersZoneSizingDeterministically() + { + OpenStudioSimulationResultSet first = ResultSet(Row("ZONE_B", "Heating", 1.0), Row("ZONE_A", "Cooling", 2.0)); + OpenStudioSimulationResultSet second = ResultSet(Row("ZONE_A", "Cooling", 2.0), Row("ZONE_B", "Heating", 1.0)); + + Assert.That(first.ZoneSizing.Select(x => x.Key).ToList(), Is.EqualTo(second.ZoneSizing.Select(x => x.Key).ToList()), "Construction order must not leak into the result set"); + Assert.That(first.ZoneSizing.Select(x => x.Key).ToList(), Is.EqualTo(new List { "ZONE_A|Cooling", "ZONE_B|Heating" })); + } + + /// + /// Minimal on-disk EnergyPlus-shaped SQL with a ZoneSizes table, used to exercise the established + /// consumer path (Modify.AddResults and the + /// Grasshopper SQL component) offline. No OpenStudio or EnergyPlus involved. + /// + private static string WriteSql(bool withUserDesignLoad, double calculatedDesignLoad, double userDesignLoad) + { + string path = System.IO.Path.Combine(TestContext.CurrentContext.WorkDirectory, "zonesizes_" + System.Guid.NewGuid().ToString("N").Substring(0, 8) + ".sql"); + using (System.Data.SQLite.SQLiteConnection connection = new System.Data.SQLite.SQLiteConnection(new System.Data.SQLite.SQLiteConnectionStringBuilder { DataSource = path }.ConnectionString)) + { + connection.Open(); + using (System.Data.SQLite.SQLiteCommand command = connection.CreateCommand()) + { + void Exec(string sql) + { + command.CommandText = sql; + command.ExecuteNonQuery(); + } + + Exec("CREATE TABLE Zones (ZoneIndex INTEGER PRIMARY KEY, ZoneName TEXT, FloorArea REAL, Volume REAL)"); + Exec("CREATE TABLE Surfaces (SurfaceIndex INTEGER PRIMARY KEY, SurfaceName TEXT, ZoneIndex INTEGER)"); + Exec("CREATE TABLE EnvironmentPeriods (EnvironmentPeriodIndex INTEGER PRIMARY KEY, EnvironmentName TEXT, EnvironmentType INTEGER)"); + Exec("CREATE TABLE Time (TimeIndex INTEGER PRIMARY KEY, Year INTEGER, Month INTEGER, Day INTEGER, Hour INTEGER, Minute INTEGER, Dst INTEGER, EnvironmentPeriodIndex INTEGER)"); + Exec("CREATE TABLE ReportDataDictionary (ReportDataDictionaryIndex INTEGER PRIMARY KEY, KeyValue TEXT, Name TEXT, Units TEXT)"); + Exec("CREATE TABLE ReportData (ReportDataIndex INTEGER PRIMARY KEY, ReportDataDictionaryIndex INTEGER, TimeIndex INTEGER, Value REAL)"); + Exec("CREATE TABLE NominalLighting (ZoneIndex INTEGER, DesignLevel REAL)"); + Exec("CREATE TABLE NominalInfiltration (ZoneIndex INTEGER, DesignLevel REAL)"); + Exec("CREATE TABLE NominalElectricEquipment (ZoneIndex INTEGER, DesignLevel REAL)"); + Exec(withUserDesignLoad + ? "CREATE TABLE ZoneSizes (ZoneName TEXT, LoadType TEXT, CalcDesLoad REAL, UserDesLoad REAL, DesDayName TEXT, PeakHrMin TEXT, PeakTemp REAL, PeakHumRat REAL)" + : "CREATE TABLE ZoneSizes (ZoneName TEXT, LoadType TEXT, CalcDesLoad REAL, DesDayName TEXT, PeakHrMin TEXT, PeakTemp REAL, PeakHumRat REAL)"); + + Exec("INSERT INTO Zones VALUES (1, 'ZONE_ONE', 10.0, 30.0)"); + Exec("INSERT INTO EnvironmentPeriods VALUES (1, 'WINTER_DD', 1)"); + Exec(withUserDesignLoad + ? string.Format(System.Globalization.CultureInfo.InvariantCulture, "INSERT INTO ZoneSizes VALUES ('ZONE_ONE', 'Heating', {0}, {1}, 'WINTER_DD', ' 1/21 10:00', -10.0, 0.001)", calculatedDesignLoad, userDesignLoad) + : string.Format(System.Globalization.CultureInfo.InvariantCulture, "INSERT INTO ZoneSizes VALUES ('ZONE_ONE', 'Heating', {0}, 'WINTER_DD', ' 1/21 10:00', -10.0, 0.001)", calculatedDesignLoad)); + } + } + + return path; + } + + [Test] + public void EstablishedSqlConsumerPath_UsesCalcDesLoad_EvenWhenUserDesLoadIsPresent() + { + // ONE design-load definition across consumers: Create.SpaceSimulationResults feeds + // Modify.AddResults and the Grasshopper SQL component, so it must emit the same value the + // benchmark path does. Otherwise a sizing factor makes the same run report two design loads. + string path = WriteSql(withUserDesignLoad: true, calculatedDesignLoad: 1127.86, userDesignLoad: 1409.83); + + List results = Create.SpaceSimulationResults(path); + + SpaceSimulationResult result = results.Single(x => x.TryGetValue(Analytical.SpaceSimulationResultParameter.DesignLoad, out double _)); + result.TryGetValue(Analytical.SpaceSimulationResultParameter.DesignLoad, out double designLoad); + Assert.That(designLoad, Is.EqualTo(1127.86).Within(1e-6), "CalcDesLoad, matching Convert.ToSAM_SpaceDesignLoadResults and the documented contract"); + } + + [Test] + public void EstablishedSqlConsumerPath_WorksOnTablesWithoutTheUserDesLoadColumn() + { + // Older/synthetic ZoneSizes tables have no UserDesLoad column at all; the reader must keep + // working against them, which it does because it only ever reads CalcDesLoad. + string path = WriteSql(withUserDesignLoad: false, calculatedDesignLoad: 1127.86, userDesignLoad: 0); + + List results = Create.SpaceSimulationResults(path); + + SpaceSimulationResult result = results.Single(x => x.TryGetValue(Analytical.SpaceSimulationResultParameter.DesignLoad, out double _)); + result.TryGetValue(Analytical.SpaceSimulationResultParameter.DesignLoad, out double designLoad); + Assert.That(designLoad, Is.EqualTo(1127.86).Within(1e-6), "CalcDesLoad is read whether or not the newer column exists"); + } + + [Test] + public void NullSpaces_YieldsEmptyResults() + { + List results = ResultSet(Row("ZONE_A", "Heating", 1.0)).ToSAM_SpaceDesignLoadResults(null); + + Assert.That(results, Is.Not.Null.And.Empty); + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/C6/CancellationAsyncTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/C6/CancellationAsyncTests.cs new file mode 100644 index 0000000..7ae2bc0 --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/C6/CancellationAsyncTests.cs @@ -0,0 +1,194 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// C6: cancellation, asynchronous execution and run-directory semantics at runner level + /// (Grasshopper behaviour is validated in Rhino by a human — the component is a thin shell + /// over this runner): explicit cancellation, cancel-during-output, timeout, sequential and + /// parallel runs, unique run directories, same-directory collision guard, progress stages + /// and no surviving processes. + /// + [TestFixture] + public class CancellationAsyncTests + { + private static string WeatherPath(string extension) + { + return Path.GetFullPath(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "..", "..", "..", "resources", "weather", "USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2004-2018" + extension)); + } + + private static string WorkDirectory(string name) + { + string result = Path.Combine(TestContext.CurrentContext.WorkDirectory, name); + if (Directory.Exists(result)) + { + Directory.Delete(result, true); + } + + return result; + } + + [Test] + [Category("Simulation")] + public void Cancelled_BeforeStart_NoCli_NoSurvivingProcess() + { + string epwPath = WeatherPath(".epw"); + Assert.That(File.Exists(epwPath), Is.True); + + using (CancellationTokenSource cancellationTokenSource = new CancellationTokenSource()) + { + cancellationTokenSource.Cancel(); + + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox().ToOpenStudio(epwPath, WorkDirectory("c6_cancel_before"), cancellationToken: cancellationTokenSource.Token); + + Assert.That(result.RunResult, Is.Null, "The CLI must not start on a pre-cancelled token"); + Assert.That(result.Diagnostics.Any(d => d.Message.Contains("cancelled")), Is.True); + Assert.That(File.Exists(result.OsmPath), Is.True, "The OSM is still saved"); + } + } + + [Test] + [Category("Simulation")] + public async Task Cancel_DuringRun_TerminatesProcessTree_NoSurvivingProcess() + { + string epwPath = WeatherPath(".epw"); + Assert.That(File.Exists(epwPath), Is.True); + + using (CancellationTokenSource cancellationTokenSource = new CancellationTokenSource()) + { + // Cancel the moment the CLI stage starts — deterministic, independent of how + // fast the fixture simulates. + System.IProgress progress = new System.Progress(x => + { + if (x.Stage == Core.OpenStudio.OpenStudioSimulationStage.RunningCli) + { + cancellationTokenSource.Cancel(); + } + }); + + Task task = AnalyticalModelFixtures.SingleBox().ToOpenStudioAsync(epwPath, WorkDirectory("c6_cancel_during"), progress: progress, cancellationToken: cancellationTokenSource.Token); + + OpenStudioConversionResult result = await task; + + Assert.That(result.RunResult, Is.Not.Null); + Assert.That(result.RunResult.Success, Is.False, "A cancelled run cannot succeed"); + Assert.That(result.Diagnostics.Any(d => d.Message.Contains("cancelled")), Is.True); + } + + bool treeTerminated = SpinWait.SpinUntil(() => Process.GetProcessesByName("energyplus").Length == 0 && Process.GetProcessesByName("openstudio").Length == 0, 10000); + Assert.That(treeTerminated, Is.True, "No orphaned EnergyPlus or CLI may survive the cancellation"); + } + + [Test] + [Category("Simulation")] + public async Task Parallel_UniqueRunDirectories_BothSucceed() + { + string epwPath = WeatherPath(".epw"); + Assert.That(File.Exists(epwPath), Is.True); + + string sharedParent = WorkDirectory("c6_parallel"); + Task first = AnalyticalModelFixtures.SingleBox().ToOpenStudioAsync(epwPath, sharedParent); + Task second = AnalyticalModelFixtures.SingleBox().ToOpenStudioAsync(epwPath, sharedParent); + + OpenStudioConversionResult[] results = await Task.WhenAll(first, second); + + Assert.That(results[0].RunResult?.Success, Is.True); + Assert.That(results[1].RunResult?.Success, Is.True); + Assert.That(results[0].OsmPath, Is.Not.EqualTo(results[1].OsmPath), "Unique run directories — concurrent runs never collide"); + Assert.That(results[0].Loads.TotalHeating, Is.EqualTo(results[1].Loads.TotalHeating).Within(1e-6), "Identical models produce identical results"); + } + + [Test] + [Category("Simulation")] + public async Task SameDirectory_NonUnique_SecondRunGetsCollisionDiagnostic() + { + string epwPath = WeatherPath(".epw"); + Assert.That(File.Exists(epwPath), Is.True); + + Core.OpenStudio.OpenStudioRunOptions runOptions = new Core.OpenStudio.OpenStudioRunOptions { UseUniqueRunDirectory = false }; + string directory = WorkDirectory("c6_collision"); + + Task first = AnalyticalModelFixtures.SingleBox().ToOpenStudioAsync(epwPath, directory, openStudioRunOptions: runOptions); + await Task.Delay(500); // let the first run take the lock + + OpenStudioConversionResult second = await AnalyticalModelFixtures.SingleBox().ToOpenStudioAsync(epwPath, directory, openStudioRunOptions: new Core.OpenStudio.OpenStudioRunOptions { UseUniqueRunDirectory = false }); + Assert.That(second.Diagnostics.Any(d => d.Message.Contains("Another run is in progress")), Is.True, "The lock file guards the non-unique directory"); + Assert.That(second.RunResult, Is.Null); + + OpenStudioConversionResult firstResult = await first; + Assert.That(firstResult.RunResult?.Success, Is.True); + + // After the first run completes the lock is released — a follow-up run succeeds. + OpenStudioConversionResult followUp = await AnalyticalModelFixtures.SingleBox().ToOpenStudioAsync(epwPath, directory, openStudioRunOptions: new Core.OpenStudio.OpenStudioRunOptions { UseUniqueRunDirectory = false }); + Assert.That(followUp.RunResult?.Success, Is.True, "Deterministic cleanup: the lock is released after completion"); + } + + [Test] + [Category("Simulation")] + public async Task ProgressStages_AreReportedInOrder() + { + string epwPath = WeatherPath(".epw"); + Assert.That(File.Exists(epwPath), Is.True); + + List stages = new List(); + System.IProgress progress = new System.Progress(x => { lock (stages) { stages.Add(x.Stage); } }); + + OpenStudioConversionResult result = await AnalyticalModelFixtures.SingleBox().ToOpenStudioAsync(epwPath, WorkDirectory("c6_progress"), progress: progress); + + Assert.That(result.RunResult?.Success, Is.True); + Assert.That(stages, Does.Contain(Core.OpenStudio.OpenStudioSimulationStage.SavingOsm)); + Assert.That(stages, Does.Contain(Core.OpenStudio.OpenStudioSimulationStage.WritingOsw)); + Assert.That(stages, Does.Contain(Core.OpenStudio.OpenStudioSimulationStage.RunningCli)); + Assert.That(stages, Does.Contain(Core.OpenStudio.OpenStudioSimulationStage.ReadingResults)); + Assert.That(stages.Last(), Is.EqualTo(Core.OpenStudio.OpenStudioSimulationStage.Complete)); + } + + [Test] + public void RelativeEpwPath_OswWeatherFile_ResolvesFromTheRunDirectory() + { + // With UseUniqueRunDirectory (the default) the OSW is written into a + // Guid subdirectory, but weather_file was recorded exactly as supplied. OpenStudio + // resolves weather_file relative to the OSW, so a relative EPW path that exists from + // the caller's working directory becomes unreachable and the run finds no weather. + string epwPath = WeatherPath(".epw"); + Assert.That(File.Exists(epwPath), Is.True); + + string epwPath_Relative = Path.GetRelativePath(Directory.GetCurrentDirectory(), epwPath); + Assert.That(Path.IsPathRooted(epwPath_Relative), Is.False, "The fixture must be reachable by a relative path for this test to mean anything"); + Assert.That(File.Exists(epwPath_Relative), Is.True, "The relative path resolves from the caller's working directory"); + + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox().ToOpenStudio(epwPath_Relative, WorkDirectory("c6_relative_epw"), run: false); + + Assert.That(result.OswPath, Is.Not.Null); + string weatherFile = System.Text.Json.Nodes.JsonNode.Parse(File.ReadAllText(result.OswPath))["weather_file"].GetValue(); + Assert.That(weatherFile, Is.Not.Empty); + + string resolved = Path.GetFullPath(Path.Combine(Path.GetDirectoryName(result.OswPath), weatherFile)); + Assert.That(File.Exists(resolved), Is.True, $"OpenStudio resolves weather_file against the OSW directory; '{weatherFile}' resolved to '{resolved}'"); + } + + [Test] + [Category("Simulation")] + public async Task SequentialRuns_RepeatedConversionAndDisposal() + { + string epwPath = WeatherPath(".epw"); + Assert.That(File.Exists(epwPath), Is.True); + + for (int i = 0; i < 2; i++) + { + OpenStudioConversionResult result = await AnalyticalModelFixtures.SingleBox().ToOpenStudioAsync(epwPath, WorkDirectory("c6_sequential_" + i)); + Assert.That(result.RunResult?.Success, Is.True, $"Sequential run {i} must succeed"); + result.Dispose(); + } + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/C7/CompletenessTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/C7/CompletenessTests.cs new file mode 100644 index 0000000..df3847a --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/C7/CompletenessTests.cs @@ -0,0 +1,275 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text.Json; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// C7: regression, validation and completeness enforcement. The machine-readable coverage + /// manifest (tests/resources/openstudio-analytical-coverage.json) is enforced: every live + /// member of every covered enum has an entry, every declared diagnostic code exists, the + /// manifest is structurally sound, and clean fixtures drop NOTHING (no skips, no + /// unsupported diagnostics). Plus determinism, repeated disposal and performance + /// measurement. + /// + [TestFixture] + public class CompletenessTests + { + private static readonly string[] ValidStatuses = { "Native", "Derived", "Approximated", "Unsupported", "Deferred", "NA" }; + private static readonly string[] ValidMilestones = { "MVP", "C0", "C1", "C2", "C3", "C4", "C5", "C6", "C7" }; + + private static JsonDocument Manifest() + { + string path = Path.GetFullPath(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "..", "..", "..", "resources", "openstudio-analytical-coverage.json")); + Assert.That(File.Exists(path), Is.True, $"Coverage manifest missing: {path}"); + return JsonDocument.Parse(File.ReadAllText(path)); + } + + private static List Entries(JsonDocument manifest) + { + return manifest.RootElement.GetProperty("entries").EnumerateArray().ToList(); + } + + [Test] + public void Manifest_IsStructurallySound() + { + using (JsonDocument manifest = Manifest()) + { + List entries = Entries(manifest); + Assert.That(entries.Count, Is.GreaterThan(250), "The audit covers the full SAM analytical surface"); + + HashSet ids = new HashSet(); + List violations = new List(); + foreach (JsonElement entry in entries) + { + string id = entry.GetProperty("id").GetString(); + string status = entry.GetProperty("status").GetString(); + string milestone = entry.GetProperty("milestone").GetString(); + + if (!ids.Add(id)) + { + violations.Add($"Duplicate manifest id {id}"); + } + + if (!ValidStatuses.Contains(status)) + { + violations.Add($"{id}: invalid status {status}"); + } + + if (!ValidMilestones.Contains(milestone)) + { + violations.Add($"{id}: invalid milestone {milestone}"); + } + + if (status == "Unsupported" && !entry.TryGetProperty("diagnostic", out _) && !entry.TryGetProperty("notes", out _)) + { + violations.Add($"{id}: Unsupported entries must declare a diagnostic or a note"); + } + + if ((status == "Approximated" || status == "Derived") && !entry.TryGetProperty("formula", out _) && !entry.TryGetProperty("notes", out _) && !entry.TryGetProperty("diagnostic", out _)) + { + violations.Add($"{id}: {status} entries must document the conversion policy"); + } + } + + Assert.That(violations, Is.Empty, string.Join("; ", violations)); + + TestContext.Out.WriteLine($"Manifest entries: {entries.Count}"); + } + } + + [Test] + public void Manifest_CoversEveryLiveEnumMember() + { + Assembly analyticalAssembly = typeof(InternalCondition).Assembly; + Assembly coreAssembly = typeof(Core.SAMObject).Assembly; + + using (JsonDocument manifest = Manifest()) + { + HashSet ids = new HashSet(Entries(manifest).Select(x => x.GetProperty("id").GetString())); + + List missing = new List(); + foreach (JsonElement coveredEnum in manifest.RootElement.GetProperty("coveredEnums").EnumerateArray()) + { + string typeName = coveredEnum.GetProperty("type").GetString(); + string prefix = coveredEnum.GetProperty("prefix").GetString(); + + Type enumType = analyticalAssembly.GetType(typeName) ?? coreAssembly.GetType(typeName) ?? Type.GetType(typeName); + Assert.That(enumType, Is.Not.Null, $"Covered enum type not found: {typeName}"); + Assert.That(enumType.IsEnum, Is.True, $"{typeName} is not an enum"); + + foreach (string memberName in Enum.GetNames(enumType)) + { + string id = prefix + "." + memberName; + if (!ids.Contains(id)) + { + missing.Add(id); + } + } + } + + Assert.That(missing, Is.Empty, "Every live enum member must have a coverage entry (never silently omitted): " + string.Join(", ", missing)); + } + } + + [Test] + public void Manifest_HasNoStaleIds() + { + // Review P2-01, the reverse of Manifest_CoversEveryLiveEnumMember: every manifest id + // whose prefix belongs to a covered enum must name a LIVE member — a rename or + // removal in SAM must fail here instead of leaving a stale coverage row behind. + Assembly analyticalAssembly = typeof(InternalCondition).Assembly; + Assembly coreAssembly = typeof(Core.SAMObject).Assembly; + + using (JsonDocument manifest = Manifest()) + { + Dictionary> liveMembersByPrefix = new Dictionary>(); + foreach (JsonElement coveredEnum in manifest.RootElement.GetProperty("coveredEnums").EnumerateArray()) + { + string typeName = coveredEnum.GetProperty("type").GetString(); + string prefix = coveredEnum.GetProperty("prefix").GetString(); + + Type enumType = analyticalAssembly.GetType(typeName) ?? coreAssembly.GetType(typeName) ?? Type.GetType(typeName); + Assert.That(enumType, Is.Not.Null, $"Covered enum type not found: {typeName}"); + + liveMembersByPrefix[prefix] = new HashSet(Enum.GetNames(enumType)); + } + + List stale = new List(); + foreach (JsonElement entry in Entries(manifest)) + { + string id = entry.GetProperty("id").GetString(); + int separatorIndex = id.IndexOf('.'); + if (separatorIndex <= 0) + { + continue; + } + + string prefix = id.Substring(0, separatorIndex); + string memberName = id.Substring(separatorIndex + 1); + if (liveMembersByPrefix.TryGetValue(prefix, out HashSet liveMembers) && !liveMembers.Contains(memberName)) + { + stale.Add(id); + } + } + + Assert.That(stale, Is.Empty, "Manifest ids naming removed or renamed enum members (stale coverage): " + string.Join(", ", stale)); + } + } + + [Test] + public void Manifest_DeclaredDiagnosticCodes_Exist() + { + HashSet declaredCodes = new HashSet( + typeof(Core.OpenStudio.OpenStudioDiagnosticCodes) + .GetFields(BindingFlags.Public | BindingFlags.Static) + .Select(x => (string)x.GetValue(null))); + + System.Text.RegularExpressions.Regex codePattern = new System.Text.RegularExpressions.Regex(@"SAM-OS-[A-Z]+-\d{3}"); + + using (JsonDocument manifest = Manifest()) + { + List unknown = new List(); + foreach (JsonElement entry in Entries(manifest)) + { + foreach (JsonProperty property in entry.EnumerateObject()) + { + if (property.Value.ValueKind != JsonValueKind.String) + { + continue; + } + + foreach (System.Text.RegularExpressions.Match match in codePattern.Matches(property.Value.GetString())) + { + if (!declaredCodes.Contains(match.Value)) + { + unknown.Add($"{entry.GetProperty("id").GetString()}: {match.Value}"); + } + } + } + } + + Assert.That(unknown, Is.Empty, "Every diagnostic code referenced by the manifest must exist in OpenStudioDiagnosticCodes"); + } + } + + [Test] + public void CleanFixture_DropsNothing() + { + // The office fixture exercises ~20 Native/Derived properties: every one of them is + // mapped — no skips and no unsupported diagnostics may appear. + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox().ToOpenStudio(); + + Assert.That(result.IsValid, Is.True); + Assert.That(result.Statistics.SkippedObjects, Is.EqualTo(0), "Nothing may be skipped for a clean fixture"); + Assert.That(result.Statistics.UnsupportedObjects, Is.EqualTo(0)); + Assert.That(result.Diagnostics.Any(d => d.Code == "SAM-OS-CON-002" || d.Code == "SAM-OS-MAT-002" || d.Code == "SAM-OS-IC-001"), Is.False); + + Core.OpenStudio.OpenStudioConversionStatistics statistics = result.Statistics; + Assert.That(statistics.CreatedObjects, Is.GreaterThan(10)); + Assert.That(statistics.SourceObjects, Is.EqualTo(8)); + } + + [Test] + public void UnsupportedData_RaisesExactlyTheDeclaredDiagnostics() + { + // Pollutant (declared Unsupported, SAM-OS-IC-001, milestone C2): the declared + // diagnostic must fire — proving unsupported data is reported, never silent. + InternalCondition internalCondition = AnalyticalModelFixtures.CreateOfficeInternalCondition(); + internalCondition.SetValue(InternalConditionParameter.PollutantGenerationPerArea, 0.5); + internalCondition.SetValue(InternalConditionParameter.PollutantGenerationPerPerson, 1.0); + + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox(internalConditionOverride: internalCondition).ToOpenStudio(); + + Assert.That(result.Diagnostics.Count(d => d.Code == "SAM-OS-IC-001" && d.Message.Contains("Pollutant")), Is.EqualTo(1), "One structured pollutant diagnostic, as declared in the manifest"); + Assert.That(result.IsValid, Is.True, "Unsupported-with-diagnostic data does not invalidate the conversion"); + } + + [Test] + public void Conversion_IsDeterministic() + { + // The SAME model converted twice: every fixture library object (profiles, + // materials) keeps its Guid, so names must be identical. + AnalyticalModel analyticalModel = AnalyticalModelFixtures.TwoAdjacentBoxes(); + OpenStudioConversionResult first = analyticalModel.ToOpenStudio(); + OpenStudioConversionResult second = analyticalModel.ToOpenStudio(); + + List firstNames = first.Model.objects().Select(x => x.iddObject().name() + "|" + x.nameString()).OrderBy(x => x).ToList(); + List secondNames = second.Model.objects().Select(x => x.iddObject().name() + "|" + x.nameString()).OrderBy(x => x).ToList(); + + Assert.That(second.Model.objects().Count, Is.EqualTo(first.Model.objects().Count)); + Assert.That(secondNames, Is.EqualTo(firstNames), "Repeated conversion of the same model must produce identical objects"); + } + + [Test] + public void RepeatedConversion_AndDisposal_DoesNotLeakOrThrow() + { + for (int i = 0; i < 5; i++) + { + OpenStudioConversionResult result = AnalyticalModelFixtures.TwoAdjacentBoxes().ToOpenStudio(); + Assert.That(result.IsValid, Is.True); + result.Dispose(); + } + } + + [Test] + public void Performance_ConversionAndRun_AreMeasured() + { + // Measurement, not a hard gate: numbers are recorded in the status document. A + // generous bound catches pathological regressions. + System.Diagnostics.Stopwatch stopwatch = System.Diagnostics.Stopwatch.StartNew(); + OpenStudioConversionResult result = AnalyticalModelFixtures.TwoAdjacentBoxes().ToOpenStudio(); + stopwatch.Stop(); + + TestContext.Out.WriteLine($"TwoAdjacentBoxes conversion: {stopwatch.ElapsedMilliseconds} ms; objects: {result.Model.objects().Count}"); + Assert.That(stopwatch.Elapsed.TotalSeconds, Is.LessThan(60), "Conversion of the two-zone fixture must stay interactive"); + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/C7/DeclaredDiagnosticsTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/C7/DeclaredDiagnosticsTests.cs new file mode 100644 index 0000000..a7cd0d9 --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/C7/DeclaredDiagnosticsTests.cs @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using SAM.Core; +using System; +using System.Collections.Generic; +using System.Linq; +using AnalyticalCreate = SAM.Analytical.Create; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// Review P1-01: every coverage-manifest row that declares a structured diagnostic must + /// actually emit it when the source data is present — false completeness (a manifest row + /// whose diagnostic no converter ever raises) is the exact failure mode these tests pin + /// down. One test per emission site; the clean-fixture silence is enforced by + /// . + /// + [TestFixture] + public class DeclaredDiagnosticsTests + { + private static Geometry.Spatial.Point3D P(double x, double y, double z) + { + return new Geometry.Spatial.Point3D(x, y, z); + } + + private static Geometry.Spatial.Face3D F(params Geometry.Spatial.Point3D[] point3Ds) + { + return new Geometry.Spatial.Face3D(new Geometry.Spatial.Polygon3D(point3Ds)); + } + + /// + /// Single-zone box assembled inline (the shared fixture has no material-library or + /// panel-mutation override): 6 panels of , office + /// internal condition, optional mutation of the south wall before it enters the cluster. + /// + private static AnalyticalModel SingleBoxModel(Core.MaterialLibrary materialLibrary, Construction construction = null, Action mutateSouthWall = null) + { + construction = construction ?? AnalyticalModelFixtures.WallConstruction; + + AdjacencyCluster adjacencyCluster = new AdjacencyCluster(); + + Space space = new Space(new Guid("cccccccc-0000-0000-0000-0000000000dd"), "Space Diagnostic", P(2.5, 2, 1.5)); + space.SetValue(SpaceParameter.Area, 20.0); + space.SetValue(SpaceParameter.Volume, 60.0); + space.InternalCondition = AnalyticalModelFixtures.CreateOfficeInternalCondition(); + adjacencyCluster.AddObject(space); + + Panel southWall = AnalyticalCreate.Panel(construction, PanelType.WallExternal, F(P(0, 0, 0), P(5, 0, 0), P(5, 0, 3), P(0, 0, 3))); + mutateSouthWall?.Invoke(southWall); + + List panels = new List + { + AnalyticalCreate.Panel(construction, PanelType.SlabOnGrade, F(P(0, 0, 0), P(5, 0, 0), P(5, 4, 0), P(0, 4, 0))), + AnalyticalCreate.Panel(construction, PanelType.Roof, F(P(0, 0, 3), P(5, 0, 3), P(5, 4, 3), P(0, 4, 3))), + southWall, + AnalyticalCreate.Panel(construction, PanelType.WallExternal, F(P(0, 0, 0), P(0, 4, 0), P(0, 4, 3), P(0, 0, 3))), + AnalyticalCreate.Panel(construction, PanelType.WallExternal, F(P(0, 4, 0), P(5, 4, 0), P(5, 4, 3), P(0, 4, 3))), + AnalyticalCreate.Panel(construction, PanelType.WallExternal, F(P(5, 0, 0), P(5, 4, 0), P(5, 4, 3), P(5, 0, 3))), + }; + + foreach (Panel panel in panels) + { + adjacencyCluster.AddObject(panel); + adjacencyCluster.AddRelation(space, panel); + } + + return new AnalyticalModel("Declared Diagnostics Model", "P1-01 regression fixture", null, null, adjacencyCluster, materialLibrary ?? AnalyticalModelFixtures.CreateMaterialLibrary(), AnalyticalModelFixtures.CreateProfileLibrary()); + } + + [Test] + public void InternalCondition_ViewCoefficientsAndControlFunction_RaiseDeclaredDiagnostics() + { + // Manifest: OccupancyViewCoefficient / EquipmentViewCoefficient / + // LightingControlFunction — Unsupported, "SAM-OS-IC-001 info". SAM's own + // Create.InternalCondition writes view coefficients on every NCM-derived condition. + InternalCondition internalCondition = AnalyticalModelFixtures.CreateOfficeInternalCondition(); + internalCondition.SetValue(InternalConditionParameter.OccupancyViewCoefficient, 0.227); + internalCondition.SetValue(InternalConditionParameter.EquipmentViewCoefficient, 0.372); + internalCondition.SetValue(InternalConditionParameter.LightingControlFunction, "PHOTOCELL 300"); + + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox(internalConditionOverride: internalCondition).ToOpenStudio(); + + Assert.That(result.IsValid, Is.True, "Unsupported-with-diagnostic data does not invalidate the conversion"); + Assert.That(result.Diagnostics.Count(d => d.Code == "SAM-OS-IC-001" && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Information && d.Message.Contains("Occupancy view coefficient")), Is.EqualTo(1), "Declared occupancy view-coefficient diagnostic"); + Assert.That(result.Diagnostics.Count(d => d.Code == "SAM-OS-IC-001" && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Information && d.Message.Contains("Equipment view coefficient")), Is.EqualTo(1), "Declared equipment view-coefficient diagnostic"); + Assert.That(result.Diagnostics.Count(d => d.Code == "SAM-OS-IC-001" && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Information && d.Message.Contains("Lighting control function")), Is.EqualTo(1), "Declared lighting-control-function diagnostic"); + } + + [Test] + public void InternalCondition_EmitterAndExhaustData_RaiseDeferredHvacDiagnostics() + { + // Manifest: the four emitter and four exhaust parameters — Deferred, + // "SAM-OS-HVAC-001 info" (Ideal Loads is convective; exhaust needs fan equipment). + InternalCondition internalCondition = AnalyticalModelFixtures.CreateOfficeInternalCondition(); + internalCondition.SetValue(InternalConditionParameter.HeatingEmitterRadiantProportion, 0.2); + internalCondition.SetValue(InternalConditionParameter.HeatingEmitterCoefficient, 0.7); + internalCondition.SetValue(InternalConditionParameter.CoolingEmitterRadiantProportion, 0.1); + internalCondition.SetValue(InternalConditionParameter.CoolingEmitterCoefficient, 0.9); + internalCondition.SetValue(InternalConditionParameter.ExhaustAirFlowPerPerson, 0.008); + internalCondition.SetValue(InternalConditionParameter.ExhaustAirChangesPerHour, 1.5); + internalCondition.SetValue(InternalConditionParameter.ExhaustAirFlowPerArea, 0.001); + internalCondition.SetValue(InternalConditionParameter.ExhaustAirFlow, 0.05); + + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox(internalConditionOverride: internalCondition).ToOpenStudio(); + + Assert.That(result.IsValid, Is.True); + + List hvacDiagnostics = result.Diagnostics.Where(d => d.Code == "SAM-OS-HVAC-001" && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Information).ToList(); + Core.OpenStudio.OpenStudioDiagnostic emitterDiagnostic = hvacDiagnostics.FirstOrDefault(d => d.Message.Contains("Emitter")); + Core.OpenStudio.OpenStudioDiagnostic exhaustDiagnostic = hvacDiagnostics.FirstOrDefault(d => d.Message.Contains("Exhaust")); + + Assert.That(emitterDiagnostic, Is.Not.Null, "Declared emitter deferral diagnostic (SAM-OS-HVAC-001 info)"); + Assert.That(emitterDiagnostic.Message, Does.Contain("HeatingEmitterRadiantProportion").And.Contain("HeatingEmitterCoefficient").And.Contain("CoolingEmitterRadiantProportion").And.Contain("CoolingEmitterCoefficient"), "The deferral names every present emitter parameter"); + + Assert.That(exhaustDiagnostic, Is.Not.Null, "Declared exhaust deferral diagnostic (SAM-OS-HVAC-001 info)"); + Assert.That(exhaustDiagnostic.Message, Does.Contain("ExhaustAirFlowPerPerson").And.Contain("ExhaustAirChangesPerHour").And.Contain("ExhaustAirFlowPerArea").And.Contain("ExhaustAirFlow"), "The deferral names every present exhaust parameter"); + } + + [Test] + public void ApertureConstruction_InternalShadow_RaisesDeclaredDiagnostic() + { + // Manifest: ApertureConstructionParameter.IsInternalShadow — Unsupported, + // "SAM-OS-CON-002 info". + ApertureConstruction apertureConstruction = new ApertureConstruction(new Guid("22222222-9999-9999-9999-999999999999"), "Shadow Window", ApertureType.Window); + apertureConstruction.SetValue(ApertureConstructionParameter.ThermalTransmittance, 2.8); + apertureConstruction.SetValue(ApertureConstructionParameter.TotalSolarEnergyTransmittance, 0.6); + apertureConstruction.SetValue(ApertureConstructionParameter.LightTransmittance, 0.7); + apertureConstruction.SetValue(ApertureConstructionParameter.IsInternalShadow, true); + + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox(apertureConstructionOverride: apertureConstruction).ToOpenStudio(); + + Assert.That(result.IsValid, Is.True); + Assert.That(result.Diagnostics.Count(d => d.Code == "SAM-OS-CON-002" && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Information && d.Message.Contains("Internal-shadow")), Is.EqualTo(1), "Declared aperture-construction internal-shadow diagnostic"); + } + + [Test] + public void Construction_InternalShadow_RaisesDeclaredDiagnosticOncePerConstruction() + { + // Manifest: ConstructionParameter.IsInternalShadow — Unsupported, "SAM-OS-CON-002 + // info". Six panels share the construction: the diagnostic fires once, not per panel. + Construction shadowWall = new Construction(new Guid("11111111-9999-9999-9999-999999999999"), "Shadow Wall", new List + { + new ConstructionLayer("Plasterboard", 0.0125), + new ConstructionLayer("Insulation", 0.1), + new ConstructionLayer("Brick", 0.1), + }); + shadowWall.SetValue(ConstructionParameter.IsInternalShadow, true); + + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox(wallConstruction: shadowWall).ToOpenStudio(); + + Assert.That(result.IsValid, Is.True); + Assert.That(result.Diagnostics.Count(d => d.Code == "SAM-OS-CON-002" && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Information && d.Message.Contains("Internal-shadow")), Is.EqualTo(1), "One diagnostic per construction, not one per panel"); + } + + [Test] + public void Panel_FeatureShade_RaisesDeclaredDiagnostic() + { + // Manifest: PanelParameter.FeatureShade — Unsupported, "SAM-OS-CON-002 info". + Panel shadedPanel = null; + AnalyticalModel analyticalModel = SingleBoxModel(null, mutateSouthWall: panel => + { + panel.SetValue(PanelParameter.FeatureShade, new FeatureShade("External louvre")); + shadedPanel = panel; + }); + + OpenStudioConversionResult result = analyticalModel.ToOpenStudio(); + + Assert.That(result.IsValid, Is.True); + List diagnostics = result.Diagnostics.Where(d => d.Code == "SAM-OS-CON-002" && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Information && d.Message.Contains("feature shade")).ToList(); + Assert.That(diagnostics.Count, Is.EqualTo(1), "Declared panel feature-shade diagnostic, once per panel"); + Assert.That(diagnostics[0].SamGuid, Is.EqualTo(shadedPanel.Guid), "The diagnostic carries the panel Guid"); + } + + [Test] + public void Material_VapourDiffusionFactor_RaisesDeclaredDiagnosticOncePerMaterial() + { + // Manifest: AnalyticalMaterialParameter.VapourDiffusionFactor — Unsupported, + // "SAM-OS-MAT-002 info". Brick appears in every panel and both construction + // directions: the diagnostic still fires exactly once for the material. + Core.MaterialLibrary materialLibrary = AnalyticalModelFixtures.CreateMaterialLibrary(); + OpaqueMaterial brick = materialLibrary.GetMaterial("Brick") as OpaqueMaterial; + brick.SetValue(MaterialParameter.VapourDiffusionFactor, 10.0); + materialLibrary.Add(brick); + + OpenStudioConversionResult result = SingleBoxModel(materialLibrary).ToOpenStudio(); + + Assert.That(result.IsValid, Is.True); + List diagnostics = result.Diagnostics.Where(d => d.Code == "SAM-OS-MAT-002" && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Information && d.Message.Contains("Vapour diffusion factor")).ToList(); + Assert.That(diagnostics.Count, Is.EqualTo(1), "Declared vapour-diffusion-factor diagnostic, once per material"); + Assert.That(diagnostics[0].SamGuid, Is.EqualTo(brick.Guid), "The diagnostic carries the material Guid"); + } + + [Test] + public void OpaqueMaterial_DivergentInternalOptics_RaisesDeclaredDiagnostic() + { + // Manifest: OpaqueMaterialParameter.InternalEmissivity (and the Internal + // reflectances) — Approximated, "SAM-OS-MAT-002 info when Internal differs from + // External; EnergyPlus opaque materials are single-sided". + Core.MaterialLibrary materialLibrary = AnalyticalModelFixtures.CreateMaterialLibrary(); + OpaqueMaterial brick = materialLibrary.GetMaterial("Brick") as OpaqueMaterial; + brick.SetValue(OpaqueMaterialParameter.InternalEmissivity, 0.4); // external 0.9 → divergent + brick.SetValue(OpaqueMaterialParameter.InternalSolarReflectance, 0.3); // external 0.3 → identical + materialLibrary.Add(brick); + + OpenStudioConversionResult result = SingleBoxModel(materialLibrary).ToOpenStudio(); + + Assert.That(result.IsValid, Is.True); + List diagnostics = result.Diagnostics.Where(d => d.Code == "SAM-OS-MAT-002" && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Information && d.Message.Contains("Internal-side")).ToList(); + Assert.That(diagnostics.Count, Is.EqualTo(1), "Declared single-sided approximation diagnostic, once per material"); + Assert.That(diagnostics[0].Message, Does.Contain("InternalEmissivity"), "The divergent parameter is named"); + Assert.That(diagnostics[0].Message, Does.Not.Contain("InternalSolarReflectance"), "A matching internal value is not a divergence"); + } + + [Test] + public void OpaqueMaterial_MatchingInternalOptics_StaysSilent() + { + // The single-sided approximation is exact when the internal values equal the + // external ones — no diagnostic may fire. + Core.MaterialLibrary materialLibrary = AnalyticalModelFixtures.CreateMaterialLibrary(); + OpaqueMaterial brick = materialLibrary.GetMaterial("Brick") as OpaqueMaterial; + brick.SetValue(OpaqueMaterialParameter.InternalEmissivity, 0.9); + brick.SetValue(OpaqueMaterialParameter.InternalSolarReflectance, 0.3); + brick.SetValue(OpaqueMaterialParameter.InternalLightReflectance, 0.3); + materialLibrary.Add(brick); + + OpenStudioConversionResult result = SingleBoxModel(materialLibrary).ToOpenStudio(); + + Assert.That(result.IsValid, Is.True); + Assert.That(result.Diagnostics.Any(d => d.Code == "SAM-OS-MAT-002"), Is.False, "Matching internal/external optics are the exact case — silent"); + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/C8/SQLiteDeploymentTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/C8/SQLiteDeploymentTests.cs new file mode 100644 index 0000000..12701f1 --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/C8/SQLiteDeploymentTests.cs @@ -0,0 +1,215 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.IO; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// C8: SQLite results extraction and its deployment contract (SAM-OS-RUN-001). + /// + /// Regression cover for a live failure where every Grasshopper run reported "Ideal Loads + /// results could not be extracted" even though EnergyPlus had completed successfully and + /// eplusout.sql contained 8760 rows per Ideal Loads variable. The cause was purely + /// deployment: this is a class library, so the SDK does not copy PackageReference runtime + /// assets to the output folder, and neither System.Data.SQLite.dll nor SQLite.Interop.dll + /// ever reached %APPDATA%\SAM. The first touch of a SQLite type threw, and a blanket catch + /// turned that into a message that read like missing simulation data. + /// + /// Note that the extraction tests here pass even on a broken deployment: the test host + /// resolves NuGet assets through its own .deps.json, so they cannot see the fault that + /// Rhino sees. is the test + /// that actually guards the shipped layout. + /// + [TestFixture] + public class SQLiteDeploymentTests + { + private static string RepositoryRoot() + { + // \tests\SAM.Analytical.OpenStudio.Tests\bin\\\ + return Path.GetFullPath(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "..", "..", "..", "..")); + } + + private static string CreateSql(string name, IEnumerable> rows, string variableName) + { + string result = Path.Combine(TestContext.CurrentContext.WorkDirectory, name); + if (File.Exists(result)) + { + File.Delete(result); + } + + using (System.Data.SQLite.SQLiteConnection connection = new System.Data.SQLite.SQLiteConnection("Data Source=" + result)) + { + connection.Open(); + using (System.Data.SQLite.SQLiteCommand command = connection.CreateCommand()) + { + command.CommandText = "CREATE TABLE ReportDataDictionary (ReportDataDictionaryIndex INTEGER PRIMARY KEY, Name TEXT, KeyValue TEXT)"; + command.ExecuteNonQuery(); + command.CommandText = "CREATE TABLE ReportData (ReportDataIndex INTEGER PRIMARY KEY, ReportDataDictionaryIndex INTEGER, Value REAL)"; + command.ExecuteNonQuery(); + + int index = 0; + foreach (KeyValuePair row in rows) + { + index++; + command.Parameters.Clear(); + command.CommandText = "INSERT INTO ReportDataDictionary VALUES (" + index + ", @name, @key)"; + command.Parameters.AddWithValue("@name", variableName); + command.Parameters.AddWithValue("@key", row.Key); + command.ExecuteNonQuery(); + + command.Parameters.Clear(); + command.CommandText = "INSERT INTO ReportData VALUES (" + index + ", " + index + ", @value)"; + command.Parameters.AddWithValue("@value", row.Value); + command.ExecuteNonQuery(); + } + } + } + + return result; + } + + /// + /// The deployment contract. Both SQLite assets must be in the build output, and the + /// native one must keep its runtimes\win-x64\native subdirectory: that is where both + /// System.Data.SQLite's own loader and SAM's AssemblyResolver look for it. A flat + /// managed DLL with no interop is exactly the state that produced SAM-OS-RUN-001. + /// + [Test] + public void BuildOutput_ContainsSQLiteAssets_InLoadableLayout() + { + string buildDirectory = Path.Combine(RepositoryRoot(), "build"); + Assert.That(Directory.Exists(buildDirectory), Is.True, $"Build output directory not found: {buildDirectory}"); + + string managedPath = Path.Combine(buildDirectory, "System.Data.SQLite.dll"); + Assert.That(File.Exists(managedPath), Is.True, $"System.Data.SQLite.dll must be deployed beside the plugin, else extraction throws FileNotFoundException in Rhino: {managedPath}"); + + string nativePath = Path.Combine(buildDirectory, "runtimes", "win-x64", "native", "SQLite.Interop.dll"); + Assert.That(File.Exists(nativePath), Is.True, $"The win-x64 SQLite.Interop.dll must be deployed in its runtimes layout, else extraction throws DllNotFoundException in Rhino: {nativePath}"); + + Assert.That(new FileInfo(managedPath).Length, Is.GreaterThan(0)); + Assert.That(new FileInfo(nativePath).Length, Is.GreaterThan(0)); + + // A flat or x86 interop beside the managed assembly would be probed ahead of the + // x64 one and silently break a 64-bit Rhino. + Assert.That(File.Exists(Path.Combine(buildDirectory, "SQLite.Interop.dll")), Is.False, "A flat SQLite.Interop.dll must not shadow the win-x64 asset"); + Assert.That(Directory.Exists(Path.Combine(buildDirectory, "runtimes", "win-x86", "native")), Is.False, "The win-x86 interop must not be deployed into a 64-bit-only plugin"); + } + + [Test] + public void ExtractLoads_KnownSqlFile_ReturnsSummary() + { + // Same file backs both variables, so heating and cooling both resolve. + string sqlPath = CreateSql("c8_known.sql", new[] { new KeyValuePair("SAM_IDEALLOADS_CELL_1", 3600000.0) }, "Zone Ideal Loads Supply Air Total Heating Energy"); + + OpenStudioLoadSummary loadSummary = OpenStudioSimulationRunner.ExtractLoads(sqlPath, out string failureDetail); + + Assert.That(failureDetail, Is.Null); + Assert.That(loadSummary, Is.Not.Null); + Assert.That(loadSummary.TotalHeating, Is.EqualTo(1.0).Within(1e-9), "3 600 000 J = 1 kWh"); + Assert.That(loadSummary.ZoneHeating.Count, Is.EqualTo(1)); + Assert.That(loadSummary.ZoneCooling.Count, Is.EqualTo(0), "No cooling variable in this file — absent, never zero-filled"); + Assert.That(loadSummary.IsFinite, Is.True); + } + + [Test] + public void ExtractLoads_MissingSqlFile_ReturnsNull_WithPathInDetail() + { + string sqlPath = Path.Combine(TestContext.CurrentContext.WorkDirectory, "c8_does_not_exist.sql"); + if (File.Exists(sqlPath)) + { + File.Delete(sqlPath); + } + + OpenStudioLoadSummary loadSummary = OpenStudioSimulationRunner.ExtractLoads(sqlPath, out string failureDetail); + + Assert.That(loadSummary, Is.Null); + Assert.That(failureDetail, Is.Not.Null.And.Contains(sqlPath), "The detail must name the file that could not be read"); + Assert.That(failureDetail, Does.Contain("exists: False")); + } + + [Test] + public void ExtractLoads_NoIdealLoadsVariables_ReturnsEmptySummary_NotNull() + { + // A readable file with an unrelated variable: zero conditioned zones is a legitimate + // model, so this must not be reported as an extraction failure. + string sqlPath = CreateSql("c8_no_ideal_loads.sql", new[] { new KeyValuePair("ZONE A", 3600000.0) }, "Zone Mean Air Temperature"); + + OpenStudioLoadSummary loadSummary = OpenStudioSimulationRunner.ExtractLoads(sqlPath, out string failureDetail); + + Assert.That(failureDetail, Is.Null); + Assert.That(loadSummary, Is.Not.Null, "Missing variables are not a read failure"); + Assert.That(loadSummary.ZoneHeating.Count, Is.EqualTo(0)); + Assert.That(loadSummary.ZoneCooling.Count, Is.EqualTo(0)); + Assert.That(loadSummary.TotalHeating, Is.EqualTo(0)); + } + + [Test] + public void ExtractLoads_CorruptSqlFile_ReturnsNull_WithExceptionDetail() + { + string sqlPath = Path.Combine(TestContext.CurrentContext.WorkDirectory, "c8_corrupt.sql"); + File.WriteAllText(sqlPath, "this is not a SQLite database"); + + OpenStudioLoadSummary loadSummary = OpenStudioSimulationRunner.ExtractLoads(sqlPath, out string failureDetail); + + Assert.That(loadSummary, Is.Null); + Assert.That(failureDetail, Is.Not.Null); + Assert.That(failureDetail, Does.Contain("Exception"), "The exception type must survive into the diagnostic"); + Assert.That(failureDetail, Does.Contain(sqlPath)); + } + + /// + /// The detail attached to SAM-OS-RUN-001 must distinguish the deployment faults from + /// each other and from a real query failure — that is the whole point of the change. + /// + [Test] + public void DescribeExtractionFailure_DistinguishesDeploymentFaults() + { + string sqlPath = @"C:\runs\eplusout.sql"; + + string missingManaged = OpenStudioSimulationRunner.DescribeExtractionFailure( + new FileNotFoundException("Could not load file or assembly 'System.Data.SQLite'."), sqlPath); + Assert.That(missingManaged, Does.Contain("System.IO.FileNotFoundException")); + Assert.That(missingManaged, Does.Contain("System.Data.SQLite")); + + string missingNative = OpenStudioSimulationRunner.DescribeExtractionFailure( + new DllNotFoundException("Unable to load DLL 'SQLite.Interop.dll'."), sqlPath); + Assert.That(missingNative, Does.Contain("System.DllNotFoundException")); + Assert.That(missingNative, Does.Contain("SQLite.Interop.dll")); + + string wrongArchitecture = OpenStudioSimulationRunner.DescribeExtractionFailure( + new BadImageFormatException("is not a valid Win32 application."), sqlPath); + Assert.That(wrongArchitecture, Does.Contain("System.BadImageFormatException")); + + // Every variant carries the environment facts needed to act on it remotely. + foreach (string detail in new[] { missingManaged, missingNative, wrongArchitecture }) + { + Assert.That(detail, Does.Contain(sqlPath)); + Assert.That(detail, Does.Contain("System.Data.SQLite:"), "Must report where (or whether) the provider loaded"); + Assert.That(detail, Does.Contain("plugin:")); + Assert.That(detail, Does.Contain("base:")); + Assert.That(detail, Does.Contain(IntPtr.Size * 8 + "-bit")); + } + } + + [Test] + public void DescribeExtractionFailure_PreservesInnerExceptionChain() + { + // A provider initialization failure arrives as TypeInitializationException wrapping + // the real cause; the inner chain is the only thing that identifies it. + Exception exception = new TypeInitializationException( + "System.Data.SQLite.UnsafeNativeMethods", + new DllNotFoundException("Unable to load DLL 'SQLite.Interop.dll'.")); + + string detail = OpenStudioSimulationRunner.DescribeExtractionFailure(exception, @"C:\runs\eplusout.sql"); + + Assert.That(detail, Does.Contain("System.TypeInitializationException")); + Assert.That(detail, Does.Contain("->"), "The inner chain must be rendered, not dropped"); + Assert.That(detail, Does.Contain("System.DllNotFoundException")); + Assert.That(detail, Does.Contain("SQLite.Interop.dll")); + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/C8/SurfaceWindingTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/C8/SurfaceWindingTests.cs new file mode 100644 index 0000000..05974c1 --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/C8/SurfaceWindingTests.cs @@ -0,0 +1,112 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using SAM.Geometry.Spatial; +using System; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// C8: surface winding invariants. Every OpenStudio Surface must be wound so its outward + /// normal points OUT of the space, and every SubSurface must agree with its host. + /// + /// Background — a real model produced 12 severe "checkSubSurfAzTiltNorm: Outward facing + /// angle of subsurface differs more than 90.0 degrees from base surface" errors and + /// EnergyPlus terminated before simulating. Panel conversion took the Face3D external-edge + /// vertex order as-is while aperture conversion re-wound to the panel's outward normal, so + /// where the two disagreed the host and its window ended up exactly 180 degrees apart. The + /// same inversion silently produced "Floor is upside down", "Roof/Ceiling is upside down" + /// and "Indicated Zone Volume <= 0.0" on models with no windows, which corrupts + /// volume-derived quantities instead of failing loudly. + /// + /// SCOPE — read before trusting these as a regression guard. They assert the invariant, but + /// they do NOT reproduce the divergence that broke the real model. Panel.Normal is the + /// PLANE normal, and AdjacencyCluster.UpdateNormals (called by the converter) flips that + /// plane without rewinding the stored boundary; a fixture cannot reproduce that by simply + /// reversing vertices, because Polygon3D re-derives its plane from the points it is given, + /// so the plane normal flips with them and the two never disagree. Reproducing it needs a + /// PlanarBoundary3D whose plane and boundary order are independently set. Until such a + /// fixture exists these tests would still have passed against the broken conversion, and + /// the real cover for that model remains manual verification in Rhino. + /// + [TestFixture] + public class SurfaceWindingTests + { + private static Vector3D OutwardNormal(global::OpenStudio.PlanarSurface planarSurface) + { + global::OpenStudio.Vector3d vector3d = planarSurface.outwardNormal(); + return new Vector3D(vector3d.x(), vector3d.y(), vector3d.z()); + } + + private static Point3D Centroid(global::OpenStudio.PlanarSurface planarSurface) + { + double x = 0, y = 0, z = 0; + int count = 0; + foreach (global::OpenStudio.Point3d point3d in planarSurface.vertices()) + { + x += point3d.x(); + y += point3d.y(); + z += point3d.z(); + count++; + } + + return new Point3D(x / count, y / count, z / count); + } + + [Test] + public void Surfaces_FaceOutOfTheirSpace() + { + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox().ToOpenStudio(); + Assert.That(result?.Model, Is.Not.Null, "Conversion must produce a model"); + + // The fixture box spans x 0-5, y 0-4, z 0-3 — centre (2.5, 2, 1.5). + Point3D centre = new Point3D(2.5, 2, 1.5); + int checkedSurfaces = 0; + + foreach (global::OpenStudio.Surface surface in result.Model.getSurfaces()) + { + Vector3D normal = OutwardNormal(surface); + Point3D centroid = Centroid(surface); + Vector3D outward = new Vector3D(centroid.X - centre.X, centroid.Y - centre.Y, centroid.Z - centre.Z); + + double dot = (normal.X * outward.X) + (normal.Y * outward.Y) + (normal.Z * outward.Z); + Assert.That(dot, Is.GreaterThan(0), + $"Surface '{surface.nameString()}' faces INTO the space — EnergyPlus reports the floor/roof " + + "upside down and computes a zone volume of 0"); + checkedSurfaces++; + } + + Assert.That(checkedSurfaces, Is.EqualTo(6), "One surface per box face"); + } + + [Test] + public void SubSurfaces_AreCoplanarAndCodirectionalWithTheirHost() + { + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox().ToOpenStudio(); + Assert.That(result?.Model, Is.Not.Null); + + int checkedSubSurfaces = 0; + foreach (global::OpenStudio.SubSurface subSurface in result.Model.getSubSurfaces()) + { + global::OpenStudio.OptionalSurface optionalSurface = subSurface.surface(); + Assert.That(optionalSurface.is_initialized(), Is.True, "Every SubSurface must have a host Surface"); + + Vector3D subNormal = OutwardNormal(subSurface); + Vector3D hostNormal = OutwardNormal(optionalSurface.get()); + + double dot = (subNormal.X * hostNormal.X) + (subNormal.Y * hostNormal.Y) + (subNormal.Z * hostNormal.Z); + double angle = Math.Acos(Math.Max(-1.0, Math.Min(1.0, dot))) * 180.0 / Math.PI; + + // EnergyPlus rejects anything beyond 90 degrees with a fatal + // checkSubSurfAzTiltNorm severe; a correct conversion is coplanar (0). + Assert.That(angle, Is.LessThan(1.0), + $"SubSurface '{subSurface.nameString()}' is {angle:F1} deg from its host — EnergyPlus raises " + + "checkSubSurfAzTiltNorm and terminates before simulating"); + checkedSubSurfaces++; + } + + Assert.That(checkedSubSurfaces, Is.EqualTo(1), "The fixture has one window"); + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/Fixtures/AnalyticalModelFixtures.cs b/tests/SAM.Analytical.OpenStudio.Tests/Fixtures/AnalyticalModelFixtures.cs new file mode 100644 index 0000000..367066a --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/Fixtures/AnalyticalModelFixtures.cs @@ -0,0 +1,568 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using SAM.Core; +using SAM.Geometry.Spatial; +using System; +using System.Collections.Generic; +using AnalyticalCreate = SAM.Analytical.Create; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// Deterministic SAM fixture models for the MVP test suite (plan §12). Geometry is metric, + /// axis-aligned and hand-checkable: box A spans x 0–5, box B x 5–10, both y 0–4, z 0–3, + /// sharing the internal wall at x = 5. Box A's south wall carries one 2×1.4 m window. + /// Materials/constructions are physically plausible; wall layers are stored inside → outside + /// (SAM convention): Plasterboard, Insulation, Brick. + /// + public static class AnalyticalModelFixtures + { + /// Opaque wall construction, layers inside → outside: Plasterboard 12.5 mm, Insulation 100 mm, Brick 100 mm. + public static readonly Construction WallConstruction = new Construction(new Guid("11111111-1111-1111-1111-111111111111"), "Fixture Construction", new List + { + new ConstructionLayer("Plasterboard", 0.0125), + new ConstructionLayer("Insulation", 0.1), + new ConstructionLayer("Brick", 0.1), + }); + + /// Double-glazing aperture construction, pane layers inside → outside: Glass 6 mm, Air 12 mm, Glass 6 mm. + public static readonly ApertureConstruction WindowConstruction = new ApertureConstruction(new Guid("22222222-2222-2222-2222-222222222222"), "Fixture Window", ApertureType.Window, new List + { + new ConstructionLayer("Glass", 0.006), + new ConstructionLayer("Air", 0.012), + new ConstructionLayer("Glass", 0.006), + }); + + /// + /// Framed window construction (C3): the fixture glazing panes plus one PVC frame layer + /// (50 mm, λ = 0.17 W/mK → U = 3.4 W/m²K) and an explicit 50 mm DefaultFrameWidth. + /// Requires the "Frame PVC" material — see . + /// + public static ApertureConstruction CreateFramedWindowConstruction(string frameMaterialName = "Frame PVC", double frameWidth = 0.05) + { + ApertureConstruction result = new ApertureConstruction(new Guid("22222222-3333-3333-3333-333333333333"), "Fixture Framed Window", ApertureType.Window, new List + { + new ConstructionLayer("Glass", 0.006), + new ConstructionLayer("Air", 0.012), + new ConstructionLayer("Glass", 0.006), + }, new List + { + new ConstructionLayer(frameMaterialName, frameWidth), + }); + result.SetValue(ApertureConstructionParameter.DefaultFrameWidth, frameWidth); + return result; + } + + /// Opaque wall construction with a gas cavity, layers inside → outside: Plasterboard 12.5 mm, Air Cavity 50 mm (h = 1.25 W/m²K → R = 0.8 m²K/W), Brick 100 mm. + public static readonly Construction CavityWallConstruction = new Construction(new Guid("11111111-2222-2222-2222-222222222222"), "Fixture Cavity Wall", new List + { + new ConstructionLayer("Plasterboard", 0.0125), + new ConstructionLayer("Fixture Air Cavity", 0.05), + new ConstructionLayer("Brick", 0.1), + }); + + /// Gas cavity material with explicit conductance h [W/m²K] (R = 1/h m²K/W) — mirrors the real AR90UP 50 mm materials. + public static GasMaterial CreateCavityGasMaterial(double heatTransferCoefficient = 1.25) + { + GasMaterial result = new GasMaterial(new Guid("33333333-0000-0000-0000-000000000006"), "Fixture Air Cavity"); + result.SetValue(GasMaterialParameter.HeatTransferCoefficient, heatTransferCoefficient); + result.SetValue(GasMaterialParameter.DefaultGasType, "Air"); + return result; + } + + private static Point3D P(double x, double y, double z) + { + return new Point3D(x, y, z); + } + + private static Face3D F(params Point3D[] point3Ds) + { + return new Face3D(new Polygon3D(point3Ds)); + } + + /// + /// Material library backing the fixture constructions: Brick, Insulation, Plasterboard + /// (opaque), Glass (transparent), Air (gas). Values are round, physically plausible and + /// asserted by the M4 tests. adds the PVC frame + /// material (λ = 0.17 W/mK, solar/light reflectance 0.4) used by the framed window. + /// + public static MaterialLibrary CreateMaterialLibrary(bool includeFrameMaterial = false) + { + OpaqueMaterial brick = new OpaqueMaterial(new Guid("33333333-0000-0000-0000-000000000001"), "Brick", "Brick", "Fixture brick", 0.84, 1700, 800); + brick.SetValue(OpaqueMaterialParameter.ExternalEmissivity, 0.9); + brick.SetValue(OpaqueMaterialParameter.ExternalSolarReflectance, 0.3); + brick.SetValue(OpaqueMaterialParameter.ExternalLightReflectance, 0.3); + + OpaqueMaterial insulation = new OpaqueMaterial(new Guid("33333333-0000-0000-0000-000000000002"), "Insulation", "Insulation", "Fixture insulation", 0.035, 25, 1400); + insulation.SetValue(OpaqueMaterialParameter.ExternalEmissivity, 0.9); + insulation.SetValue(OpaqueMaterialParameter.ExternalSolarReflectance, 0.3); + insulation.SetValue(OpaqueMaterialParameter.ExternalLightReflectance, 0.3); + + OpaqueMaterial plasterboard = new OpaqueMaterial(new Guid("33333333-0000-0000-0000-000000000003"), "Plasterboard", "Plasterboard", "Fixture plasterboard", 0.25, 900, 1000); + plasterboard.SetValue(OpaqueMaterialParameter.ExternalEmissivity, 0.9); + plasterboard.SetValue(OpaqueMaterialParameter.ExternalSolarReflectance, 0.5); + plasterboard.SetValue(OpaqueMaterialParameter.ExternalLightReflectance, 0.5); + + TransparentMaterial glass = new TransparentMaterial(new Guid("33333333-0000-0000-0000-000000000004"), "Glass", "Glass", "Fixture glass", 1.0, 2500, 840); + glass.SetValue(TransparentMaterialParameter.SolarTransmittance, 0.7); + glass.SetValue(TransparentMaterialParameter.InternalSolarReflectance, 0.07); + glass.SetValue(TransparentMaterialParameter.ExternalSolarReflectance, 0.07); + glass.SetValue(TransparentMaterialParameter.LightTransmittance, 0.8); + glass.SetValue(TransparentMaterialParameter.InternalLightReflectance, 0.07); + glass.SetValue(TransparentMaterialParameter.ExternalLightReflectance, 0.07); + glass.SetValue(TransparentMaterialParameter.InternalEmissivity, 0.84); + glass.SetValue(TransparentMaterialParameter.ExternalEmissivity, 0.84); + + GasMaterial air = new GasMaterial(new Guid("33333333-0000-0000-0000-000000000005"), "Air"); + + MaterialLibrary result = new MaterialLibrary("Fixture Material Library"); + result.Add(brick); + result.Add(insulation); + result.Add(plasterboard); + result.Add(glass); + result.Add(air); + + if (includeFrameMaterial) + { + OpaqueMaterial frame = new OpaqueMaterial(new Guid("33333333-0000-0000-0000-000000000007"), "Frame PVC", "Frame", "Fixture PVC frame", 0.17, 1400, 900); + frame.SetValue(OpaqueMaterialParameter.ExternalEmissivity, 0.9); + frame.SetValue(OpaqueMaterialParameter.ExternalSolarReflectance, 0.4); + frame.SetValue(OpaqueMaterialParameter.ExternalLightReflectance, 0.4); + result.Add(frame); + } + + return result; + } + + /// + /// Office-hours (08:00–17:59) fraction profiles, constant equipment/infiltration and + /// 21/25 °C setpoint profiles backing the fixture internal condition. + /// + public static ProfileLibrary CreateProfileLibrary(double heatingSetpoint = 21, double coolingSetpoint = 25) + { + double[] officeHours = new double[24]; + for (int i = 8; i <= 17; i++) + { + officeHours[i] = 1; + } + + double[] alwaysOn = new double[24]; + double[] heating = new double[24]; + double[] cooling = new double[24]; + for (int i = 0; i < 24; i++) + { + alwaysOn[i] = 1; + heating[i] = heatingSetpoint; + cooling[i] = coolingSetpoint; + } + + ProfileLibrary result = new ProfileLibrary("Fixture Profile Library"); + result.Add(new Profile("Office Occupancy", ProfileType.Occupancy, officeHours)); + result.Add(new Profile("Office Lighting", ProfileType.Lighting, officeHours)); + result.Add(new Profile("Office Equipment", ProfileType.EquipmentSensible, alwaysOn)); + result.Add(new Profile("Office Infiltration", ProfileType.Infiltration, alwaysOn)); + result.Add(new Profile("Office Heating", ProfileType.Heating, heating)); + result.Add(new Profile("Office Cooling", ProfileType.Cooling, cooling)); + return result; + } + + /// + /// Conditioned office internal condition: 10 m²/person, 75/55 W sensible/latent per + /// person, 8 W/m² lighting, 12 W/m² equipment, 0.5 ACH infiltration, 0.02 m³/s outdoor + /// air, 21/25 °C setpoints; profile references into . + /// + public static InternalCondition CreateOfficeInternalCondition() + { + InternalCondition result = new InternalCondition(new Guid("44444444-0000-0000-0000-000000000001"), "Office"); + result.SetValue(InternalConditionParameter.AreaPerPerson, 10.0); + result.SetValue(InternalConditionParameter.OccupancySensibleGainPerPerson, 75.0); + result.SetValue(InternalConditionParameter.OccupancyLatentGainPerPerson, 55.0); + result.SetValue(InternalConditionParameter.LightingGainPerArea, 8.0); + result.SetValue(InternalConditionParameter.EquipmentSensibleGainPerArea, 12.0); + result.SetValue(InternalConditionParameter.InfiltrationAirChangesPerHour, 0.5); + result.SetValue(InternalConditionParameter.OccupancyProfileName, "Office Occupancy"); + result.SetValue(InternalConditionParameter.LightingProfileName, "Office Lighting"); + result.SetValue(InternalConditionParameter.EquipmentSensibleProfileName, "Office Equipment"); + result.SetValue(InternalConditionParameter.InfiltrationProfileName, "Office Infiltration"); + result.SetValue(InternalConditionParameter.HeatingProfileName, "Office Heating"); + result.SetValue(InternalConditionParameter.CoolingProfileName, "Office Cooling"); + return result; + } + + /// + /// Two adjacent boxes sharing one internal wall; box A has a window in its south wall. + /// 2 spaces (both conditioned offices sharing one InternalCondition, unless + /// ), 11 panels (12 OpenStudio surfaces once the + /// shared wall is duplicated per side), 1 aperture, full material and profile libraries. + /// replaces the shared wall by a construction-less + /// Air panel (PanelType.Air → OS:Construction:AirBoundary). + /// + public static AnalyticalModel TwoAdjacentBoxes(bool spaceBUnconditioned = false, double? spaceBVolume = null, bool sharedWallWindow = false, bool sharedWallIsAir = false) + { + AdjacencyCluster adjacencyCluster = new AdjacencyCluster(); + + InternalCondition officeInternalCondition = CreateOfficeInternalCondition(); + + Space spaceA = new Space(new Guid("aaaaaaaa-0000-0000-0000-000000000001"), "Space A", P(2.5, 2, 1.5)); + spaceA.SetValue(SpaceParameter.Area, 20.0); + spaceA.SetValue(SpaceParameter.Volume, 60.0); + spaceA.SetValue(SpaceParameter.OutsideSupplyAirFlow, 0.02); + spaceA.InternalCondition = officeInternalCondition; + + Space spaceB = new Space(new Guid("bbbbbbbb-0000-0000-0000-000000000002"), "Space B", P(7.5, 2, 1.5)); + spaceB.SetValue(SpaceParameter.Area, 20.0); + spaceB.SetValue(SpaceParameter.Volume, spaceBVolume ?? 60.0); + spaceB.SetValue(SpaceParameter.OutsideSupplyAirFlow, 0.02); + spaceB.InternalCondition = spaceBUnconditioned ? new InternalCondition("Office Unconditioned", officeInternalCondition) : officeInternalCondition; + + adjacencyCluster.AddObject(spaceA); + adjacencyCluster.AddObject(spaceB); + + Panel floorA = AnalyticalCreate.Panel(WallConstruction, PanelType.SlabOnGrade, F(P(0, 0, 0), P(5, 0, 0), P(5, 4, 0), P(0, 4, 0))); + Panel roofA = AnalyticalCreate.Panel(WallConstruction, PanelType.Roof, F(P(0, 0, 3), P(5, 0, 3), P(5, 4, 3), P(0, 4, 3))); + Panel wallSouthA = AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(0, 0, 0), P(5, 0, 0), P(5, 0, 3), P(0, 0, 3))); + Panel wallWestA = AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(0, 0, 0), P(0, 4, 0), P(0, 4, 3), P(0, 0, 3))); + Panel wallNorthA = AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(0, 4, 0), P(5, 4, 0), P(5, 4, 3), P(0, 4, 3))); + + Panel wallShared = sharedWallIsAir + ? AnalyticalCreate.Panel(null, PanelType.Air, F(P(5, 0, 0), P(5, 4, 0), P(5, 4, 3), P(5, 0, 3))) + : AnalyticalCreate.Panel(WallConstruction, PanelType.WallInternal, F(P(5, 0, 0), P(5, 4, 0), P(5, 4, 3), P(5, 0, 3))); + + Panel floorB = AnalyticalCreate.Panel(WallConstruction, PanelType.SlabOnGrade, F(P(5, 0, 0), P(10, 0, 0), P(10, 4, 0), P(5, 4, 0))); + Panel roofB = AnalyticalCreate.Panel(WallConstruction, PanelType.Roof, F(P(5, 0, 3), P(10, 0, 3), P(10, 4, 3), P(5, 4, 3))); + Panel wallSouthB = AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(5, 0, 0), P(10, 0, 0), P(10, 0, 3), P(5, 0, 3))); + Panel wallEastB = AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(10, 0, 0), P(10, 4, 0), P(10, 4, 3), P(10, 0, 3))); + Panel wallNorthB = AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(5, 4, 0), P(10, 4, 0), P(10, 4, 3), P(5, 4, 3))); + + Aperture window = AnalyticalCreate.Aperture(WindowConstruction, F(P(1, 0, 0.8), P(3, 0, 0.8), P(3, 0, 2.2), P(1, 0, 2.2))); + wallSouthA.AddAperture(window); + + if (sharedWallWindow) + { + wallShared.AddAperture(AnalyticalCreate.Aperture(WindowConstruction, F(P(5, 1, 0.8), P(5, 3, 0.8), P(5, 3, 2.2), P(5, 1, 2.2)))); + } + + List panelsA = new List { floorA, roofA, wallSouthA, wallWestA, wallNorthA, wallShared }; + List panelsB = new List { floorB, roofB, wallSouthB, wallEastB, wallNorthB, wallShared }; + + foreach (Panel panel in panelsA) + { + adjacencyCluster.AddObject(panel); + adjacencyCluster.AddRelation(spaceA, panel); + } + + foreach (Panel panel in panelsB) + { + if (panel != wallShared) + { + adjacencyCluster.AddObject(panel); + } + + adjacencyCluster.AddRelation(spaceB, panel); + } + + return new AnalyticalModel("Two Box Model", "MVP two adjacent boxes fixture", null, null, adjacencyCluster, CreateMaterialLibrary(), CreateProfileLibrary()); + } + + /// + /// One-zone box (x 0–5, y 0–4, z 0–3) with an optional south window; all panels use the + /// given construction (fixture default when null). Used by simulation and failure-policy + /// tests. + /// + public static AnalyticalModel SingleBox(Construction wallConstruction = null, bool includeWindow = true, bool withProfiles = true, InternalCondition internalConditionOverride = null, ProfileLibrary profileLibraryOverride = null, ApertureConstruction apertureConstructionOverride = null, bool includeFrameMaterial = false) + { + Construction construction = wallConstruction ?? WallConstruction; + + AdjacencyCluster adjacencyCluster = new AdjacencyCluster(); + + Space space = new Space(new Guid("cccccccc-0000-0000-0000-000000000001"), "Space Single", P(2.5, 2, 1.5)); + space.SetValue(SpaceParameter.Area, 20.0); + space.SetValue(SpaceParameter.Volume, 60.0); + space.SetValue(SpaceParameter.OutsideSupplyAirFlow, 0.02); + space.InternalCondition = internalConditionOverride ?? CreateOfficeInternalCondition(); + adjacencyCluster.AddObject(space); + + List panels = new List + { + AnalyticalCreate.Panel(construction, PanelType.SlabOnGrade, F(P(0, 0, 0), P(5, 0, 0), P(5, 4, 0), P(0, 4, 0))), + AnalyticalCreate.Panel(construction, PanelType.Roof, F(P(0, 0, 3), P(5, 0, 3), P(5, 4, 3), P(0, 4, 3))), + AnalyticalCreate.Panel(construction, PanelType.WallExternal, F(P(0, 0, 0), P(5, 0, 0), P(5, 0, 3), P(0, 0, 3))), + AnalyticalCreate.Panel(construction, PanelType.WallExternal, F(P(0, 0, 0), P(0, 4, 0), P(0, 4, 3), P(0, 0, 3))), + AnalyticalCreate.Panel(construction, PanelType.WallExternal, F(P(0, 4, 0), P(5, 4, 0), P(5, 4, 3), P(0, 4, 3))), + AnalyticalCreate.Panel(construction, PanelType.WallExternal, F(P(5, 0, 0), P(5, 4, 0), P(5, 4, 3), P(5, 0, 3))), + }; + + if (includeWindow) + { + panels[2].AddAperture(AnalyticalCreate.Aperture(apertureConstructionOverride ?? WindowConstruction, F(P(1, 0, 0.8), P(3, 0, 0.8), P(3, 0, 2.2), P(1, 0, 2.2)))); + } + + foreach (Panel panel in panels) + { + adjacencyCluster.AddObject(panel); + adjacencyCluster.AddRelation(space, panel); + } + + return new AnalyticalModel("Single Box Model", "MVP one-zone box fixture", null, null, adjacencyCluster, CreateMaterialLibrary(includeFrameMaterial), withProfiles ? (profileLibraryOverride ?? CreateProfileLibrary()) : new ProfileLibrary("Empty Profile Library")); + } + + /// + /// Two vertically stacked boxes (A: z 0–3, C: z 3–6, both 5×4 m) sharing an internal + /// floor at z = 3. Exercises BuildingStory assignment and the floor/ceiling + /// surface-type rule on the shared panel. Both spaces are conditioned offices. + /// + public static AnalyticalModel TwoStackedBoxes() + { + AdjacencyCluster adjacencyCluster = new AdjacencyCluster(); + + InternalCondition officeInternalCondition = CreateOfficeInternalCondition(); + + Space spaceA = new Space(new Guid("aaaaaaaa-0000-0000-0000-000000000011"), "Space Lower", P(2.5, 2, 1.5)); + spaceA.SetValue(SpaceParameter.Area, 20.0); + spaceA.SetValue(SpaceParameter.Volume, 60.0); + spaceA.InternalCondition = officeInternalCondition; + + Space spaceC = new Space(new Guid("cccccccc-0000-0000-0000-000000000012"), "Space Upper", P(2.5, 2, 4.5)); + spaceC.SetValue(SpaceParameter.Area, 20.0); + spaceC.SetValue(SpaceParameter.Volume, 60.0); + spaceC.InternalCondition = officeInternalCondition; + + adjacencyCluster.AddObject(spaceA); + adjacencyCluster.AddObject(spaceC); + + Panel sharedFloor = AnalyticalCreate.Panel(WallConstruction, PanelType.FloorInternal, F(P(0, 0, 3), P(5, 0, 3), P(5, 4, 3), P(0, 4, 3))); + + List panelsA = new List + { + AnalyticalCreate.Panel(WallConstruction, PanelType.SlabOnGrade, F(P(0, 0, 0), P(5, 0, 0), P(5, 4, 0), P(0, 4, 0))), + AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(0, 0, 0), P(5, 0, 0), P(5, 0, 3), P(0, 0, 3))), + AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(0, 0, 0), P(0, 4, 0), P(0, 4, 3), P(0, 0, 3))), + AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(0, 4, 0), P(5, 4, 0), P(5, 4, 3), P(0, 4, 3))), + AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(5, 0, 0), P(5, 4, 0), P(5, 4, 3), P(5, 0, 3))), + sharedFloor, + }; + + List panelsC = new List + { + AnalyticalCreate.Panel(WallConstruction, PanelType.Roof, F(P(0, 0, 6), P(5, 0, 6), P(5, 4, 6), P(0, 4, 6))), + AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(0, 0, 3), P(5, 0, 3), P(5, 0, 6), P(0, 0, 6))), + AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(0, 0, 3), P(0, 4, 3), P(0, 4, 6), P(0, 0, 6))), + AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(0, 4, 3), P(5, 4, 3), P(5, 4, 6), P(0, 4, 6))), + AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(5, 0, 3), P(5, 4, 3), P(5, 4, 6), P(5, 0, 6))), + sharedFloor, + }; + + foreach (Panel panel in panelsA) + { + adjacencyCluster.AddObject(panel); + adjacencyCluster.AddRelation(spaceA, panel); + } + + foreach (Panel panel in panelsC) + { + if (panel != sharedFloor) + { + adjacencyCluster.AddObject(panel); + } + + adjacencyCluster.AddRelation(spaceC, panel); + } + + return new AnalyticalModel("Two Stacked Box Model", "MVP two-level fixture", null, null, adjacencyCluster, CreateMaterialLibrary(), CreateProfileLibrary()); + } + + /// + /// One-zone box whose floor polygon carries a collinear mid-edge vertex and a duplicate + /// closing vertex — exercises vertex cleaning (SAM-OS-GEO-002 warning, unchanged area). + /// + public static AnalyticalModel IrregularPlanarBox() + { + AdjacencyCluster adjacencyCluster = new AdjacencyCluster(); + + Space space = new Space(new Guid("dddddddd-0000-0000-0000-000000000001"), "Space Irregular", P(2.5, 2, 1.5)); + space.SetValue(SpaceParameter.Area, 20.0); + space.SetValue(SpaceParameter.Volume, 60.0); + space.InternalCondition = CreateOfficeInternalCondition(); + adjacencyCluster.AddObject(space); + + List panels = new List + { + AnalyticalCreate.Panel(WallConstruction, PanelType.SlabOnGrade, F(P(0, 0, 0), P(2.5, 0, 0), P(5, 0, 0), P(5, 4, 0), P(0, 4, 0), P(0, 0, 0))), + AnalyticalCreate.Panel(WallConstruction, PanelType.Roof, F(P(0, 0, 3), P(5, 0, 3), P(5, 4, 3), P(0, 4, 3))), + AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(0, 0, 0), P(5, 0, 0), P(5, 0, 3), P(0, 0, 3))), + AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(0, 0, 0), P(0, 4, 0), P(0, 4, 3), P(0, 0, 3))), + AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(0, 4, 0), P(5, 4, 0), P(5, 4, 3), P(0, 4, 3))), + AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(5, 0, 0), P(5, 4, 0), P(5, 4, 3), P(5, 0, 3))), + }; + + foreach (Panel panel in panels) + { + adjacencyCluster.AddObject(panel); + adjacencyCluster.AddRelation(space, panel); + } + + return new AnalyticalModel("Irregular Box Model", "MVP polygon-cleaning fixture", null, null, adjacencyCluster, CreateMaterialLibrary(), CreateProfileLibrary()); + } + + /// + /// One-zone box with one degenerate (near-zero-area sliver) wall panel — exercises the + /// failure policy: SAM-OS-GEO-001 error, surface skipped, result invalid, no repair. + /// + public static AnalyticalModel DegeneratePanelBox() + { + AdjacencyCluster adjacencyCluster = new AdjacencyCluster(); + + Space space = new Space(new Guid("eeeeeeee-0000-0000-0000-000000000001"), "Space Degenerate", P(2.5, 2, 1.5)); + space.SetValue(SpaceParameter.Area, 20.0); + space.SetValue(SpaceParameter.Volume, 60.0); + space.InternalCondition = CreateOfficeInternalCondition(); + adjacencyCluster.AddObject(space); + + List panels = new List + { + AnalyticalCreate.Panel(WallConstruction, PanelType.SlabOnGrade, F(P(0, 0, 0), P(5, 0, 0), P(5, 4, 0), P(0, 4, 0))), + AnalyticalCreate.Panel(WallConstruction, PanelType.Roof, F(P(0, 0, 3), P(5, 0, 3), P(5, 4, 3), P(0, 4, 3))), + AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(0, 0, 0), P(5, 0, 0), P(5, 0, 3), P(0, 0, 3))), + AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(0, 0, 0), P(0, 4, 0), P(0, 4, 3), P(0, 0, 3))), + AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(0, 4, 0), P(5, 4, 0), P(5, 4, 3), P(0, 4, 3))), + // degenerate sliver: 5 m long, 0.00001 m tall — area 4e-5 m², below the 1e-4 m² minimum + AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(5, 0, 0), P(5, 4, 0), P(5, 4, 0.00001), P(5, 0, 0.00001))), + }; + + foreach (Panel panel in panels) + { + adjacencyCluster.AddObject(panel); + adjacencyCluster.AddRelation(space, panel); + } + + return new AnalyticalModel("Degenerate Box Model", "MVP failure-policy fixture", null, null, adjacencyCluster, CreateMaterialLibrary(), CreateProfileLibrary()); + } + + /// + /// One-zone box whose opaque wall construction carries a 50 mm gas cavity + /// (h = 1.25 W/m²K → R = 0.8 m²K/W) — reduced reproduction of the real-model failure + /// (review P1-06). An optional second gas material can be added to the library. + /// + public static AnalyticalModel OpaqueAirGapBox(double heatTransferCoefficient = 1.25, GasMaterial additionalGasMaterial = null, bool includeWindow = true) + { + AdjacencyCluster adjacencyCluster = new AdjacencyCluster(); + + Space space = new Space(new Guid("ffffffff-0000-0000-0000-000000000001"), "Space AirGap", P(2.5, 2, 1.5)); + space.SetValue(SpaceParameter.Area, 20.0); + space.SetValue(SpaceParameter.Volume, 60.0); + space.SetValue(SpaceParameter.OutsideSupplyAirFlow, 0.02); + space.InternalCondition = CreateOfficeInternalCondition(); + adjacencyCluster.AddObject(space); + + List panels = new List + { + AnalyticalCreate.Panel(CavityWallConstruction, PanelType.SlabOnGrade, F(P(0, 0, 0), P(5, 0, 0), P(5, 4, 0), P(0, 4, 0))), + AnalyticalCreate.Panel(CavityWallConstruction, PanelType.Roof, F(P(0, 0, 3), P(5, 0, 3), P(5, 4, 3), P(0, 4, 3))), + AnalyticalCreate.Panel(CavityWallConstruction, PanelType.WallExternal, F(P(0, 0, 0), P(5, 0, 0), P(5, 0, 3), P(0, 0, 3))), + AnalyticalCreate.Panel(CavityWallConstruction, PanelType.WallExternal, F(P(0, 0, 0), P(0, 4, 0), P(0, 4, 3), P(0, 0, 3))), + AnalyticalCreate.Panel(CavityWallConstruction, PanelType.WallExternal, F(P(0, 4, 0), P(5, 4, 0), P(5, 4, 3), P(0, 4, 3))), + AnalyticalCreate.Panel(CavityWallConstruction, PanelType.WallExternal, F(P(5, 0, 0), P(5, 4, 0), P(5, 4, 3), P(5, 0, 3))), + }; + + if (includeWindow) + { + panels[2].AddAperture(AnalyticalCreate.Aperture(WindowConstruction, F(P(1, 0, 0.8), P(3, 0, 0.8), P(3, 0, 2.2), P(1, 0, 2.2)))); + } + + foreach (Panel panel in panels) + { + adjacencyCluster.AddObject(panel); + adjacencyCluster.AddRelation(space, panel); + } + + MaterialLibrary materialLibrary = CreateMaterialLibrary(); + materialLibrary.Add(CreateCavityGasMaterial(heatTransferCoefficient)); + if (additionalGasMaterial != null) + { + materialLibrary.Add(additionalGasMaterial); + } + + return new AnalyticalModel("Opaque AirGap Box Model", "MVP opaque air-gap fixture (review P1-06)", null, null, adjacencyCluster, materialLibrary, CreateProfileLibrary()); + } + + /// + /// One-zone box whose south wall carries a 1.6 mm wide, 2.125 m tall sliver door — a + /// reduced reproduction of the real-model EnergyPlus failure ("degenerate surface" + /// severe): the aperture passes the converter's own cleaning and minimum-area check + /// (area ≈ 0.0034 m²) but collapses below three sides under the EnergyPlus 0.01 m + /// vertex-proximity rule. + /// + public static AnalyticalModel SliverApertureBox() + { + AdjacencyCluster adjacencyCluster = new AdjacencyCluster(); + + Space space = new Space(new Guid("abababab-0000-0000-0000-000000000001"), "Space Sliver", P(2.5, 2, 1.5)); + space.SetValue(SpaceParameter.Area, 20.0); + space.SetValue(SpaceParameter.Volume, 60.0); + space.SetValue(SpaceParameter.OutsideSupplyAirFlow, 0.02); + space.InternalCondition = CreateOfficeInternalCondition(); + adjacencyCluster.AddObject(space); + + Panel wallSouth = AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(0, 0, 0), P(5, 0, 0), P(5, 0, 3), P(0, 0, 3))); + wallSouth.AddAperture(AnalyticalCreate.Aperture(WindowConstruction, F(P(1, 0, 0.8), P(1.0016, 0, 0.8), P(1.0016, 0, 2.925), P(1, 0, 2.925)))); + + List panels = new List + { + AnalyticalCreate.Panel(WallConstruction, PanelType.SlabOnGrade, F(P(0, 0, 0), P(5, 0, 0), P(5, 4, 0), P(0, 4, 0))), + AnalyticalCreate.Panel(WallConstruction, PanelType.Roof, F(P(0, 0, 3), P(5, 0, 3), P(5, 4, 3), P(0, 4, 3))), + wallSouth, + AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(0, 0, 0), P(0, 4, 0), P(0, 4, 3), P(0, 0, 3))), + AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(0, 4, 0), P(5, 4, 0), P(5, 4, 3), P(0, 4, 3))), + AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(5, 0, 0), P(5, 4, 0), P(5, 4, 3), P(5, 0, 3))), + }; + + foreach (Panel panel in panels) + { + adjacencyCluster.AddObject(panel); + adjacencyCluster.AddRelation(space, panel); + } + + return new AnalyticalModel("Sliver Aperture Box Model", "EnergyPlus degenerate-subsurface fixture", null, null, adjacencyCluster, CreateMaterialLibrary(), CreateProfileLibrary()); + } + + /// + /// One-zone L-shaped box (L footprint 10×8 m less a 5×4 m corner, height 3 m) — the + /// roof is non-convex and outdoors, so it casts shadows: with PolygonClipping the + /// conversion names it (SAM-OS-GEO-003); with PixelCounting it stays silent. The + /// slab-on-grade floor is ground-coupled and the six walls are convex — exactly one + /// non-convex casting surface. + /// + public static AnalyticalModel LShapedBox() + { + AdjacencyCluster adjacencyCluster = new AdjacencyCluster(); + + Space space = new Space(new Guid("acacacac-0000-0000-0000-000000000001"), "Space L", P(2.5, 2, 1.5)); + space.SetValue(SpaceParameter.Area, 60.0); + space.SetValue(SpaceParameter.Volume, 180.0); + space.SetValue(SpaceParameter.OutsideSupplyAirFlow, 0.02); + space.InternalCondition = CreateOfficeInternalCondition(); + adjacencyCluster.AddObject(space); + + List panels = new List + { + AnalyticalCreate.Panel(WallConstruction, PanelType.SlabOnGrade, F(P(0, 0, 0), P(10, 0, 0), P(10, 4, 0), P(5, 4, 0), P(5, 8, 0), P(0, 8, 0))), + AnalyticalCreate.Panel(WallConstruction, PanelType.Roof, F(P(0, 0, 3), P(10, 0, 3), P(10, 4, 3), P(5, 4, 3), P(5, 8, 3), P(0, 8, 3))), + AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(0, 0, 0), P(10, 0, 0), P(10, 0, 3), P(0, 0, 3))), + AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(10, 0, 0), P(10, 4, 0), P(10, 4, 3), P(10, 0, 3))), + AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(10, 4, 0), P(5, 4, 0), P(5, 4, 3), P(10, 4, 3))), + AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(5, 4, 0), P(5, 8, 0), P(5, 8, 3), P(5, 4, 3))), + AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(5, 8, 0), P(0, 8, 0), P(0, 8, 3), P(5, 8, 3))), + AnalyticalCreate.Panel(WallConstruction, PanelType.WallExternal, F(P(0, 8, 0), P(0, 0, 0), P(0, 0, 3), P(0, 8, 3))), + }; + + foreach (Panel panel in panels) + { + adjacencyCluster.AddObject(panel); + adjacencyCluster.AddRelation(space, panel); + } + + return new AnalyticalModel("L-Shaped Box Model", "Non-convex casting-surface fixture", null, null, adjacencyCluster, CreateMaterialLibrary(), CreateProfileLibrary()); + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/M0/OpenStudioSmokeTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/M0/OpenStudioSmokeTests.cs new file mode 100644 index 0000000..36ce503 --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/M0/OpenStudioSmokeTests.cs @@ -0,0 +1,137 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// M0 toolchain smoke tests: prove the OpenStudio 3.10.0 C# bindings load and work + /// under net8.0 x64 outside Rhino, and that the installed OpenStudio CLI can open a + /// generated OSM (SDK and CLI versions aligned per the implementation plan, section 11.1). + /// + [TestFixture] + public class OpenStudioSmokeTests + { + [Test] + public void OpenStudio_CreateSaveReload_RoundTrips() + { + string path = Path.Combine(TestContext.CurrentContext.WorkDirectory, "SAM_OpenStudio_Smoke.osm"); + if (File.Exists(path)) + { + File.Delete(path); + } + + CreateSmokeModel(path, "SAM_Space_Smoke_00000001", "SAM_ThermalZone_Smoke_00000001"); + Assert.That(File.Exists(path), Is.True, "OSM file was not written"); + + global::OpenStudio.Model reloaded = Core.OpenStudio.Create.Model(path); + Assert.That(reloaded, Is.Not.Null, "SAM.Core.OpenStudio.Create.Model failed to reload the OSM"); + + List spaceNames = new List(); + foreach (global::OpenStudio.Space space in reloaded.getSpaces()) + { + spaceNames.Add(space.nameString()); + } + + Assert.That(spaceNames.Count, Is.EqualTo(1), "Reloaded model does not contain exactly one Space"); + Assert.That(spaceNames[0], Is.EqualTo("SAM_Space_Smoke_00000001"), "Space name was not preserved"); + + int thermalZoneCount = 0; + foreach (global::OpenStudio.ThermalZone thermalZone in reloaded.getThermalZones()) + { + thermalZoneCount++; + } + + Assert.That(thermalZoneCount, Is.EqualTo(1), "Reloaded model does not contain exactly one ThermalZone"); + } + + [Test] + public void OpenStudioCli_Discovered_And_OpensGeneratedOsm() + { + string cliPath = Core.OpenStudio.Query.OpenStudioCliPath(); + Assert.That(cliPath, Is.Not.Null.And.Not.Empty, "OpenStudio CLI not found (searched PATH, direct installations and the ladybug_tools bundle)"); + TestContext.Out.WriteLine($"OpenStudio CLI: {cliPath}"); + + string versionOutput = RunCli(cliPath, new[] { "openstudio_version" }, out int versionExitCode); + Assert.That(versionExitCode, Is.EqualTo(0), $"openstudio_version failed: {versionOutput}"); + TestContext.Out.WriteLine($"OpenStudio CLI version: {versionOutput.Trim()}"); + + string osmPath = Path.Combine(TestContext.CurrentContext.WorkDirectory, "SAM_OpenStudio_CliSmoke.osm"); + if (File.Exists(osmPath)) + { + File.Delete(osmPath); + } + + CreateSmokeModel(osmPath, "SAM_Space_CliSmoke_00000001", "SAM_ThermalZone_CliSmoke_00000001"); + + string rubyScriptPath = Path.Combine(TestContext.CurrentContext.WorkDirectory, "SAM_OpenStudio_CliSmoke.rb"); + string rubyScript = string.Join("\n", new[] + { + "require 'openstudio'", + $"model = OpenStudio::OSVersion::VersionTranslator.new.loadModel(OpenStudio::Path.new('{osmPath.Replace('\\', '/')}'))", + "raise 'load failed' if model.empty?", + "raise 'unexpected space count' unless model.get.getSpaces.size == 1", + "puts 'CLI_SMOKE_OK'" + }); + File.WriteAllText(rubyScriptPath, rubyScript); + + string output = RunCli(cliPath, new[] { "execute_ruby_script", rubyScriptPath }, out int exitCode); + TestContext.Out.WriteLine(output); + Assert.That(exitCode, Is.EqualTo(0), $"OpenStudio CLI could not open the generated OSM: {output}"); + Assert.That(output, Does.Contain("CLI_SMOKE_OK"), "CLI ruby round-trip did not report success"); + } + + private static void CreateSmokeModel(string path, string spaceName, string thermalZoneName) + { + global::OpenStudio.Model model = new global::OpenStudio.Model(); + + global::OpenStudio.Space space = new global::OpenStudio.Space(model); + space.setName(spaceName); + + global::OpenStudio.ThermalZone thermalZone = new global::OpenStudio.ThermalZone(model); + thermalZone.setName(thermalZoneName); + + Assert.That(space.setThermalZone(thermalZone), Is.True, "Space could not be assigned to ThermalZone"); + + bool saved = model.save(global::OpenStudio.OpenStudioUtilitiesCore.toPath(path), true); + Assert.That(saved, Is.True, "Model.save returned false"); + } + + private static string RunCli(string cliPath, IEnumerable arguments, out int exitCode) + { + ProcessStartInfo processStartInfo = new ProcessStartInfo + { + FileName = cliPath, + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true, + CreateNoWindow = true, + }; + + foreach (string argument in arguments) + { + processStartInfo.ArgumentList.Add(argument); + } + + using (Process process = Process.Start(processStartInfo)) + { + string standardOutput = process.StandardOutput.ReadToEnd(); + string standardError = process.StandardError.ReadToEnd(); + bool exited = process.WaitForExit(120000); + if (!exited) + { + process.Kill(); + exitCode = -1; + return "TIMEOUT: " + standardOutput + standardError; + } + + exitCode = process.ExitCode; + return standardOutput + standardError; + } + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/M1/DiagnosticsTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/M1/DiagnosticsTests.cs new file mode 100644 index 0000000..7a67b90 --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/M1/DiagnosticsTests.cs @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// M1: diagnostic aggregation, IsValid and context registration contract tests. + [TestFixture] + public class DiagnosticsTests + { + [Test] + public void Warnings_DoNotInvalidate_ErrorsDo() + { + OpenStudioConversionContext context = new OpenStudioConversionContext(null, new global::OpenStudio.Model()); + + context.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.GeometryVerticesCleaned, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "Removed 2 collinear vertices"); + Assert.That(context.HasErrors, Is.False); + Assert.That(new OpenStudioConversionResult(context).IsValid, Is.True, "Warnings must not invalidate the result"); + + context.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ConstructionMissingLayer, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "Construction layer material not found"); + Assert.That(context.HasErrors, Is.True); + Assert.That(new OpenStudioConversionResult(context).IsValid, Is.False, "Errors must invalidate the result"); + } + + [Test] + public void Result_IsASnapshot_OfDiagnosticsAndObjectMap() + { + OpenStudioConversionContext context = new OpenStudioConversionContext(null, new global::OpenStudio.Model()); + context.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.GeometryVerticesCleaned, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, "First"); + + OpenStudioConversionResult result = new OpenStudioConversionResult(context); + context.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.GeometryVerticesCleaned, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "Second"); + + Assert.That(result.Diagnostics.Count, Is.EqualTo(1), "Result must snapshot diagnostics at creation time"); + Assert.That(result.IsValid, Is.True, "Later context errors must not affect an existing result"); + } + + [Test] + public void Diagnostic_CarriesSamObjectIdentity() + { + OpenStudioConversionContext context = new OpenStudioConversionContext(null, new global::OpenStudio.Model()); + Space space = new Space("Office 04"); + + context.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ScheduleMissingProfile, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "Profile missing", space, "SAM_Space_Office_04_xxxxxxxx"); + + Core.OpenStudio.OpenStudioDiagnostic diagnostic = context.Diagnostics[0]; + Assert.That(diagnostic.SamGuid, Is.EqualTo(space.Guid)); + Assert.That(diagnostic.SamObjectType, Is.EqualTo("Space")); + Assert.That(diagnostic.Code, Is.EqualTo("SAM-OS-SCH-001")); + Assert.That(diagnostic.OpenStudioObjectName, Is.EqualTo("SAM_Space_Office_04_xxxxxxxx")); + } + + [Test] + public void RegisterModelObject_TracksAndRejectsDuplicates() + { + global::OpenStudio.Model model = new global::OpenStudio.Model(); + OpenStudioConversionContext context = new OpenStudioConversionContext(null, model); + + Space samSpace = new Space("Office 04"); + global::OpenStudio.Space openStudioSpace = new global::OpenStudio.Space(model); + openStudioSpace.setName(Core.OpenStudio.Query.OpenStudioName(samSpace)); + + Assert.That(context.RegisterModelObject(samSpace, openStudioSpace), Is.True); + Assert.That(context.RegisterModelObject(samSpace, openStudioSpace), Is.False, "Duplicate registration must be rejected"); + Assert.That(context.References.Count, Is.EqualTo(1)); + Assert.That(context.References.OpenStudioObjectName(samSpace.Guid), Does.StartWith("SAM_Space_Office_04_")); + + Assert.That(context.TryGetModelObject(samSpace.Guid, out global::OpenStudio.Space retrieved), Is.True); + Assert.That(retrieved.nameString(), Is.EqualTo(openStudioSpace.nameString())); + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/M1/NamingTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/M1/NamingTests.cs new file mode 100644 index 0000000..1a1f239 --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/M1/NamingTests.cs @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using System; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// M1: deterministic naming and sanitization contract tests. + [TestFixture] + public class NamingTests + { + [Test] + public void SanitizeName_ReplacesForbiddenAndWhitespace() + { + Assert.That(Core.OpenStudio.Query.SanitizeName("Office 04"), Is.EqualTo("Office_04")); + Assert.That(Core.OpenStudio.Query.SanitizeName("A,B;C!D"), Is.EqualTo("A_B_C_D")); + Assert.That(Core.OpenStudio.Query.SanitizeName(" padded "), Is.EqualTo("padded")); + Assert.That(Core.OpenStudio.Query.SanitizeName("a\r\n\tb"), Is.EqualTo("a_b")); + Assert.That(Core.OpenStudio.Query.SanitizeName("a __ b"), Is.EqualTo("a_b")); + Assert.That(Core.OpenStudio.Query.SanitizeName(""), Is.EqualTo("")); + Assert.That(Core.OpenStudio.Query.SanitizeName(null), Is.Null); + } + + [Test] + public void OpenStudioName_IsDeterministicAndFormatted() + { + Guid guid = new Guid("72a6f932-0000-0000-0000-000000000000"); + + string first = Core.OpenStudio.Query.OpenStudioName("Space", "Office 04", guid); + string second = Core.OpenStudio.Query.OpenStudioName("Space", "Office 04", guid); + + Assert.That(first, Is.EqualTo("SAM_Space_Office_04_72a6f932")); + Assert.That(second, Is.EqualTo(first), "Naming must be deterministic"); + } + + [Test] + public void OpenStudioName_OmitsEmptyName() + { + Guid guid = new Guid("b42bd811-0000-0000-0000-000000000000"); + Assert.That(Core.OpenStudio.Query.OpenStudioName("Surface", null, guid), Is.EqualTo("SAM_Surface_b42bd811")); + Assert.That(Core.OpenStudio.Query.OpenStudioName("Surface", " ", guid), Is.EqualTo("SAM_Surface_b42bd811")); + } + + [Test] + public void OpenStudioName_FromSamObject_UsesTypeNameAndGuid() + { + Space space = new Space("Office 04"); + + string name = Core.OpenStudio.Query.OpenStudioName(space); + + Assert.That(name, Does.StartWith("SAM_Space_Office_04_")); + Assert.That(name, Does.EndWith(space.Guid.ToString("N").Substring(0, 8))); + Assert.That(Core.OpenStudio.Query.OpenStudioName(space), Is.EqualTo(name), "Naming must be deterministic"); + } + + [Test] + public void SanitizeName_RemovesQuotes() + { + // Quotes must never reach OpenStudio object names: they flow into EnergyPlus report + // keys and would break the SQL extraction literals (review P2-02). + string sanitized = Core.OpenStudio.Query.SanitizeName("O'Brien \"Annex\""); + Assert.That(sanitized, Does.Not.Contain("'")); + Assert.That(sanitized, Does.Not.Contain("\"")); + Assert.That(sanitized, Is.EqualTo("O_Brien_Annex")); + } + + [Test] + public void SpaceName_WithApostrophe_ConvertsWithDeterministicName() + { + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox().ToOpenStudio(); + Assert.That(result.IsValid, Is.True); + + Space space = new Space(new System.Guid("12121212-0000-0000-0000-000000000001"), "O'Brien", new Geometry.Spatial.Point3D(0, 0, 0)); + string name = Core.OpenStudio.Query.OpenStudioName(space); + Assert.That(name, Does.Not.Contain("'"), "No apostrophe may survive into an OpenStudio name"); + Assert.That(Core.OpenStudio.Query.OpenStudioName(space), Is.EqualTo(name), "Naming must stay deterministic"); + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/M1/ObjectMapTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/M1/ObjectMapTests.cs new file mode 100644 index 0000000..2bdaf3a --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/M1/ObjectMapTests.cs @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using System; +using System.Collections.Generic; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// M1: duplicate-prevention and traceability contract tests for OpenStudioObjectMap. + [TestFixture] + public class ObjectMapTests + { + [Test] + public void TryAdd_PreventsDuplicatesAndNeverOverwrites() + { + Core.OpenStudio.OpenStudioObjectMap map = new Core.OpenStudio.OpenStudioObjectMap(); + Guid guid = Guid.NewGuid(); + + bool first = map.TryAdd(new Core.OpenStudio.OpenStudioObjectReference(guid, "Space", "SAM_Space_A_00000001")); + bool second = map.TryAdd(new Core.OpenStudio.OpenStudioObjectReference(guid, "Space", "SAM_Space_B_00000002")); + + Assert.That(first, Is.True); + Assert.That(second, Is.False, "Duplicate SAM Guid must be rejected"); + Assert.That(map.Count, Is.EqualTo(1)); + Assert.That(map.OpenStudioObjectName(guid), Is.EqualTo("SAM_Space_A_00000001"), "Existing mapping must never be overwritten"); + } + + [Test] + public void TryAdd_RejectsNullAndEmptyNames() + { + Core.OpenStudio.OpenStudioObjectMap map = new Core.OpenStudio.OpenStudioObjectMap(); + + Assert.That(map.TryAdd(null), Is.False); + Assert.That(map.TryAdd(new Core.OpenStudio.OpenStudioObjectReference(Guid.NewGuid(), "Space", " ")), Is.False); + Assert.That(map.Count, Is.EqualTo(0)); + } + + [Test] + public void ToNameDictionary_IsASnapshot() + { + Core.OpenStudio.OpenStudioObjectMap map = new Core.OpenStudio.OpenStudioObjectMap(); + Guid guid = Guid.NewGuid(); + map.TryAdd(new Core.OpenStudio.OpenStudioObjectReference(guid, "Panel", "SAM_Panel_X_00000003")); + + IReadOnlyDictionary snapshot = map.ToNameDictionary(); + map.TryAdd(new Core.OpenStudio.OpenStudioObjectReference(Guid.NewGuid(), "Panel", "SAM_Panel_Y_00000004")); + + Assert.That(snapshot.Count, Is.EqualTo(1), "Snapshot must not grow with the map"); + Assert.That(snapshot[guid], Is.EqualTo("SAM_Panel_X_00000003")); + Assert.That(map.Count, Is.EqualTo(2)); + } + + [Test] + public void TryGetReference_ReturnsRegisteredReference() + { + Core.OpenStudio.OpenStudioObjectMap map = new Core.OpenStudio.OpenStudioObjectMap(); + Guid guid = Guid.NewGuid(); + map.TryAdd(new Core.OpenStudio.OpenStudioObjectReference(guid, "Aperture", "SAM_Aperture_W1_00000005")); + + Assert.That(map.Contains(guid), Is.True); + Assert.That(map.TryGetReference(guid, out Core.OpenStudio.OpenStudioObjectReference reference), Is.True); + Assert.That(reference.SamObjectType, Is.EqualTo("Aperture")); + Assert.That(map.TryGetReference(Guid.NewGuid(), out _), Is.False); + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/M2/GeometryPrimitiveTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/M2/GeometryPrimitiveTests.cs new file mode 100644 index 0000000..04a9921 --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/M2/GeometryPrimitiveTests.cs @@ -0,0 +1,283 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using SAM.Geometry.OpenStudio; +using SAM.Geometry.Spatial; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// M2: SAM → OpenStudio geometry primitive conversion and validation tests (plan §8). + [TestFixture] + public class GeometryPrimitiveTests + { + private const double DistanceTolerance = 1e-6; + private const double AngleTolerance = 0.0349066; + private const double MinimumArea = 0.0001; + + private static List HorizontalFloor() + { + return new List + { + new Point3D(0, 0, 0), + new Point3D(10, 0, 0), + new Point3D(10, 10, 0), + new Point3D(0, 10, 0), + }; + } + + [Test] + public void Point3d_Conversion_PreservesCoordinates() + { + global::OpenStudio.Point3d point3d = new Point3D(1.5, -2.25, 3.125).ToOpenStudio(); + + Assert.That(point3d.x(), Is.EqualTo(1.5)); + Assert.That(point3d.y(), Is.EqualTo(-2.25)); + Assert.That(point3d.z(), Is.EqualTo(3.125)); + + global::OpenStudio.Point3dVector vector = HorizontalFloor().ToOpenStudio(); + Assert.That(vector.Count, Is.EqualTo(4)); + Assert.That(vector[2].x(), Is.EqualTo(10)); + Assert.That(vector[2].y(), Is.EqualTo(10)); + } + + [Test] + public void HorizontalFloor_IsValid_NormalUp() + { + List points = HorizontalFloor(); + + Assert.That(Geometry.OpenStudio.Query.IsPlanar(points, DistanceTolerance), Is.True); + Assert.That(Geometry.OpenStudio.Query.Area(points), Is.EqualTo(100).Within(1e-9)); + Assert.That(Geometry.OpenStudio.Query.Normal(points).Z, Is.GreaterThan(0), "Counterclockwise-from-above floor must have +Z Newell normal"); + Assert.That(Geometry.OpenStudio.Query.ValidatePolygon(points, DistanceTolerance, AngleTolerance, MinimumArea), Is.Empty); + } + + [Test] + public void VerticalWall_IsValid() + { + List points = new List + { + new Point3D(0, 0, 0), + new Point3D(10, 0, 0), + new Point3D(10, 0, 3), + new Point3D(0, 0, 3), + }; + + Assert.That(Geometry.OpenStudio.Query.IsPlanar(points, DistanceTolerance), Is.True); + Assert.That(Geometry.OpenStudio.Query.Area(points), Is.EqualTo(30).Within(1e-9)); + Assert.That(Geometry.OpenStudio.Query.Normal(points).Y, Is.LessThan(0)); + Assert.That(Geometry.OpenStudio.Query.ValidatePolygon(points, DistanceTolerance, AngleTolerance, MinimumArea), Is.Empty); + } + + [Test] + public void SlopingRoof_IsValid() + { + List points = new List + { + new Point3D(0, 0, 0), + new Point3D(10, 0, 0), + new Point3D(10, 10, 5), + new Point3D(0, 10, 5), + }; + + Assert.That(Geometry.OpenStudio.Query.IsPlanar(points, DistanceTolerance), Is.True); + Assert.That(Geometry.OpenStudio.Query.Area(points), Is.EqualTo(10 * Math.Sqrt(125)).Within(1e-9)); + Assert.That(Geometry.OpenStudio.Query.ValidatePolygon(points, DistanceTolerance, AngleTolerance, MinimumArea), Is.Empty); + } + + [Test] + public void ReversedPolygon_IsDetectedByIsClockwise() + { + List counterclockwise = HorizontalFloor(); + List clockwise = new List(counterclockwise); + clockwise.Reverse(); + + Vector3D up = new Vector3D(0, 0, 1); + + Assert.That(Geometry.OpenStudio.Query.IsClockwise(counterclockwise, up), Is.False); + Assert.That(Geometry.OpenStudio.Query.IsClockwise(clockwise, up), Is.True); + Assert.That(Geometry.OpenStudio.Query.Normal(clockwise).Z, Is.LessThan(0)); + } + + [Test] + public void DuplicateVertices_AreRemovedWithWarning() + { + List points = new List + { + new Point3D(0, 0, 0), + new Point3D(10, 0, 0), + new Point3D(10, 0, 0), + new Point3D(10, 10, 0), + new Point3D(0, 10, 0), + new Point3D(0, 0, 0), + }; + + List cleaned = Geometry.OpenStudio.Query.CleanVertices(points, DistanceTolerance, AngleTolerance); + Assert.That(cleaned.Count, Is.EqualTo(4), "Consecutive duplicate and closing vertex must be removed"); + + List diagnostics = Geometry.OpenStudio.Query.ValidatePolygon(points, DistanceTolerance, AngleTolerance, MinimumArea); + Assert.That(diagnostics.Count, Is.EqualTo(1)); + Assert.That(diagnostics[0].Code, Is.EqualTo("SAM-OS-GEO-002")); + Assert.That(diagnostics[0].Severity, Is.EqualTo(Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning)); + } + + [Test] + public void CollinearVertices_AreRemovedWithWarning() + { + List points = new List + { + new Point3D(0, 0, 0), + new Point3D(5, 0, 0), + new Point3D(10, 0, 0), + new Point3D(10, 10, 0), + new Point3D(0, 10, 0), + }; + + List cleaned = Geometry.OpenStudio.Query.CleanVertices(points, DistanceTolerance, AngleTolerance); + Assert.That(cleaned.Count, Is.EqualTo(4), "Collinear mid-edge vertex must be removed"); + Assert.That(Geometry.OpenStudio.Query.Area(cleaned), Is.EqualTo(100).Within(1e-9), "Cleaning must not change the polygon shape"); + + List diagnostics = Geometry.OpenStudio.Query.ValidatePolygon(points, DistanceTolerance, AngleTolerance, MinimumArea); + Assert.That(diagnostics.Count, Is.EqualTo(1)); + Assert.That(diagnostics[0].Code, Is.EqualTo("SAM-OS-GEO-002")); + } + + [Test] + public void TooFewVertices_IsAnError() + { + List points = new List + { + new Point3D(0, 0, 0), + new Point3D(10, 0, 0), + }; + + List diagnostics = Geometry.OpenStudio.Query.ValidatePolygon(points, DistanceTolerance, AngleTolerance, MinimumArea); + + Assert.That(diagnostics.Any(d => d.Code == "SAM-OS-GEO-001" && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error), Is.True); + Assert.That(diagnostics.Any(d => d.Message.Contains("fewer than three")), Is.True); + } + + [Test] + public void NonPlanarBoundary_IsRejectedNotRepaired() + { + List points = new List + { + new Point3D(0, 0, 0), + new Point3D(10, 0, 0), + new Point3D(10, 10, 2), + new Point3D(0, 10, 0), + }; + + Assert.That(Geometry.OpenStudio.Query.IsPlanar(points, 0.001), Is.False); + + List diagnostics = Geometry.OpenStudio.Query.ValidatePolygon(points, DistanceTolerance, AngleTolerance, MinimumArea); + Assert.That(diagnostics.Any(d => d.Code == "SAM-OS-GEO-001" && d.Message.Contains("planar")), Is.True); + } + + [Test] + public void NearZeroArea_IsAnError() + { + List points = new List + { + new Point3D(0, 0, 0), + new Point3D(0.001, 0, 0), + new Point3D(0.001, 0.001, 0), + new Point3D(0, 0.001, 0), + }; + + List diagnostics = Geometry.OpenStudio.Query.ValidatePolygon(points, DistanceTolerance, AngleTolerance, MinimumArea); + + Assert.That(diagnostics.Any(d => d.Code == "SAM-OS-GEO-001" && d.Message.Contains("below the minimum")), Is.True); + } + + [Test] + public void SelfIntersectingPolygon_IsAnError() + { + // Planar star (self-intersecting) with non-zero signed area — area and planarity + // checks alone accept it; the self-intersection check must reject it (review P2-01). + List star = new List + { + new Point3D(0, 0, 0), + new Point3D(10, 0, 0), + new Point3D(3, 8, 0), + new Point3D(5, -4, 0), + new Point3D(7, 8, 0), + }; + + Assert.That(Geometry.OpenStudio.Query.IsSelfIntersecting(star, DistanceTolerance), Is.True); + + List diagnostics = Geometry.OpenStudio.Query.ValidatePolygon(star, DistanceTolerance, AngleTolerance, MinimumArea); + Assert.That(diagnostics.Any(d => d.Code == "SAM-OS-GEO-001" && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error && d.Message.Contains("self-intersect")), Is.True, "A self-intersecting polygon must be rejected, never converted"); + } + + [Test] + public void BowtiePolygon_IsAnError() + { + List bowtie = new List + { + new Point3D(0, 0, 0), + new Point3D(10, 10, 0), + new Point3D(10, 0, 0), + new Point3D(0, 10, 0), + }; + + Assert.That(Geometry.OpenStudio.Query.IsSelfIntersecting(bowtie, DistanceTolerance), Is.True); + } + + [Test] + public void ConcavePolygon_IsAccepted() + { + // L-shaped (concave but non-intersecting) polygon must remain valid. + List lShape = new List + { + new Point3D(0, 0, 0), + new Point3D(10, 0, 0), + new Point3D(10, 5, 0), + new Point3D(5, 5, 0), + new Point3D(5, 10, 0), + new Point3D(0, 10, 0), + }; + + Assert.That(Geometry.OpenStudio.Query.IsSelfIntersecting(lShape, DistanceTolerance), Is.False); + Assert.That(Geometry.OpenStudio.Query.ValidatePolygon(lShape, DistanceTolerance, AngleTolerance, MinimumArea), Is.Empty); + } + + [Test] + public void EnergyPlusSideCount_SliverCollapses_BelowThreeSides() + { + // The HungaryHouse door: a 1.6 mm wide, 2.125 m tall sliver. It survives the + // converter's own cleaning (1e-6 m) but EnergyPlus drops consecutive vertices + // closer than 0.01 m — 4 sides collapse to 2 → degenerate (severe). + List sliverDoor = new List + { + new Point3D(6.036156, 0.424724, 5.125), + new Point3D(6.036156, 0.424724, 3), + new Point3D(6.037758, 0.424724, 3), + new Point3D(6.037758, 0.424724, 5.125), + }; + + Assert.That(Geometry.OpenStudio.Query.EnergyPlusSideCount(sliverDoor), Is.EqualTo(2), "Both 1.6 mm vertex pairs collapse under the EnergyPlus 0.01 m rule"); + Assert.That(Geometry.OpenStudio.Query.EnergyPlusSideCount(HorizontalFloor()), Is.EqualTo(4), "An ordinary rectangle keeps its sides"); + Assert.That(Geometry.OpenStudio.Query.EnergyPlusSideCount(new List { new Point3D(0, 0, 0), new Point3D(1, 0, 0), new Point3D(0, 1, 0) }), Is.EqualTo(3), "A triangle is the last valid polygon"); + Assert.That(Geometry.OpenStudio.Query.EnergyPlusSideCount(null), Is.EqualTo(0)); + } + + [Test] + public void EnergyPlusSideCount_ClosingPairCollapse() + { + // First and last vertices within 0.01 m (the wrap-around edge) also collapse. + List closingSliver = new List + { + new Point3D(0, 0, 0), + new Point3D(2, 0, 0), + new Point3D(2, 0.005, 0), + new Point3D(0, 0.002, 0), + }; + + Assert.That(Geometry.OpenStudio.Query.EnergyPlusSideCount(closingSliver), Is.LessThan(3)); + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/M3/SpacesSurfacesTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/M3/SpacesSurfacesTests.cs new file mode 100644 index 0000000..e30b88f --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/M3/SpacesSurfacesTests.cs @@ -0,0 +1,159 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using System.Collections.Generic; +using System.Linq; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// M3: spaces, stories, zones, surfaces, adjacency and aperture conversion on the two-box fixture. + [TestFixture] + public class SpacesSurfacesTests + { + private OpenStudioConversionResult result; + private global::OpenStudio.Model model; + + [OneTimeSetUp] + public void Convert() + { + result = AnalyticalModelFixtures.TwoAdjacentBoxes().ToOpenStudio(); + Assert.That(result, Is.Not.Null); + model = result.Model; + Assert.That(model, Is.Not.Null); + } + + private List Surfaces() + { + List surfaces = new List(); + foreach (global::OpenStudio.Surface surface in model.getSurfaces()) + { + surfaces.Add(surface); + } + + return surfaces; + } + + [Test] + public void Converts_SpacesZonesStoriesSurfacesSubSurfaces() + { + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in result.Diagnostics) + { + TestContext.Out.WriteLine(diagnostic.ToString()); + } + + Assert.That(result.IsValid, Is.True, "Conversion must be valid (warnings allowed)"); + Assert.That(model.getSpaces().Count, Is.EqualTo(2)); + Assert.That(model.getThermalZones().Count, Is.EqualTo(2)); + Assert.That(model.getBuildingStorys().Count, Is.EqualTo(1), "Both boxes share one elevation"); + Assert.That(Surfaces().Count, Is.EqualTo(12), "6 surfaces per box, shared wall duplicated per side"); + Assert.That(model.getSubSurfaces().Count, Is.EqualTo(1)); + } + + [Test] + public void BoundaryConditions_FollowPanelTypes() + { + List surfaces = Surfaces(); + + Assert.That(surfaces.Count(s => s.outsideBoundaryCondition() == "Ground"), Is.EqualTo(2), "Two SlabOnGrade floors"); + Assert.That(surfaces.Count(s => s.outsideBoundaryCondition() == "Outdoors"), Is.EqualTo(8), "Two roofs and six external walls"); + Assert.That(surfaces.Count(s => s.outsideBoundaryCondition() == "Surface"), Is.EqualTo(2), "Both sides of the shared internal wall"); + } + + [Test] + public void InternalWall_IsExplicitlyPaired_WithReversedNormals() + { + List internalSurfaces = Surfaces().FindAll(s => s.outsideBoundaryCondition() == "Surface"); + Assert.That(internalSurfaces.Count, Is.EqualTo(2)); + + global::OpenStudio.OptionalSurface adjacent0 = internalSurfaces[0].adjacentSurface(); + global::OpenStudio.OptionalSurface adjacent1 = internalSurfaces[1].adjacentSurface(); + Assert.That(adjacent0 != null && !adjacent0.isNull(), "First internal surface must reference its pair"); + Assert.That(adjacent1 != null && !adjacent1.isNull(), "Second internal surface must reference its pair"); + Assert.That(adjacent0.get().nameString(), Is.EqualTo(internalSurfaces[1].nameString())); + Assert.That(adjacent1.get().nameString(), Is.EqualTo(internalSurfaces[0].nameString())); + + global::OpenStudio.Vector3d normal0 = internalSurfaces[0].outwardNormal(); + global::OpenStudio.Vector3d normal1 = internalSurfaces[1].outwardNormal(); + double dot = normal0.x() * normal1.x() + normal0.y() * normal1.y() + normal0.z() * normal1.z(); + Assert.That(dot, Is.EqualTo(-1).Within(1e-6), "Paired surfaces must have opposite outward normals"); + } + + [Test] + public void SurfaceNormals_PointOutOfTheirSpaces() + { + foreach (global::OpenStudio.Space space in model.getSpaces()) + { + bool isSpaceA = space.nameString().Contains("Space_A"); + double insideX = isSpaceA ? 2.5 : 7.5; + + foreach (global::OpenStudio.Surface surface in space.surfaces) + { + global::OpenStudio.Vector3d normal = surface.outwardNormal(); + global::OpenStudio.Point3dVector vertices = surface.vertices(); + + double centroidX = 0, centroidY = 0, centroidZ = 0; + foreach (global::OpenStudio.Point3d vertex in vertices) + { + centroidX += vertex.x(); + centroidY += vertex.y(); + centroidZ += vertex.z(); + } + + centroidX /= vertices.Count; + centroidY /= vertices.Count; + centroidZ /= vertices.Count; + + double toInsideX = insideX - centroidX; + double toInsideY = 2.0 - centroidY; + double toInsideZ = 1.5 - centroidZ; + + double dot = normal.x() * toInsideX + normal.y() * toInsideY + normal.z() * toInsideZ; + Assert.That(dot, Is.LessThan(0), string.Format("Surface {0} normal must point out of its space", surface.nameString())); + } + } + } + + [Test] + public void FloorAreas_AndVolumes_MatchSam() + { + foreach (global::OpenStudio.Space space in model.getSpaces()) + { + Assert.That(space.floorArea, Is.EqualTo(20.0).Within(1e-6), space.nameString()); + Assert.That(space.volume, Is.EqualTo(60.0).Within(1e-6), space.nameString()); + } + } + + [Test] + public void Window_BecomesFixedWindow_OnOutdoorsWall() + { + global::OpenStudio.SubSurfaceVector subSurfaces = model.getSubSurfaces(); + Assert.That(subSurfaces.Count, Is.EqualTo(1)); + + global::OpenStudio.SubSurface subSurface = subSurfaces[0]; + Assert.That(subSurface.subSurfaceType(), Is.EqualTo("FixedWindow")); + Assert.That(subSurface.grossArea(), Is.EqualTo(2.8).Within(1e-6), "2 m × 1.4 m window"); + + global::OpenStudio.OptionalSurface host = subSurface.surface(); + Assert.That(host != null && !host.isNull(), "SubSurface must have a host surface"); + Assert.That(host.get().outsideBoundaryCondition(), Is.EqualTo("Outdoors")); + } + + [Test] + public void ObjectMap_TracksSpacesAndPanels() + { + AnalyticalModel analyticalModel = AnalyticalModelFixtures.TwoAdjacentBoxes(); + OpenStudioConversionResult localResult = analyticalModel.ToOpenStudio(); + + List spaces = analyticalModel.AdjacencyCluster.GetSpaces(); + foreach (Space space in spaces) + { + Assert.That(localResult.ObjectMap.ContainsKey(space.Guid), Is.True, "Every space must be traceable"); + Assert.That(localResult.ObjectMap[space.Guid], Does.StartWith("SAM_Space_")); + } + + int panelCount = analyticalModel.AdjacencyCluster.GetPanels().Count; + Assert.That(localResult.ObjectMap.Count, Is.GreaterThanOrEqualTo(panelCount + spaces.Count), "Panels and spaces must be registered"); + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/M4/ConstructionTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/M4/ConstructionTests.cs new file mode 100644 index 0000000..b350b2f --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/M4/ConstructionTests.cs @@ -0,0 +1,174 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// M4: material and construction conversion, layer order and orientation (plan §9–§10). + [TestFixture] + public class ConstructionTests + { + private OpenStudioConversionResult result; + private global::OpenStudio.Model model; + + [OneTimeSetUp] + public void Convert() + { + result = AnalyticalModelFixtures.TwoAdjacentBoxes().ToOpenStudio(); + model = result.Model; + } + + private static List LayerNames(global::OpenStudio.Surface surface) + { + global::OpenStudio.OptionalConstructionBase optionalConstructionBase = surface.construction(); + Assert.That(optionalConstructionBase != null && !optionalConstructionBase.isNull(), $"Surface {surface.nameString()} must have a construction"); + + global::OpenStudio.OptionalConstruction optionalConstruction = optionalConstructionBase.get().to_Construction(); + Assert.That(optionalConstruction != null && !optionalConstruction.isNull(), "ConstructionBase must be a layered Construction"); + + List names = new List(); + foreach (global::OpenStudio.Material material in optionalConstruction.get().layers()) + { + names.Add(material.nameString()); + } + + return names; + } + + [Test] + public void Conversion_IsValid_AllSurfacesHaveConstructions() + { + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in result.Diagnostics) + { + TestContext.Out.WriteLine(diagnostic.ToString()); + } + + Assert.That(result.IsValid, Is.True); + + foreach (global::OpenStudio.Surface surface in model.getSurfaces()) + { + global::OpenStudio.OptionalConstructionBase constructionBase = surface.construction(); + Assert.That(constructionBase != null && !constructionBase.isNull(), $"{surface.nameString()} has no construction"); + } + } + + [Test] + public void ExternalWall_LayersOutsideFirst() + { + global::OpenStudio.Surface externalWall = null; + foreach (global::OpenStudio.Surface surface in model.getSurfaces()) + { + if (surface.outsideBoundaryCondition() == "Outdoors" && surface.surfaceType() == "Wall") + { + externalWall = surface; + break; + } + } + + Assert.That(externalWall, Is.Not.Null); + + List layerNames = LayerNames(externalWall); + Assert.That(layerNames.Count, Is.EqualTo(3)); + Assert.That(layerNames[0], Does.Contain("Brick"), "EnergyPlus outside layer must be the SAM outermost (last stored) layer"); + Assert.That(layerNames[1], Does.Contain("Insulation")); + Assert.That(layerNames[2], Does.Contain("Plasterboard"), "EnergyPlus inside layer must be the SAM innermost (first stored) layer"); + } + + [Test] + public void InternalWall_OppositeSides_HaveReversedLayerSequences() + { + List internalSurfaces = new List(); + foreach (global::OpenStudio.Surface surface in model.getSurfaces()) + { + if (surface.outsideBoundaryCondition() == "Surface") + { + internalSurfaces.Add(surface); + } + } + + Assert.That(internalSurfaces.Count, Is.EqualTo(2)); + + List side0 = LayerNames(internalSurfaces[0]); + List side1 = LayerNames(internalSurfaces[1]); + + List side1Reversed = new List(side1); + side1Reversed.Reverse(); + + Assert.That(side0, Is.EqualTo(side1Reversed), "Internal panel sides must carry exact layer reversals of each other"); + Assert.That(side0, Is.Not.EqualTo(side1), "Sides must not share the same layer direction"); + } + + [Test] + public void Materials_AreDeduplicated_ByGuidAndThickness() + { + Assert.That(model.getStandardOpaqueMaterials().Count, Is.EqualTo(3), "Brick, Insulation, Plasterboard — one instance each, shared by forward and reverse constructions"); + Assert.That(model.getStandardGlazings().Count, Is.EqualTo(1), "Glass used twice at the same thickness must be one instance"); + Assert.That(model.getGass().Count, Is.EqualTo(1), "One air gap material"); + } + + [Test] + public void OpaqueMaterial_PhysicalValues_ArePreserved() + { + global::OpenStudio.StandardOpaqueMaterial brick = null; + foreach (global::OpenStudio.StandardOpaqueMaterial material in model.getStandardOpaqueMaterials()) + { + if (material.nameString().Contains("Brick")) + { + brick = material; + break; + } + } + + Assert.That(brick, Is.Not.Null); + Assert.That(brick.thickness(), Is.EqualTo(0.1).Within(1e-9)); + Assert.That(brick.thermalConductivity(), Is.EqualTo(0.84).Within(1e-9)); + Assert.That(brick.density(), Is.EqualTo(1700).Within(1e-9)); + Assert.That(brick.specificHeat(), Is.EqualTo(800).Within(1e-9)); + Assert.That(brick.thermalAbsorptance(), Is.EqualTo(0.9).Within(1e-9)); + Assert.That(brick.solarAbsorptance(), Is.EqualTo(0.7).Within(1e-9), "1 − ExternalSolarReflectance(0.3)"); + Assert.That(brick.visibleAbsorptance(), Is.EqualTo(0.7).Within(1e-9), "1 − ExternalLightReflectance(0.3)"); + } + + [Test] + public void Window_GetsDoubleGlazedPaneConstruction() + { + global::OpenStudio.SubSurfaceVector subSurfaces = model.getSubSurfaces(); + Assert.That(subSurfaces.Count, Is.EqualTo(1)); + + global::OpenStudio.OptionalConstructionBase optionalConstructionBase = subSurfaces[0].construction(); + Assert.That(optionalConstructionBase != null && !optionalConstructionBase.isNull()); + + global::OpenStudio.OptionalConstruction optionalConstruction = optionalConstructionBase.get().to_Construction(); + Assert.That(optionalConstruction != null && !optionalConstruction.isNull()); + + List names = new List(); + foreach (global::OpenStudio.Material material in optionalConstruction.get().layers()) + { + names.Add(material.nameString()); + } + + Assert.That(names.Count, Is.EqualTo(3), "Glass / Air / Glass"); + Assert.That(names[0], Does.Contain("Glass")); + Assert.That(names[1], Does.Contain("Air")); + Assert.That(names[2], Does.Contain("Glass")); + } + + [Test] + public void MissingMaterial_RaisesError_NeverSubstitutes() + { + Construction badConstruction = new Construction(new Guid("99999999-0000-0000-0000-000000000001"), "Bad Construction", new List + { + new ConstructionLayer("DoesNotExist", 0.1), + }); + + OpenStudioConversionResult badResult = AnalyticalModelFixtures.SingleBox(badConstruction, includeWindow: false).ToOpenStudio(); + + Assert.That(badResult.IsValid, Is.False, "Missing material must invalidate the conversion"); + Assert.That(badResult.Diagnostics.Any(d => d.Code == "SAM-OS-CON-001" && d.Message.Contains("DoesNotExist")), Is.True, "Diagnostic must name the missing material"); + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/M4/GasMaterialUsageTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/M4/GasMaterialUsageTests.cs new file mode 100644 index 0000000..438ddae --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/M4/GasMaterialUsageTests.cs @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using SAM.Core; +using System.Collections.Generic; +using System.Linq; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// Review P1-06: SAM GasMaterial in an opaque Construction must become an OpenStudio AirGap + /// (OS:Material:AirGap, R = 1/h from GasMaterialParameter.HeatTransferCoefficient [W/m²K]); + /// in ApertureConstruction pane layers it must remain OpenStudio.Gas (OS:WindowMaterial:Gas). + /// Reproduces the real Rhino failure (AR90UP 50 mm cavities → E+ "R Value below lowest + /// allowed value" → fatal). + /// + [TestFixture] + public class GasMaterialUsageTests + { + private static global::OpenStudio.Construction CavityWallForwardConstruction(global::OpenStudio.Model model) + { + foreach (global::OpenStudio.Construction construction in model.getConstructions()) + { + if (construction.nameString().Contains("Fixture_Cavity_Wall_Forward")) + { + return construction; + } + } + + return null; + } + + [Test] + public void OpaqueCavity_BecomesAirGap() + { + OpenStudioConversionResult result = AnalyticalModelFixtures.OpaqueAirGapBox().ToOpenStudio(); + Assert.That(result.IsValid, Is.True); + + global::OpenStudio.Construction construction = CavityWallForwardConstruction(result.Model); + Assert.That(construction, Is.Not.Null); + Assert.That(construction.layers().Count, Is.EqualTo(3)); + + global::OpenStudio.Material cavity = construction.layers()[1]; + Assert.That(cavity.to_AirGap() != null && !cavity.to_AirGap().isNull(), "The opaque cavity layer must be an OpenStudio AirGap (OS:Material:AirGap), never a window gas"); + Assert.That(cavity.to_Gas() != null && cavity.to_Gas().isNull(), "OS:WindowMaterial:Gas must not appear in an opaque construction"); + } + + [Test] + public void OpaqueCavity_Resistance_FromConductance_1_25() + { + OpenStudioConversionResult result = AnalyticalModelFixtures.OpaqueAirGapBox(1.25).ToOpenStudio(); + Assert.That(result.IsValid, Is.True); + + global::OpenStudio.Construction construction = CavityWallForwardConstruction(result.Model); + global::OpenStudio.AirGap airGap = construction.layers()[1].to_AirGap().get(); + Assert.That(airGap.thermalResistance(), Is.EqualTo(0.8).Within(1e-9), "h = 1.25 W/m²K → R = 1/1.25 = 0.8 m²K/W"); + } + + [Test] + public void OpaqueCavity_Resistance_FromConductance_1_95() + { + GasMaterial cavity195 = new GasMaterial(new System.Guid("33333333-0000-0000-0000-000000000007"), "Fixture Air Cavity"); + cavity195.SetValue(GasMaterialParameter.HeatTransferCoefficient, 1.95); + cavity195.SetValue(GasMaterialParameter.DefaultGasType, "Air"); + + OpenStudioConversionResult result = AnalyticalModelFixtures.OpaqueAirGapBox(1.95, cavity195).ToOpenStudio(); + Assert.That(result.IsValid, Is.True); + + global::OpenStudio.Construction construction = CavityWallForwardConstruction(result.Model); + global::OpenStudio.AirGap airGap = construction.layers()[1].to_AirGap().get(); + Assert.That(airGap.thermalResistance(), Is.EqualTo(1.0 / 1.95).Within(1e-9), "h = 1.95 W/m²K → R = 1/1.95 ≈ 0.5128205 m²K/W"); + } + + [Test] + public void WindowGas_RemainsGas_InAperturePane() + { + OpenStudioConversionResult result = AnalyticalModelFixtures.OpaqueAirGapBox().ToOpenStudio(); + Assert.That(result.IsValid, Is.True); + + global::OpenStudio.SubSurfaceVector subSurfaces = result.Model.getSubSurfaces(); + Assert.That(subSurfaces.Count, Is.EqualTo(1)); + + global::OpenStudio.Construction paneConstruction = subSurfaces[0].construction().get().to_Construction().get(); + Assert.That(paneConstruction.layers().Count, Is.EqualTo(3), "Glass / Air / Glass"); + + global::OpenStudio.Material paneGas = paneConstruction.layers()[1]; + Assert.That(paneGas.to_Gas() != null && !paneGas.to_Gas().isNull(), "The pane gas layer must remain OpenStudio.Gas (OS:WindowMaterial:Gas)"); + Assert.That(paneGas.to_Gas().get().gasType(), Is.EqualTo("Air")); + Assert.That(paneGas.to_Gas().get().thickness(), Is.EqualTo(0.012).Within(1e-9)); + } + + [Test] + public void SameGasMaterial_TwoContexts_SeparateObjects() + { + // The SAME SAM GasMaterial (same Guid) used in an opaque wall layer and in a pane + // layer must produce two distinct OpenStudio objects (AirGap + Gas), never shared. + GasMaterial shared = AnalyticalModelFixtures.CreateCavityGasMaterial(1.25); + + ApertureConstruction glazingWithSharedGas = new ApertureConstruction(new System.Guid("22222222-3333-3333-3333-333333333333"), "Shared Gas Glazing", ApertureType.Window, new List + { + new ConstructionLayer("Glass", 0.006), + new ConstructionLayer(shared.Name, 0.05), + new ConstructionLayer("Glass", 0.006), + }); + + AnalyticalModel analyticalModel = AnalyticalModelFixtures.OpaqueAirGapBox(1.25, null, false); + AdjacencyCluster adjacencyCluster = analyticalModel.AdjacencyCluster; + Panel host = adjacencyCluster.GetPanels().First(p => p.PanelType == PanelType.WallExternal); + host.AddAperture(Analytical.Create.Aperture(glazingWithSharedGas, new Geometry.Spatial.Face3D(new Geometry.Spatial.Polygon3D(new[] + { + new Geometry.Spatial.Point3D(1, 0, 0.8), + new Geometry.Spatial.Point3D(3, 0, 0.8), + new Geometry.Spatial.Point3D(3, 0, 2.2), + new Geometry.Spatial.Point3D(1, 0, 2.2), + })))); + + OpenStudioConversionResult result = analyticalModel.ToOpenStudio(); + Assert.That(result.IsValid, Is.True); + + Assert.That(result.Model.getAirGaps().Count, Is.EqualTo(1), "Exactly one AirGap instance for the opaque usage"); + Assert.That(result.Model.getGass().Count, Is.EqualTo(1), "Exactly one Gas instance for the fenestration usage"); + + global::OpenStudio.Construction wallConstruction = CavityWallForwardConstruction(result.Model); + global::OpenStudio.Construction paneConstruction = result.Model.getSubSurfaces()[0].construction().get().to_Construction().get(); + + Assert.That(wallConstruction.layers()[1].to_AirGap().isNull(), Is.False, "Wall references the AirGap object"); + Assert.That(paneConstruction.layers()[1].to_Gas().isNull(), Is.False, "Pane references the Gas object"); + Assert.That(wallConstruction.layers()[1].to_Gas().isNull(), Is.True, "Cache must never reuse a Gas as an AirGap"); + Assert.That(paneConstruction.layers()[1].to_AirGap().isNull(), Is.True, "Cache must never reuse an AirGap as a Gas"); + } + + [Test] + public void MissingConductance_RaisesError_NeverSilent() + { + MaterialLibrary materialLibrary = AnalyticalModelFixtures.CreateMaterialLibrary(); + materialLibrary.Add(new GasMaterial(new System.Guid("33333333-0000-0000-0000-000000000008"), "Fixture Air Cavity")); // no Heat Transfer Coefficient + + AdjacencyCluster adjacencyCluster = AnalyticalModelFixtures.OpaqueAirGapBox(includeWindow: false).AdjacencyCluster; + AnalyticalModel analyticalModel = new AnalyticalModel("Missing Conductance Model", "Opaque cavity without conductance", null, null, adjacencyCluster, materialLibrary, AnalyticalModelFixtures.CreateProfileLibrary()); + + OpenStudioConversionResult result = analyticalModel.ToOpenStudio(); + + Assert.That(result.IsValid, Is.False, "An opaque cavity without conductance must invalidate the conversion"); + Assert.That(result.Diagnostics.Any(d => d.Code == "SAM-OS-MAT-001" && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error && d.Message.Contains("Heat Transfer Coefficient")), Is.True, "Structured SAM-OS-MAT-001 expected before any CLI execution"); + Assert.That(result.Model.getAirGaps().Count, Is.EqualTo(0), "No silent zero-resistance AirGap may be created"); + } + + [Test] + public void ResistanceBelowEnergyPlusMinimum_RaisesError() + { + OpenStudioConversionResult result = AnalyticalModelFixtures.OpaqueAirGapBox(2000).ToOpenStudio(); + + Assert.That(result.IsValid, Is.False, "h = 2000 W/m²K → R = 0.0005 m²K/W, below the EnergyPlus per-layer minimum 0.001 — must be rejected before simulation"); + Assert.That(result.Diagnostics.Any(d => d.Code == "SAM-OS-MAT-001" && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error && d.Message.Contains("minimum")), Is.True); + } + + [Test] + public void GlazingLayer_InOpaqueConstruction_IsRejected() + { + Construction mixedConstruction = new Construction(new System.Guid("99999999-0000-0000-0000-000000000002"), "Mixed Family Wall", new List + { + new ConstructionLayer("Plasterboard", 0.0125), + new ConstructionLayer("Glass", 0.006), + new ConstructionLayer("Brick", 0.1), + }); + + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox(mixedConstruction, includeWindow: false).ToOpenStudio(); + + Assert.That(result.IsValid, Is.False, "A fenestration-family material in an opaque construction must be rejected, never simulated"); + Assert.That(result.Diagnostics.Any(d => d.Code == "SAM-OS-MAT-001" && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error && d.Message.Contains("opaque construction")), Is.True); + Assert.That(result.Model.getStandardGlazings().Count, Is.EqualTo(0), "No glazing object may be created for an opaque construction"); + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/M4/GlazingSideTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/M4/GlazingSideTests.cs new file mode 100644 index 0000000..2d0aaa4 --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/M4/GlazingSideTests.cs @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using SAM.Core; +using System.Collections.Generic; +using System.Linq; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// Review P1-04: glazing optical properties must map SAM External* → EnergyPlus Front side + /// (the side opposite the zone, i.e. outdoors for exterior windows) and SAM Internal* → + /// EnergyPlus Back side (side closest to the zone) — EnergyPlus I/O Reference, + /// "Materials for Glass Windows and Doors". Verified with deliberately asymmetric glass. + /// + [TestFixture] + public class GlazingSideTests + { + [Test] + public void AsymmetricGlazing_MapsExternalToFront_InternalToBack() + { + TransparentMaterial glass = new TransparentMaterial(new System.Guid("66666666-0000-0000-0000-000000000001"), "Coated Glass", "Coated Glass", "Asymmetric fixture glass", 1.0, 2500, 840); + glass.SetValue(TransparentMaterialParameter.SolarTransmittance, 0.5); + glass.SetValue(TransparentMaterialParameter.ExternalSolarReflectance, 0.31); + glass.SetValue(TransparentMaterialParameter.InternalSolarReflectance, 0.11); + glass.SetValue(TransparentMaterialParameter.LightTransmittance, 0.6); + glass.SetValue(TransparentMaterialParameter.ExternalLightReflectance, 0.32); + glass.SetValue(TransparentMaterialParameter.InternalLightReflectance, 0.12); + glass.SetValue(TransparentMaterialParameter.ExternalEmissivity, 0.84); + glass.SetValue(TransparentMaterialParameter.InternalEmissivity, 0.05); + + MaterialLibrary materialLibrary = AnalyticalModelFixtures.CreateMaterialLibrary(); + materialLibrary.Add(glass); + + ApertureConstruction glazing = new ApertureConstruction(new System.Guid("66666666-0000-0000-0000-000000000002"), "Asymmetric Glazing", ApertureType.Window, new List + { + new ConstructionLayer("Coated Glass", 0.006), + }); + + AdjacencyCluster adjacencyCluster = AnalyticalModelFixtures.SingleBox().AdjacencyCluster; + Panel host = adjacencyCluster.GetPanels().First(p => p.PanelType == PanelType.WallExternal && (p.Apertures?.Count ?? 0) > 0); + host.RemoveApertures(); + host.AddAperture(Analytical.Create.Aperture(glazing, new Geometry.Spatial.Face3D(new Geometry.Spatial.Polygon3D(new[] + { + new Geometry.Spatial.Point3D(1, 0, 0.8), + new Geometry.Spatial.Point3D(3, 0, 0.8), + new Geometry.Spatial.Point3D(3, 0, 2.2), + new Geometry.Spatial.Point3D(1, 0, 2.2), + })))); + + AnalyticalModel analyticalModel = new AnalyticalModel("Glazing Side Model", "Asymmetric glazing fixture", null, null, adjacencyCluster, materialLibrary, AnalyticalModelFixtures.CreateProfileLibrary()); + + OpenStudioConversionResult result = analyticalModel.ToOpenStudio(); + Assert.That(result.IsValid, Is.True); + + global::OpenStudio.StandardGlazing standardGlazing = result.Model.getStandardGlazings().FirstOrDefault(g => g.nameString().Contains("Coated_Glass")); + Assert.That(standardGlazing, Is.Not.Null, "The coated glass must be converted"); + + Assert.That(standardGlazing.frontSideSolarReflectanceatNormalIncidence().get(), Is.EqualTo(0.31).Within(1e-9), "E+ Front = side opposite the zone = SAM External"); + Assert.That(standardGlazing.backSideSolarReflectanceatNormalIncidence().get(), Is.EqualTo(0.11).Within(1e-9), "E+ Back = side closest to the zone = SAM Internal"); + Assert.That(standardGlazing.frontSideVisibleReflectanceatNormalIncidence().get(), Is.EqualTo(0.32).Within(1e-9)); + Assert.That(standardGlazing.backSideVisibleReflectanceatNormalIncidence().get(), Is.EqualTo(0.12).Within(1e-9)); + Assert.That(standardGlazing.frontSideInfraredHemisphericalEmissivity(), Is.EqualTo(0.84).Within(1e-9)); + Assert.That(standardGlazing.backSideInfraredHemisphericalEmissivity(), Is.EqualTo(0.05).Within(1e-9), "Internal low-e coating belongs on the zone-facing (back) side"); + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/M5/InternalConditionTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/M5/InternalConditionTests.cs new file mode 100644 index 0000000..55350f3 --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/M5/InternalConditionTests.cs @@ -0,0 +1,117 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using System.Linq; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// M5: internal conditions, space loads and annual schedule conversion (plan §11). + [TestFixture] + public class InternalConditionTests + { + private OpenStudioConversionResult result; + private global::OpenStudio.Model model; + + [OneTimeSetUp] + public void Convert() + { + result = AnalyticalModelFixtures.TwoAdjacentBoxes().ToOpenStudio(); + model = result.Model; + } + + [Test] + public void SpaceType_IsDeduplicated_AcrossSpacesSharingTheInternalCondition() + { + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in result.Diagnostics) + { + TestContext.Out.WriteLine(diagnostic.ToString()); + } + + Assert.That(result.IsValid, Is.True); + Assert.That(model.getSpaceTypes().Count, Is.EqualTo(1), "Two spaces share one InternalCondition — exactly one SpaceType"); + + foreach (global::OpenStudio.Space space in model.getSpaces()) + { + global::OpenStudio.OptionalSpaceType spaceType = space.spaceType; + Assert.That(spaceType != null && !spaceType.isNull(), $"{space.nameString()} must have a SpaceType"); + Assert.That(spaceType.get().nameString(), Does.StartWith("SAM_InternalCondition_Office_"), "Name keeps readability plus the deterministic content hash"); + } + } + + [Test] + public void LoadDensities_ArePreserved() + { + Assert.That(model.getPeopleDefinitions().Count, Is.EqualTo(1)); + global::OpenStudio.PeopleDefinition peopleDefinition = model.getPeopleDefinitions()[0]; + + global::OpenStudio.OptionalDouble peoplePerArea = peopleDefinition.peopleperSpaceFloorArea(); + Assert.That(peoplePerArea != null && !peoplePerArea.isNull()); + Assert.That(peoplePerArea.get(), Is.EqualTo(0.1).Within(1e-9), "AreaPerPerson 10 m²/person → 0.1 people/m²"); + Assert.That(peopleDefinition.fractionRadiant(), Is.EqualTo(0.3).Within(1e-9), "Documented LadybugTools-parity default"); + Assert.That(peopleDefinition.sensibleHeatFraction().get(), Is.EqualTo(75.0 / 130.0).Within(1e-9), "75 W sensible of 130 W total"); + + Assert.That(model.getLightsDefinitions().Count, Is.EqualTo(1)); + Assert.That(model.getLightsDefinitions()[0].wattsperSpaceFloorArea().get(), Is.EqualTo(8.0).Within(1e-9)); + + Assert.That(model.getElectricEquipmentDefinitions().Count, Is.EqualTo(1)); + Assert.That(model.getElectricEquipmentDefinitions()[0].wattsperSpaceFloorArea().get(), Is.EqualTo(12.0).Within(1e-9)); + } + + [Test] + public void Infiltration_UsesNativeAirChangesPerHourBasis() + { + Assert.That(model.getSpaceInfiltrationDesignFlowRates().Count, Is.EqualTo(1)); + + // C2: the condition carries ACH → the native ACH field is used (coverage manifest: + // InternalConditionParameter.InfiltrationAirChangesPerHour); the MVP + // flow-per-exterior-area approximation no longer applies. + global::OpenStudio.OptionalDouble airChanges = model.getSpaceInfiltrationDesignFlowRates()[0].airChangesperHour(); + Assert.That(airChanges != null && !airChanges.isNull(), "Basis must be AirChangesPerHour"); + Assert.That(airChanges.get(), Is.EqualTo(0.5).Within(1e-9)); + } + + [Test] + public void OutdoorAir_ComesFromExplicitSamParameter() + { + Assert.That(model.getDesignSpecificationOutdoorAirs().Count, Is.EqualTo(2), "One per space (SpaceParameter.OutsideSupplyAirFlow is space-level)"); + Assert.That(model.getDesignSpecificationOutdoorAirs()[0].outdoorAirFlowRate(), Is.EqualTo(0.02).Within(1e-9)); + } + + [Test] + public void OccupancySchedule_HasCorrectAnnualValues() + { + global::OpenStudio.ScheduleFixedInterval occupancySchedule = null; + foreach (global::OpenStudio.ScheduleFixedInterval schedule in model.getScheduleFixedIntervals()) + { + if (schedule.nameString().Contains("Office_Occupancy")) + { + occupancySchedule = schedule; + break; + } + } + + Assert.That(occupancySchedule, Is.Not.Null, "Occupancy schedule must exist"); + + global::OpenStudio.TimeSeries timeSeries = occupancySchedule.timeSeries(); + global::OpenStudio.Vector values = timeSeries.values(); + + Assert.That(values.size(), Is.EqualTo(8760), "One value per hour of a non-leap year"); + + Assert.That(values.__getitem__(3), Is.EqualTo(0), "1 Jan 03:00 — unoccupied"); + Assert.That(values.__getitem__(10), Is.EqualTo(1), "1 Jan 10:00 — occupied"); + Assert.That(values.__getitem__(364 * 24 + 3), Is.EqualTo(0), "31 Dec 03:00 — unoccupied"); + Assert.That(values.__getitem__(364 * 24 + 10), Is.EqualTo(1), "31 Dec 10:00 — occupied"); + } + + [Test] + public void MissingProfile_RaisesError_NeverAlwaysOn() + { + OpenStudioConversionResult badResult = AnalyticalModelFixtures.SingleBox(withProfiles: false).ToOpenStudio(); + + Assert.That(badResult.IsValid, Is.False, "Gains without profiles must invalidate the conversion"); + Assert.That(badResult.Diagnostics.Any(d => d.Code == "SAM-OS-SCH-001" && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error), Is.True); + Assert.That(badResult.Model.getPeoples().Count, Is.EqualTo(0), "No people load may be created without its schedule"); + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/M5/ProfileAnnualTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/M5/ProfileAnnualTests.cs new file mode 100644 index 0000000..8060e18 --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/M5/ProfileAnnualTests.cs @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using SAM.Core; +using System.Linq; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// Review P1-02: profiles longer than 8760 hours (leap years) and multi-day flat sequences + /// must follow SAM's native expansion semantics (explicit truncation with a warning, or + /// cyclic tiling at the profile's own period) — never silently block-averaged into one + /// synthetic "average day". + /// + [TestFixture] + public class ProfileAnnualTests + { + private static OpenStudioConversionResult Convert(Profile profile) + { + ProfileLibrary profileLibrary = AnalyticalModelFixtures.CreateProfileLibrary(); + profileLibrary.Add(profile); + + InternalCondition internalCondition = AnalyticalModelFixtures.CreateOfficeInternalCondition(); + internalCondition.SetValue(InternalConditionParameter.OccupancyProfileName, profile.Name); + + return AnalyticalModelFixtures.SingleBox(internalConditionOverride: internalCondition, profileLibraryOverride: profileLibrary).ToOpenStudio(); + } + + private static global::OpenStudio.Vector ScheduleValues(global::OpenStudio.Model model, string namePart) + { + foreach (global::OpenStudio.ScheduleFixedInterval schedule in model.getScheduleFixedIntervals()) + { + if (schedule.nameString().Contains(namePart)) + { + return schedule.timeSeries().values(); + } + } + + return null; + } + + [Test] + public void LeapYearProfile_IsTruncatedWithWarning_NotSquashed() + { + double[] leap = new double[8784]; + for (int i = 0; i < leap.Length; i++) + { + int hour = i % 24; + leap[i] = hour >= 8 && hour < 18 ? 1 : 0; + } + + leap[1] = 1; // marker: any averaging of 366-value blocks would dilute this to ~0.42 + + OpenStudioConversionResult result = Convert(new Profile("Leap Occupancy", ProfileType.Occupancy, leap)); + + global::OpenStudio.Vector values = ScheduleValues(result.Model, "Leap_Occupancy"); + Assert.That(values, Is.Not.Null, "Leap-year schedule must exist"); + Assert.That(values.size(), Is.EqualTo(8760), "Schedules are 365-day (documented non-leap policy)"); + + Assert.That(values.__getitem__(0), Is.EqualTo(0), "Hour 0 must be the source value, not a 366-value average"); + Assert.That(values.__getitem__(1), Is.EqualTo(1), "The marker hour must survive — the profile must be truncated, not averaged"); + Assert.That(values.__getitem__(12), Is.EqualTo(1), "Midday occupied"); + Assert.That(values.__getitem__(8759), Is.EqualTo(leap[8759]), "Last hour equals source hour 8759"); + + Assert.That(result.Diagnostics.Any(d => d.Code == "SAM-OS-SCH-001" && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning && d.Message.Contains("8784")), Is.True, "Truncation must be reported as a warning, never silent"); + } + + [Test] + public void WeeklyFlatProfile_IsTiledHourForHour_NotAveraged() + { + // Flat 168-hour weekly sequence (no sub-profiles): occupied 08:00–17:59 on the first + // five days only. SAM's own yearly expansion (GetYearlyValues / the wrapping indexer) + // tiles this hour-for-hour at a 168-hour period. + double[] week = new double[168]; + for (int day = 0; day < 5; day++) + { + for (int hour = 8; hour < 18; hour++) + { + week[day * 24 + hour] = 1; + } + } + + OpenStudioConversionResult result = Convert(new Profile("Flat Week", ProfileType.Occupancy, week)); + + global::OpenStudio.Vector values = ScheduleValues(result.Model, "Flat_Week"); + Assert.That(values, Is.Not.Null, "Weekly schedule must exist"); + Assert.That(values.size(), Is.EqualTo(8760)); + + Assert.That(values.__getitem__(12), Is.EqualTo(1), "Day 0 noon occupied — not a 7-day average (~0.71)"); + Assert.That(values.__getitem__(5 * 24 + 12), Is.EqualTo(0), "Day 5 noon unoccupied"); + Assert.That(values.__getitem__(6 * 24 + 12), Is.EqualTo(0), "Day 6 noon unoccupied"); + Assert.That(values.__getitem__(7 * 24 + 12), Is.EqualTo(1), "Day 7 starts the second weekly cycle — occupied again"); + } + + [Test] + public void DailyProfile_TilesUnchanged() + { + double[] daily = new double[24]; + for (int i = 8; i <= 17; i++) + { + daily[i] = 1; + } + + OpenStudioConversionResult result = Convert(new Profile("Daily", ProfileType.Occupancy, daily)); + + global::OpenStudio.Vector values = ScheduleValues(result.Model, "Daily"); + Assert.That(values, Is.Not.Null); + Assert.That(values.__getitem__(3), Is.EqualTo(0)); + Assert.That(values.__getitem__(10), Is.EqualTo(1)); + Assert.That(values.__getitem__(364 * 24 + 10), Is.EqualTo(1)); + } + + [Test] + public void ProfileWithGaps_RaisesError_NeverSilentNaN() + { + Profile profile = new Profile("Gappy", ProfileType.Occupancy); + profile.Update(0, 1.0); + profile.Update(5, 1.0); + + OpenStudioConversionResult result = Convert(profile); + + Assert.That(result.Diagnostics.Any(d => d.Code == "SAM-OS-SCH-001" && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error && d.Message.Contains("gap")), Is.True, "A profile with missing hours must raise a diagnosed error — NaN must never reach the schedule"); + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/M5/ProfileWeeklyTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/M5/ProfileWeeklyTests.cs new file mode 100644 index 0000000..8cfd80c --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/M5/ProfileWeeklyTests.cs @@ -0,0 +1,131 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using SAM.Core; +using System.IO; +using System.Linq; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// Review P1-01: day-composed (weekly) profiles must align with the run calendar — the EPW + /// start day of week (Boston TMYx: Sunday) — not a hard-coded Monday-first assumption. + /// + [TestFixture] + public class ProfileWeeklyTests + { + private static string WeatherPath(string extension) + { + return Path.GetFullPath(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "..", "..", "..", "resources", "weather", "USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2004-2018" + extension)); + } + + private static InternalCondition WeeklyInternalCondition(out ProfileLibrary profileLibrary) + { + double[] weekday = new double[24]; + for (int i = 0; i < 24; i++) + { + weekday[i] = 1; + } + + double[] weekend = new double[24]; + + Profile week = new Profile("Office Week", ProfileType.Occupancy); + for (int i = 0; i < 5; i++) + { + week.Add(new Profile("Weekday", ProfileType.Occupancy, weekday)); + } + + week.Add(new Profile("Weekend", ProfileType.Occupancy, weekend)); + week.Add(new Profile("Weekend", ProfileType.Occupancy, weekend)); + + profileLibrary = AnalyticalModelFixtures.CreateProfileLibrary(); + profileLibrary.Add(week); + + InternalCondition result = AnalyticalModelFixtures.CreateOfficeInternalCondition(); + result.SetValue(InternalConditionParameter.OccupancyProfileName, "Office Week"); + return result; + } + + private static global::OpenStudio.Vector ScheduleValues(global::OpenStudio.Model model) + { + foreach (global::OpenStudio.ScheduleFixedInterval schedule in model.getScheduleFixedIntervals()) + { + if (schedule.nameString().Contains("Office_Week")) + { + return schedule.timeSeries().values(); + } + } + + return null; + } + + [Test] + public void WeeklyProfile_AlignsWithWeatherFileStartDay() + { + string epwPath = WeatherPath(".epw"); + Assert.That(File.Exists(epwPath), Is.True, $"Pinned weather fixture missing: {epwPath}"); + + InternalCondition internalCondition = WeeklyInternalCondition(out ProfileLibrary profileLibrary); + AnalyticalModel analyticalModel = AnalyticalModelFixtures.SingleBox(internalConditionOverride: internalCondition, profileLibraryOverride: profileLibrary); + + string outputDirectory = Path.Combine(TestContext.CurrentContext.WorkDirectory, "weekly_alignment"); + OpenStudioConversionResult result = analyticalModel.ToOpenStudio(epwPath, outputDirectory, run: false); + + Assert.That(result.IsValid, Is.True); + + global::OpenStudio.Vector values = ScheduleValues(result.Model); + Assert.That(values, Is.Not.Null, "Weekly occupancy schedule must exist"); + Assert.That(values.size(), Is.EqualTo(8760)); + + // The EPW DATA PERIODS line declares 1 Jan = Sunday. Monday values (1) must therefore + // start on day 1, and the two weekend days (0) must be days 0, 6 and 7 — not days 5,6. + Assert.That(values.__getitem__(12), Is.EqualTo(0), "1 Jan is a Sunday — weekend value expected"); + Assert.That(values.__getitem__(24 + 12), Is.EqualTo(1), "2 Jan is a Monday — weekday value expected"); + Assert.That(values.__getitem__(5 * 24 + 12), Is.EqualTo(1), "6 Jan is a Friday — weekday value expected"); + Assert.That(values.__getitem__(6 * 24 + 12), Is.EqualTo(0), "7 Jan is a Saturday — weekend value expected"); + Assert.That(values.__getitem__(7 * 24 + 12), Is.EqualTo(0), "8 Jan is a Sunday — weekend value expected"); + } + + [Test] + public void WeeklyProfile_MondayFirst_WithoutWeatherFile() + { + InternalCondition internalCondition = WeeklyInternalCondition(out ProfileLibrary profileLibrary); + AnalyticalModel analyticalModel = AnalyticalModelFixtures.SingleBox(internalConditionOverride: internalCondition, profileLibraryOverride: profileLibrary); + + OpenStudioConversionResult result = analyticalModel.ToOpenStudio(); + Assert.That(result.IsValid, Is.True); + + global::OpenStudio.Vector values = ScheduleValues(result.Model); + Assert.That(values, Is.Not.Null, "Weekly occupancy schedule must exist"); + + // Geometry-only conversion keeps the documented Monday-first default. + Assert.That(values.__getitem__(12), Is.EqualTo(1), "Without a weather file, day 0 is treated as Monday"); + Assert.That(values.__getitem__(5 * 24 + 12), Is.EqualTo(0), "Saturday"); + Assert.That(values.__getitem__(6 * 24 + 12), Is.EqualTo(0), "Sunday"); + } + + [Test] + public void WeeklyProfile_FirstDayOfWeekOption_OverridesDefault() + { + InternalCondition internalCondition = WeeklyInternalCondition(out ProfileLibrary profileLibrary); + AnalyticalModel analyticalModel = AnalyticalModelFixtures.SingleBox(internalConditionOverride: internalCondition, profileLibraryOverride: profileLibrary); + + Core.OpenStudio.OpenStudioConversionOptions options = new Core.OpenStudio.OpenStudioConversionOptions + { + FirstDayOfWeek = System.DayOfWeek.Wednesday, + }; + + OpenStudioConversionResult result = analyticalModel.ToOpenStudio(options); + Assert.That(result.IsValid, Is.True); + + global::OpenStudio.Vector values = ScheduleValues(result.Model); + Assert.That(values, Is.Not.Null); + + // Day 0 treated as Wednesday (weekday), days 3/4 (Sat/Sun) are the weekend. + Assert.That(values.__getitem__(12), Is.EqualTo(1), "Wednesday — weekday"); + Assert.That(values.__getitem__(3 * 24 + 12), Is.EqualTo(0), "Saturday — weekend"); + Assert.That(values.__getitem__(4 * 24 + 12), Is.EqualTo(0), "Sunday — weekend"); + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/M5/SpaceTypeDeduplicationTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/M5/SpaceTypeDeduplicationTests.cs new file mode 100644 index 0000000..2786c25 --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/M5/SpaceTypeDeduplicationTests.cs @@ -0,0 +1,95 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using SAM.Core; +using System.Linq; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// Review P1-03: SpaceType deduplication must distinguish internal conditions that share a + /// name but differ in parameters or profile references (SAM clones conditions with new Guids + /// per space, so identity is name + content — never name alone). + /// + [TestFixture] + public class SpaceTypeDeduplicationTests + { + [Test] + public void SameNamedConditions_WithDifferentContent_GetDistinctSpaceTypes() + { + AnalyticalModel analyticalModel = AnalyticalModelFixtures.TwoAdjacentBoxes(); + + Space spaceB = analyticalModel.AdjacencyCluster.GetSpaces().First(s => s.Name == "Space B"); + InternalCondition altered = AnalyticalModelFixtures.CreateOfficeInternalCondition(); // still named "Office" + altered.SetValue(InternalConditionParameter.LightingGainPerArea, 99.0); + spaceB.InternalCondition = altered; + + OpenStudioConversionResult result = analyticalModel.ToOpenStudio(); + global::OpenStudio.Model model = result.Model; + + Assert.That(result.IsValid, Is.True); + Assert.That(model.getSpaceTypes().Count, Is.EqualTo(2), "Same name but different gains must NOT share a SpaceType"); + + foreach (global::OpenStudio.Space space in model.getSpaces()) + { + Assert.That(space.spaceType != null && !space.spaceType.isNull(), $"{space.nameString()} must have a SpaceType"); + global::OpenStudio.SpaceType spaceType = space.spaceType.get(); + Assert.That(spaceType.lights().Count, Is.EqualTo(1), $"{spaceType.nameString()} must have lights"); + + double wattsPerArea = spaceType.lights()[0].lightsDefinition().wattsperSpaceFloorArea().get(); + if (space.nameString().Contains("Space_A")) + { + Assert.That(wattsPerArea, Is.EqualTo(8.0).Within(1e-9), "Space A keeps its own 8 W/m² condition"); + } + else + { + Assert.That(wattsPerArea, Is.EqualTo(99.0).Within(1e-9), "Space B must get its own 99 W/m² condition — never Space A's"); + } + } + } + + [Test] + public void SameNamedConditions_WithDifferentProfiles_GetDistinctSpaceTypes() + { + double[] nightShift = new double[24]; + for (int i = 0; i < 6; i++) + { + nightShift[i] = 1; + } + + ProfileLibrary profileLibrary = AnalyticalModelFixtures.CreateProfileLibrary(); + profileLibrary.Add(new Profile("Night Lighting", ProfileType.Lighting, nightShift)); + + AdjacencyCluster adjacencyCluster = AnalyticalModelFixtures.TwoAdjacentBoxes().AdjacencyCluster; + + Space spaceB = adjacencyCluster.GetSpaces().First(s => s.Name == "Space B"); + InternalCondition altered = AnalyticalModelFixtures.CreateOfficeInternalCondition(); // still named "Office" + altered.SetValue(InternalConditionParameter.LightingProfileName, "Night Lighting"); + spaceB.InternalCondition = altered; + + AnalyticalModel analyticalModel = new AnalyticalModel("Two Box Model", "Same-name IC profile-collision fixture", null, null, adjacencyCluster, AnalyticalModelFixtures.CreateMaterialLibrary(), profileLibrary); + + OpenStudioConversionResult result = analyticalModel.ToOpenStudio(); + Assert.That(result.IsValid, Is.True); + Assert.That(result.Model.getSpaceTypes().Count, Is.EqualTo(2), "Same name but different profile references must NOT share a SpaceType"); + } + + [Test] + public void IdenticalClones_StillShareOneSpaceType() + { + OpenStudioConversionResult result = AnalyticalModelFixtures.TwoAdjacentBoxes().ToOpenStudio(); + global::OpenStudio.Model model = result.Model; + + Assert.That(result.IsValid, Is.True); + Assert.That(model.getSpaceTypes().Count, Is.EqualTo(1), "Clones of the same condition (new Guid per space) must still deduplicate"); + + string name = model.getSpaceTypes()[0].nameString(); + Assert.That(name, Does.StartWith("SAM_InternalCondition_Office_"), "Name keeps readability plus a deterministic content hash"); + + // Determinism: an identical model converted again produces the same SpaceType name. + OpenStudioConversionResult repeated = AnalyticalModelFixtures.TwoAdjacentBoxes().ToOpenStudio(); + Assert.That(repeated.Model.getSpaceTypes()[0].nameString(), Is.EqualTo(name), "Content hash must be deterministic across conversions"); + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/M6/CliRunnerTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/M6/CliRunnerTests.cs new file mode 100644 index 0000000..99f35ef --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/M6/CliRunnerTests.cs @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using System.Diagnostics; +using System.IO; +using System.Linq; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// Review P1-05: the CLI runner timeout must actually fire while the process is running + /// (asynchronous output reads + process-tree termination) — never block on synchronous + /// ReadToEnd until the process exits by itself. + /// + [TestFixture] + public class CliRunnerTests + { + private static string WeatherPath(string extension) + { + return Path.GetFullPath(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "..", "..", "..", "resources", "weather", "USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2004-2018" + extension)); + } + + [Test] + [Category("Simulation")] + public void CliTimeout_KillsProcess_AndReportsTimeout() + { + string epwPath = WeatherPath(".epw"); + Assert.That(File.Exists(epwPath), Is.True, $"Pinned weather fixture missing: {epwPath}"); + Assert.That(Core.OpenStudio.Query.OpenStudioCliPath(), Is.Not.Null, "OpenStudio CLI required for this test"); + + string outputDirectory = Path.Combine(TestContext.CurrentContext.WorkDirectory, "cli_timeout"); + if (Directory.Exists(outputDirectory)) + { + Directory.Delete(outputDirectory, true); + } + + Core.OpenStudio.OpenStudioRunOptions runOptions = new Core.OpenStudio.OpenStudioRunOptions + { + TimeoutSeconds = 1, + }; + + Stopwatch stopwatch = Stopwatch.StartNew(); + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox().ToOpenStudio(epwPath, outputDirectory, null, runOptions); + stopwatch.Stop(); + + Assert.That(result.RunResult, Is.Not.Null, "A run result must be produced even on timeout"); + Assert.That(result.RunResult.Success, Is.False, "A 1 s timeout cannot complete a full annual run"); + Assert.That(result.RunResult.ExitCode, Is.EqualTo(-1), "Timeout must be reported as exit code -1"); + Assert.That(stopwatch.Elapsed.TotalSeconds, Is.LessThan(120), "The timeout must fire while the process runs — before the fix the call blocked for the process's whole lifetime"); + Assert.That(result.Diagnostics.Any(d => d.Message.Contains("TIMEOUT")), Is.True, "A TIMEOUT diagnostic must be recorded"); + + // Process-tree termination (Job Object): terminated children linger briefly in the + // process table while their handles drain, so poll with a bounded budget instead of + // demanding an instant zero. An orphaned EnergyPlus would outlive this budget. + bool treeTerminated = System.Threading.SpinWait.SpinUntil(() => Process.GetProcessesByName("energyplus").Length == 0 && Process.GetProcessesByName("openstudio").Length == 0, 10000); + Assert.That(treeTerminated, Is.True, "The process tree must be terminated — no orphaned EnergyPlus or CLI may outlive the run"); + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/M6/SimulationTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/M6/SimulationTests.cs new file mode 100644 index 0000000..3db71bb --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/M6/SimulationTests.cs @@ -0,0 +1,161 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using System; +using System.IO; +using System.Linq; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// M6: thermostats, Ideal Loads and the first end-to-end EnergyPlus simulation with the + /// strengthened result gate (plan §13 M6): exit 0, no fatal/severe errors, annual heating ≥ 0 + /// AND cooling ≥ 0 AND at least one > 0, zone-level result count == conditioned-zone count. + /// + [TestFixture] + public class SimulationTests + { + private static string WeatherPath(string extension) + { + return Path.GetFullPath(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "..", "..", "..", "resources", "weather", "USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2004-2018" + extension)); + } + + [Test] + public void ConditionedZones_GetThermostatAndIdealLoads() + { + OpenStudioConversionResult result = AnalyticalModelFixtures.TwoAdjacentBoxes().ToOpenStudio(); + global::OpenStudio.Model model = result.Model; + + Assert.That(result.IsValid, Is.True); + Assert.That(model.getZoneHVACIdealLoadsAirSystems().Count, Is.EqualTo(2), "One Ideal Loads system per conditioned zone"); + Assert.That(model.getThermostatSetpointDualSetpoints().Count, Is.EqualTo(2), "One dual-setpoint thermostat per conditioned zone"); + + foreach (global::OpenStudio.ThermalZone thermalZone in model.getThermalZones()) + { + global::OpenStudio.OptionalThermostatSetpointDualSetpoint thermostat = thermalZone.thermostatSetpointDualSetpoint(); + Assert.That(thermostat != null && !thermostat.isNull(), $"{thermalZone.nameString()} must have a thermostat"); + } + } + + [Test] + public void IsConditioned_FollowsSamNameConvention() + { + Space conditioned = new Space("Office Space"); + conditioned.InternalCondition = new InternalCondition("Office"); + Assert.That(conditioned.IsConditioned(), Is.True); + + Space unconditioned = new Space("Store"); + unconditioned.InternalCondition = new InternalCondition("Office Unconditioned"); + Assert.That(unconditioned.IsConditioned(), Is.False); + + Space external = new Space("Outside"); + external.InternalCondition = new InternalCondition("External Zone"); + Assert.That(external.IsConditioned(), Is.False); + + Assert.That(new Space("Bare").IsConditioned(), Is.False, "No InternalCondition means unconditioned"); + } + + [Test] + public void HeatingAboveCooling_RaisesError_NoThermostat() + { + ProfileLibrary invertedSetpoints = AnalyticalModelFixtures.CreateProfileLibrary(heatingSetpoint: 27, coolingSetpoint: 21); + + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox(profileLibraryOverride: invertedSetpoints).ToOpenStudio(); + + Assert.That(result.IsValid, Is.False, "Heating above cooling must invalidate the conversion"); + Assert.That(result.Diagnostics.Any(d => d.Code == "SAM-OS-HVAC-001" && d.Message.Contains("exceeds")), Is.True); + Assert.That(result.Model.getThermostatSetpointDualSetpoints().Count, Is.EqualTo(0)); + Assert.That(result.Model.getZoneHVACIdealLoadsAirSystems().Count, Is.EqualTo(0), "No Ideal Loads without a valid thermostat"); + } + + [Test] + [Category("Simulation")] + public void SingleBox_EndToEnd_EnergyPlusRun_MeetsResultGate() + { + string epwPath = WeatherPath(".epw"); + Assert.That(File.Exists(epwPath), Is.True, $"Pinned weather fixture missing: {epwPath}"); + + string outputDirectory = Path.Combine(TestContext.CurrentContext.WorkDirectory, "e2e_single_box"); + if (Directory.Exists(outputDirectory)) + { + Directory.Delete(outputDirectory, true); + } + + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox().ToOpenStudio(epwPath, outputDirectory); + + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in result.Diagnostics) + { + TestContext.Out.WriteLine(diagnostic.ToString()); + } + + Assert.That(result.OsmPath, Is.Not.Null.And.Not.Empty); + Assert.That(File.Exists(result.OsmPath), Is.True, "OSM must be saved"); + Assert.That(File.Exists(result.OswPath), Is.True, "OSW must be generated"); + + Core.OpenStudio.OpenStudioRunResult runResult = result.RunResult; + Assert.That(runResult, Is.Not.Null, "A run result must be produced"); + Assert.That(runResult.ExitCode, Is.EqualTo(0), "OpenStudio CLI must exit 0"); + Assert.That(runResult.FatalErrors, Is.Empty, "EnergyPlus must report no fatal errors"); + Assert.That(runResult.SevereErrors, Is.Empty, "EnergyPlus must report no severe errors"); + Assert.That(runResult.SqlPath, Is.Not.Null, "SQLite results must exist"); + Assert.That(runResult.Success, Is.True); + + OpenStudioLoadSummary loads = result.Loads; + Assert.That(loads, Is.Not.Null, "Loads must be extracted"); + Assert.That(loads.IsFinite, Is.True, "Loads must be finite and non-negative"); + Assert.That(loads.TotalHeating, Is.GreaterThanOrEqualTo(0)); + Assert.That(loads.TotalCooling, Is.GreaterThanOrEqualTo(0)); + Assert.That(loads.TotalHeating + loads.TotalCooling, Is.GreaterThan(0), "Zeros-only results fail the gate (Boston climate guarantees load)"); + Assert.That(loads.ZoneHeating.Count, Is.EqualTo(1), "Zone-level result count must equal the conditioned-zone count"); + Assert.That(loads.ZoneCooling.Count, Is.EqualTo(1)); + + TestContext.Out.WriteLine(string.Format("Annual heating {0:0.0} kWh, cooling {1:0.0} kWh", loads.TotalHeating, loads.TotalCooling)); + } + + [Test] + [Category("Simulation")] + public void AirGapConstruction_EndToEnd_EnergyPlusRun_MeetsResultGate() + { + // Review P1-06: an opaque construction with a SAM GasMaterial cavity must simulate + // cleanly (the real Rhino model failed fatally on WindowMaterial:Gas in opaque + // constructions — now converted to OS:Material:AirGap). + string epwPath = WeatherPath(".epw"); + Assert.That(File.Exists(epwPath), Is.True, $"Pinned weather fixture missing: {epwPath}"); + + string outputDirectory = Path.Combine(TestContext.CurrentContext.WorkDirectory, "e2e_airgap_box"); + if (Directory.Exists(outputDirectory)) + { + Directory.Delete(outputDirectory, true); + } + + OpenStudioConversionResult result = AnalyticalModelFixtures.OpaqueAirGapBox().ToOpenStudio(epwPath, outputDirectory); + + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in result.Diagnostics) + { + TestContext.Out.WriteLine(diagnostic.ToString()); + } + + Assert.That(result.IsValid, Is.True); + Assert.That(result.Model.getAirGaps().Count, Is.EqualTo(1), "One AirGap object for the opaque cavity"); + Assert.That(result.Model.getAirGaps()[0].thermalResistance(), Is.EqualTo(0.8).Within(1e-9)); + + Core.OpenStudio.OpenStudioRunResult runResult = result.RunResult; + Assert.That(runResult, Is.Not.Null, "A run result must be produced"); + Assert.That(runResult.ExitCode, Is.EqualTo(0), "OpenStudio CLI must exit 0"); + Assert.That(runResult.FatalErrors, Is.Empty, "EnergyPlus must report no fatal errors — no R-value error may appear"); + Assert.That(runResult.SevereErrors, Is.Empty, "EnergyPlus must report no severe errors"); + Assert.That(runResult.SqlPath, Is.Not.Null, "SQLite results must exist"); + Assert.That(File.Exists(runResult.SqlPath), Is.True); + Assert.That(runResult.Success, Is.True); + + OpenStudioLoadSummary loads = result.Loads; + Assert.That(loads, Is.Not.Null, "Loads must be extracted"); + Assert.That(loads.IsFinite, Is.True, "Loads must be finite and non-negative"); + Assert.That(loads.TotalHeating + loads.TotalCooling, Is.GreaterThan(0), "Zeros-only results fail the gate"); + Assert.That(loads.ZoneHeating.Count, Is.EqualTo(1)); + + TestContext.Out.WriteLine(string.Format("Annual heating {0:0.0} kWh, cooling {1:0.0} kWh", loads.TotalHeating, loads.TotalCooling)); + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/M6/WorkflowMeasureTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/M6/WorkflowMeasureTests.cs new file mode 100644 index 0000000..c16936f --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/M6/WorkflowMeasureTests.cs @@ -0,0 +1,150 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// OSW workflow composition: caller measures become workflow steps with their parent + /// directories as the measure paths; additional IDF strings are injected through a + /// generated EnergyPlus measure appended last; unusable measure directories are skipped + /// with a warning — never silently. The default workflow keeps the historical minimal + /// shape (seed, weather, empty steps). + /// + [TestFixture] + public class WorkflowMeasureTests + { + private static string WeatherPath(string extension) + { + return Path.GetFullPath(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "..", "..", "..", "resources", "weather", "USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2004-2018" + extension)); + } + + private static OpenStudioConversionResult Convert_NoRun(Core.OpenStudio.OpenStudioConversionOptions options) + { + string epwPath = WeatherPath(".epw"); + Assert.That(File.Exists(epwPath), Is.True, $"Pinned weather fixture missing: {epwPath}"); + + string outputDirectory = Path.Combine(TestContext.CurrentContext.WorkDirectory, "workflow", System.Guid.NewGuid().ToString("N").Substring(0, 8)); + return AnalyticalModelFixtures.SingleBox().ToOpenStudio(epwPath, outputDirectory, openStudioConversionOptions: options, run: false); + } + + private static string CreateMeasureDirectory(string root, string name) + { + string directory = Path.Combine(root, name); + Directory.CreateDirectory(directory); + File.WriteAllText(Path.Combine(directory, "measure.rb"), "class " + name.Replace(" ", "") + " < OpenStudio::Measure::ModelMeasure\nend\n"); + File.WriteAllText(Path.Combine(directory, "measure.xml"), "\n\n 3.0\n " + name + "\n\n"); + return directory; + } + + [Test] + public void NoMeasures_WritesMinimalWorkflow() + { + using (OpenStudioConversionResult result = Convert_NoRun(null)) + { + string osw = File.ReadAllText(result.OswPath); + Assert.That(osw, Does.Not.Contain("measure_paths"), "No measure paths without measures"); + Assert.That(osw, Does.Contain("\"steps\": []"), "The default workflow keeps the minimal empty-steps shape"); + Assert.That(Directory.Exists(Path.Combine(Path.GetDirectoryName(result.OswPath), "measures")), Is.False, "No measures directory is generated"); + } + } + + [Test] + public void MeasurePaths_BecomeWorkflowSteps() + { + string measuresRoot = Path.Combine(TestContext.CurrentContext.WorkDirectory, "caller_measures", System.Guid.NewGuid().ToString("N").Substring(0, 8)); + string measureDirectory = CreateMeasureDirectory(measuresRoot, "my_test_measure"); + string missingDirectory = Path.Combine(measuresRoot, "missing_measure"); + + Core.OpenStudio.OpenStudioConversionOptions options = new Core.OpenStudio.OpenStudioConversionOptions + { + MeasurePaths = new List { measureDirectory, missingDirectory }, + }; + + using (OpenStudioConversionResult result = Convert_NoRun(options)) + { + string osw = File.ReadAllText(result.OswPath); + Assert.That(osw, Does.Contain("\"measure_dir_name\": \"my_test_measure\""), "The measure becomes a workflow step"); + Assert.That(osw, Does.Contain(measuresRoot.Replace('\\', '/')), "The measure parent directory is a measure path"); + + Assert.That(result.Diagnostics.Count(d => d.Code == "SAM-OS-SET-001" && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Information && d.Message.Contains("my_test_measure")), Is.EqualTo(1), "Each applied measure is named in a diagnostic"); + Assert.That(result.Diagnostics.Count(d => d.Code == "SAM-OS-SET-001" && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning && d.Message.Contains("missing_measure")), Is.EqualTo(1), "A missing measure directory warns — never silently skipped"); + } + } + + [Test] + public void AdditionalIdfStrings_GenerateEnergyPlusMeasure() + { + Core.OpenStudio.OpenStudioConversionOptions options = new Core.OpenStudio.OpenStudioConversionOptions + { + AdditionalIdfStrings = new List { "Output:Variable,*,Site Outdoor Air Dewpoint Temperature,hourly;" }, + }; + + using (OpenStudioConversionResult result = Convert_NoRun(options)) + { + string runDirectory = Path.GetDirectoryName(result.OswPath); + string measureDirectory = Path.Combine(runDirectory, "measures", "sam_additional_idf_objects"); + + Assert.That(File.Exists(Path.Combine(measureDirectory, "measure.rb")), Is.True, "The generated measure script exists"); + Assert.That(File.Exists(Path.Combine(measureDirectory, "measure.xml")), Is.True, "The generated measure.xml exists (required by the CLI)"); + + string ruby = File.ReadAllText(Path.Combine(measureDirectory, "measure.rb")); + Assert.That(ruby, Does.Contain("class SAMAdditionalIdfObjects < OpenStudio::Measure::EnergyPlusMeasure")); + Assert.That(ruby, Does.Contain("Site Outdoor Air Dewpoint Temperature"), "The IDF string is embedded verbatim"); + + string osw = File.ReadAllText(result.OswPath); + Assert.That(osw, Does.Contain("\"measure_dir_name\": \"sam_additional_idf_objects\""), "The generated measure is a workflow step"); + + Assert.That(result.Diagnostics.Count(d => d.Code == "SAM-OS-SET-001" && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Information && d.Message.Contains("1 additional IDF string")), Is.EqualTo(1), "The injection is named in a diagnostic"); + } + } + + [Test] + [Category("Simulation")] + public void AdditionalIdfStrings_ReachEnergyPlus() + { + string epwPath = WeatherPath(".epw"); + Assert.That(File.Exists(epwPath), Is.True); + Assert.That(Core.OpenStudio.Query.OpenStudioCliPath(), Is.Not.Null, "OpenStudio CLI required for this test"); + + Core.OpenStudio.OpenStudioConversionOptions options = new Core.OpenStudio.OpenStudioConversionOptions + { + AdditionalIdfStrings = new List { "Output:Variable,*,Site Outdoor Air Dewpoint Temperature,hourly;" }, + }; + + string outputDirectory = Path.Combine(TestContext.CurrentContext.WorkDirectory, "workflow_addstr_run"); + using (OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox().ToOpenStudio(epwPath, outputDirectory, openStudioConversionOptions: options)) + { + Assert.That(result.RunResult?.Success, Is.True, "A valid IDF string must not break the run"); + + string idfPath = Path.Combine(Path.GetDirectoryName(result.OswPath), "run", "in.idf"); + Assert.That(File.Exists(idfPath), Is.True); + Assert.That(File.ReadAllText(idfPath), Does.Contain("Site Outdoor Air Dewpoint Temperature"), "The injected object reached the EnergyPlus IDF"); + } + } + + [Test] + [Category("Simulation")] + public void InvalidAdditionalIdfString_FailsRun() + { + string epwPath = WeatherPath(".epw"); + Assert.That(File.Exists(epwPath), Is.True); + Assert.That(Core.OpenStudio.Query.OpenStudioCliPath(), Is.Not.Null, "OpenStudio CLI required for this test"); + + Core.OpenStudio.OpenStudioConversionOptions options = new Core.OpenStudio.OpenStudioConversionOptions + { + AdditionalIdfStrings = new List { "This is not an IDF object" }, + }; + + string outputDirectory = Path.Combine(TestContext.CurrentContext.WorkDirectory, "workflow_addstr_invalid"); + using (OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox().ToOpenStudio(epwPath, outputDirectory, openStudioConversionOptions: options)) + { + Assert.That(result.RunResult?.Success, Is.Not.True, "An unparseable IDF string fails the workflow step — and therefore the run; invalid objects are never silently dropped"); + } + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/M7/RegressionTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/M7/RegressionTests.cs new file mode 100644 index 0000000..3eb20da --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/M7/RegressionTests.cs @@ -0,0 +1,199 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// M7: fixture regression suite — semantic assertions, failure policy, determinism, no source mutation (plan §12/§13). + [TestFixture] + public class RegressionTests + { + [Test] + public void TwoLevels_AssignSpacesToStories_AndFlipSharedFloorTypes() + { + OpenStudioConversionResult result = AnalyticalModelFixtures.TwoStackedBoxes().ToOpenStudio(); + global::OpenStudio.Model model = result.Model; + + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in result.Diagnostics) + { + TestContext.Out.WriteLine(diagnostic.ToString()); + } + + Assert.That(result.IsValid, Is.True); + Assert.That(model.getSpaces().Count, Is.EqualTo(2)); + Assert.That(model.getBuildingStorys().Count, Is.GreaterThanOrEqualTo(2), "At least the 0 m and 3 m stories must exist"); + + foreach (global::OpenStudio.Space space in model.getSpaces()) + { + global::OpenStudio.OptionalBuildingStory story = space.buildingStory(); + Assert.That(story != null && !story.isNull(), $"{space.nameString()} must be assigned to a story"); + + bool isLower = space.nameString().Contains("Lower"); + Assert.That(story.get().nameString(), Does.Contain(isLower ? "_0m" : "_3m"), $"{space.nameString()} story"); + } + + List internalSurfaces = new List(); + foreach (global::OpenStudio.Surface surface in model.getSurfaces()) + { + if (surface.outsideBoundaryCondition() == "Surface") + { + internalSurfaces.Add(surface); + } + } + + Assert.That(internalSurfaces.Count, Is.EqualTo(2), "Both sides of the shared internal floor"); + + List surfaceTypes = internalSurfaces.ConvertAll(s => s.surfaceType()); + Assert.That(surfaceTypes, Does.Contain("RoofCeiling"), "The lower space sees the shared panel as its ceiling"); + Assert.That(surfaceTypes, Does.Contain("Floor"), "The upper space sees the shared panel as its floor"); + } + + [Test] + public void ConditionedUnconditionedPair_OnlyConditionedZoneGetsHvac() + { + OpenStudioConversionResult result = AnalyticalModelFixtures.TwoAdjacentBoxes(spaceBUnconditioned: true).ToOpenStudio(); + global::OpenStudio.Model model = result.Model; + + Assert.That(result.IsValid, Is.True); + Assert.That(model.getThermalZones().Count, Is.EqualTo(2), "Unconditioned space keeps its zone and geometry"); + Assert.That(model.getThermostatSetpointDualSetpoints().Count, Is.EqualTo(1), "Only the conditioned zone gets a thermostat"); + Assert.That(model.getZoneHVACIdealLoadsAirSystems().Count, Is.EqualTo(1), "Only the conditioned zone gets Ideal Loads"); + Assert.That(model.getSpaceTypes().Count, Is.EqualTo(2), "The unconditioned condition still carries its gains via its own SpaceType"); + } + + [Test] + public void IrregularPlanarRoom_IsCleaned_WithWarning_AreaPreserved() + { + OpenStudioConversionResult result = AnalyticalModelFixtures.IrregularPlanarBox().ToOpenStudio(); + + Assert.That(result.IsValid, Is.True, "Cleaning is a warning, not an error"); + + foreach (global::OpenStudio.Space space in result.Model.getSpaces()) + { + Assert.That(space.floorArea, Is.EqualTo(20.0).Within(1e-6), "Cleaning must not change the floor area"); + } + + Assert.That(result.Model.getSurfaces().Count, Is.EqualTo(6)); + } + + [Test] + public void DegeneratePanel_IsSkippedWithDiagnostic_NeverRepairedOrSilent() + { + OpenStudioConversionResult result = AnalyticalModelFixtures.DegeneratePanelBox().ToOpenStudio(); + + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in result.Diagnostics) + { + TestContext.Out.WriteLine(diagnostic.ToString()); + } + + // The degenerate sliver makes SAM's own shell computation (UpdateNormals → + // Panel.Face3D) throw for the whole space. The converter must isolate that kernel + // failure: space-level SAM-OS-GEO-001 error, per-panel no-surface warnings, no crash, + // no repair — and the result is invalid. + Assert.That(result.IsValid, Is.False, "A space whose shell cannot be computed must invalidate the conversion"); + Assert.That(result.Diagnostics.Any(d => d.Code == "SAM-OS-GEO-001" && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error && d.Message.Contains("shell")), Is.True, "The kernel failure must be a diagnosed error, never a crash"); + Assert.That(result.Diagnostics.Count(d => d.Code == "SAM-OS-GEO-001" && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning && d.Message.Contains("no surface")), Is.EqualTo(6), "Every unconverted panel must be reported — no silent drops"); + Assert.That(result.Model.getSurfaces().Count, Is.EqualTo(0), "No surfaces can be created when the space shell fails; nothing is repaired"); + } + + [Test] + public void RepeatedConversion_DoesNotMutate_TheSourceModel() + { + AnalyticalModel analyticalModel = AnalyticalModelFixtures.TwoAdjacentBoxes(); + AdjacencyCluster adjacencyCluster = analyticalModel.AdjacencyCluster; + + List panelsBefore = adjacencyCluster.GetPanels(); + Dictionary normalsBefore = panelsBefore.ToDictionary(p => p.Guid, p => new[] { p.Normal.X, p.Normal.Y, p.Normal.Z }); + Dictionary apertureCountsBefore = panelsBefore.ToDictionary(p => p.Guid, p => p.Apertures?.Count ?? 0); + List spaceGuidsBefore = adjacencyCluster.GetSpaces().ConvertAll(s => s.Guid); + + analyticalModel.ToOpenStudio(); + analyticalModel.ToOpenStudio(); + + AdjacencyCluster adjacencyClusterAfter = analyticalModel.AdjacencyCluster; + List panelsAfter = adjacencyClusterAfter.GetPanels(); + + Assert.That(panelsAfter.Count, Is.EqualTo(panelsBefore.Count), "Panel count must be unchanged"); + Assert.That(adjacencyClusterAfter.GetSpaces().ConvertAll(s => s.Guid), Is.EquivalentTo(spaceGuidsBefore), "Space guids must be unchanged"); + + foreach (Panel panel in panelsAfter) + { + double[] normalBefore = normalsBefore[panel.Guid]; + Assert.That(panel.Normal.X, Is.EqualTo(normalBefore[0]).Within(1e-12), $"{panel.Name} normal X mutated"); + Assert.That(panel.Normal.Y, Is.EqualTo(normalBefore[1]).Within(1e-12), $"{panel.Name} normal Y mutated"); + Assert.That(panel.Normal.Z, Is.EqualTo(normalBefore[2]).Within(1e-12), $"{panel.Name} normal Z mutated"); + Assert.That(panel.Apertures?.Count ?? 0, Is.EqualTo(apertureCountsBefore[panel.Guid]), $"{panel.Name} aperture count mutated"); + } + } + + [Test] + public void RepeatedConversion_ProducesDeterministicNames() + { + AnalyticalModel analyticalModel = AnalyticalModelFixtures.TwoAdjacentBoxes(); + + OpenStudioConversionResult first = analyticalModel.ToOpenStudio(); + OpenStudioConversionResult second = analyticalModel.ToOpenStudio(); + + Assert.That(second.ObjectMap.Count, Is.EqualTo(first.ObjectMap.Count)); + foreach (KeyValuePair keyValuePair in first.ObjectMap) + { + Assert.That(second.ObjectMap.ContainsKey(keyValuePair.Key), Is.True); + Assert.That(second.ObjectMap[keyValuePair.Key], Is.EqualTo(keyValuePair.Value), "Names must be deterministic across conversions"); + } + } + + [Test] + public void RepeatedConversion_WithDisposal_DoesNotCrash() + { + for (int i = 0; i < 10; i++) + { + OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox().ToOpenStudio(); + Assert.That(result.IsValid, Is.True); + Assert.That(result.Model.getSurfaces().Count, Is.EqualTo(6)); + result.Model.Dispose(); + } + } + + [Test] + [Category("Simulation")] + public void TwoBoxes_EndToEnd_EnergyPlusRun_BothZonesProduceLoads() + { + string epwPath = Path.GetFullPath(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "..", "..", "..", "resources", "weather", "USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2004-2018.epw")); + Assert.That(File.Exists(epwPath), Is.True); + + string outputDirectory = Path.Combine(TestContext.CurrentContext.WorkDirectory, "e2e_two_boxes"); + if (Directory.Exists(outputDirectory)) + { + Directory.Delete(outputDirectory, true); + } + + OpenStudioConversionResult result = AnalyticalModelFixtures.TwoAdjacentBoxes().ToOpenStudio(epwPath, outputDirectory); + + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in result.Diagnostics) + { + TestContext.Out.WriteLine(diagnostic.ToString()); + } + + Assert.That(result.RunResult, Is.Not.Null); + Assert.That(result.RunResult.Success, Is.True, "Two-zone model with matched internal surfaces must simulate cleanly"); + Assert.That(result.RunResult.FatalErrors, Is.Empty); + Assert.That(result.RunResult.SevereErrors, Is.Empty); + + OpenStudioLoadSummary loads = result.Loads; + Assert.That(loads, Is.Not.Null); + Assert.That(loads.ZoneHeating.Count, Is.EqualTo(2), "Both conditioned zones must report results"); + Assert.That(loads.ZoneCooling.Count, Is.EqualTo(2)); + foreach (KeyValuePair zone in loads.ZoneHeating) + { + Assert.That(zone.Value, Is.GreaterThan(0), $"{zone.Key} must need heating in Boston"); + } + + TestContext.Out.WriteLine(string.Format("Annual heating {0:0.0} kWh, cooling {1:0.0} kWh", loads.TotalHeating, loads.TotalCooling)); + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/R1/OsmImportTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/R1/OsmImportTests.cs new file mode 100644 index 0000000..2d644c5 --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/R1/OsmImportTests.cs @@ -0,0 +1,343 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using System.Collections.Generic; +using System.Linq; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// R1: OpenStudio → SAM import of models produced by the forward conversion. Every fixture is + /// exported and re-imported in memory, so the two directions are exercised against each + /// other and any asymmetry shows up as a failing assertion rather than as a silently + /// different model. + /// + [TestFixture] + public class OsmImportTests + { + /// + /// Exports a SAM model and imports it back. The OpenStudio model is disposed with the + /// conversion result, so nothing native outlives the test. + /// + private static OpenStudioImportResult RoundTrip(AnalyticalModel analyticalModel, Core.OpenStudio.OpenStudioImportOptions openStudioImportOptions = null) + { + using (OpenStudioConversionResult conversionResult = analyticalModel.ToOpenStudio()) + { + Assert.That(conversionResult, Is.Not.Null); + Assert.That(conversionResult.IsValid, Is.True, "The forward conversion must succeed before the import can be judged"); + + OpenStudioImportResult result = conversionResult.Model.ToSAM(openStudioImportOptions); + Assert.That(result, Is.Not.Null); + + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in result.Diagnostics) + { + TestContext.Out.WriteLine(diagnostic.ToString()); + } + + return result; + } + } + + [Test] + public void SingleBox_ImportsOneClosedRoom() + { + OpenStudioImportResult result = RoundTrip(AnalyticalModelFixtures.SingleBox()); + + Assert.That(result.Successful, Is.True); + Assert.That(result.IsValid, Is.True, "Warnings are allowed; errors are not"); + + AdjacencyCluster adjacencyCluster = result.AnalyticalModel.AdjacencyCluster; + Assert.That(adjacencyCluster.GetSpaces().Count, Is.EqualTo(1)); + Assert.That(adjacencyCluster.GetPanels().Count, Is.EqualTo(6), "A closed box has six bounding panels"); + } + + [Test] + public void TwoAdjacentBoxes_ShareOneInternalPanelRelatedToBothSpaces() + { + OpenStudioImportResult result = RoundTrip(AnalyticalModelFixtures.TwoAdjacentBoxes()); + + AdjacencyCluster adjacencyCluster = result.AnalyticalModel.AdjacencyCluster; + List spaces = adjacencyCluster.GetSpaces(); + List panels = adjacencyCluster.GetPanels(); + + Assert.That(spaces.Count, Is.EqualTo(2)); + + // 6 + 6 bounding surfaces, with the shared wall counted once: 11, not 12. + Assert.That(panels.Count, Is.EqualTo(11), "The two OpenStudio surfaces of the shared wall must become ONE SAM panel"); + + List shared = panels.FindAll(x => adjacencyCluster.GetSpaces(x)?.Count == 2); + Assert.That(shared.Count, Is.EqualTo(1), "Exactly one panel is related to both spaces"); + Assert.That(shared[0].PanelType, Is.EqualTo(PanelType.WallInternal)); + } + + [Test] + public void PanelTypes_AndBoundaryConditions_RoundTrip() + { + OpenStudioImportResult result = RoundTrip(AnalyticalModelFixtures.TwoAdjacentBoxes()); + + List panels = result.AnalyticalModel.AdjacencyCluster.GetPanels(); + + Assert.That(panels.Count(x => x.PanelType == PanelType.SlabOnGrade), Is.EqualTo(2), "Ground-bearing floors"); + Assert.That(panels.Count(x => x.PanelType == PanelType.Roof), Is.EqualTo(2)); + Assert.That(panels.Count(x => x.PanelType == PanelType.WallExternal), Is.EqualTo(6)); + Assert.That(panels.Count(x => x.PanelType == PanelType.WallInternal), Is.EqualTo(1)); + } + + [Test] + public void Windows_AttachToTheirHostPanel() + { + OpenStudioImportResult result = RoundTrip(AnalyticalModelFixtures.SingleBox()); + + List panels = result.AnalyticalModel.AdjacencyCluster.GetPanels(); + List apertures = new List(); + foreach (Panel panel in panels) + { + if (panel.Apertures != null) + { + apertures.AddRange(panel.Apertures); + } + } + + Assert.That(apertures.Count, Is.EqualTo(1), "The fixture's single window must survive the round trip"); + Assert.That(apertures[0].ApertureType, Is.EqualTo(ApertureType.Window)); + Assert.That(apertures[0].GetFace3D().GetArea(), Is.GreaterThan(0)); + } + + [Test] + public void SingleBoxWithoutWindow_ImportsNoApertures() + { + OpenStudioImportResult result = RoundTrip(AnalyticalModelFixtures.SingleBox(includeWindow: false)); + + foreach (Panel panel in result.AnalyticalModel.AdjacencyCluster.GetPanels()) + { + Assert.That(panel.Apertures == null || panel.Apertures.Count == 0, Is.True); + } + } + + [Test] + public void StackedBoxes_ImportSharedFloorCeiling() + { + OpenStudioImportResult result = RoundTrip(AnalyticalModelFixtures.TwoStackedBoxes()); + + AdjacencyCluster adjacencyCluster = result.AnalyticalModel.AdjacencyCluster; + List panels = adjacencyCluster.GetPanels(); + + Assert.That(adjacencyCluster.GetSpaces().Count, Is.EqualTo(2)); + + List shared = panels.FindAll(x => adjacencyCluster.GetSpaces(x)?.Count == 2); + Assert.That(shared.Count, Is.EqualTo(1), "The slab between the two storeys is one shared panel"); + Assert.That(shared[0].PanelType, Is.EqualTo(PanelType.FloorInternal).Or.EqualTo(PanelType.Ceiling)); + } + + [Test] + public void FloorArea_And_Volume_SurviveWithinTolerance() + { + AnalyticalModel source = AnalyticalModelFixtures.SingleBox(); + OpenStudioImportResult result = RoundTrip(source); + + Space sourceSpace = source.AdjacencyCluster.GetSpaces()[0]; + Space importedSpace = result.AnalyticalModel.AdjacencyCluster.GetSpaces()[0]; + + double sourceVolume; + double importedVolume; + Assert.That(sourceSpace.TryGetValue(SpaceParameter.Volume, out sourceVolume), Is.True); + Assert.That(importedSpace.TryGetValue(SpaceParameter.Volume, out importedVolume), Is.True, "Volume must be derived from the imported shell"); + Assert.That(importedVolume, Is.EqualTo(sourceVolume).Within(0.01).Percent); + } + + [Test] + public void ApertureArea_SurvivesWithinTolerance() + { + AnalyticalModel source = AnalyticalModelFixtures.SingleBox(); + OpenStudioImportResult result = RoundTrip(source); + + Assert.That(TotalApertureArea(result.AnalyticalModel), Is.EqualTo(TotalApertureArea(source)).Within(0.5).Percent); + } + + private static double TotalApertureArea(AnalyticalModel analyticalModel) + { + double result = 0; + foreach (Panel panel in analyticalModel.AdjacencyCluster.GetPanels()) + { + if (panel.Apertures == null) + { + continue; + } + + foreach (Aperture aperture in panel.Apertures) + { + result += aperture.GetFace3D().GetArea(); + } + } + + return result; + } + + [Test] + public void Constructions_And_MaterialLayers_RoundTrip() + { + OpenStudioImportResult result = RoundTrip(AnalyticalModelFixtures.SingleBox()); + + List constructions = result.AnalyticalModel.AdjacencyCluster.GetConstructions(); + Assert.That(constructions, Is.Not.Null.And.Not.Empty); + + Construction wall = constructions.Find(x => x.ConstructionLayers != null && x.ConstructionLayers.Count > 0); + Assert.That(wall, Is.Not.Null, "At least one imported construction must carry its layers"); + + Core.MaterialLibrary materialLibrary = result.AnalyticalModel.MaterialLibrary; + Assert.That(materialLibrary, Is.Not.Null); + + foreach (ConstructionLayer constructionLayer in wall.ConstructionLayers) + { + Assert.That(constructionLayer.Thickness, Is.GreaterThan(0), "No imported layer may be zero-thickness"); + Assert.That(materialLibrary.GetMaterial(constructionLayer.Name), Is.Not.Null, "Every referenced material must be in the library"); + } + } + + [Test] + public void UnreferencedMaterials_ArePruned() + { + OpenStudioImportResult result = RoundTrip(AnalyticalModelFixtures.SingleBox()); + + HashSet referenced = new HashSet(); + foreach (Construction construction in result.AnalyticalModel.AdjacencyCluster.GetConstructions()) + { + construction.ConstructionLayers?.ForEach(x => referenced.Add(x.Name)); + } + + foreach (ApertureConstruction apertureConstruction in result.AnalyticalModel.AdjacencyCluster.GetApertureConstructions()) + { + apertureConstruction.PaneConstructionLayers?.ForEach(x => referenced.Add(x.Name)); + apertureConstruction.FrameConstructionLayers?.ForEach(x => referenced.Add(x.Name)); + } + + foreach (Core.IMaterial material in result.AnalyticalModel.MaterialLibrary.GetMaterials()) + { + Assert.That(referenced.Contains(material.Name), Is.True, $"Material '{material.Name}' is not referenced by any imported construction and should have been pruned"); + } + } + + [Test] + public void OpaqueAirGap_RoundTripsItsHeatTransferCoefficient() + { + const double heatTransferCoefficient = 1.25; + + OpenStudioImportResult result = RoundTrip(AnalyticalModelFixtures.OpaqueAirGapBox(heatTransferCoefficient)); + + Core.GasMaterial gasMaterial = result.AnalyticalModel.MaterialLibrary.GetMaterials().OfType().FirstOrDefault(); + Assert.That(gasMaterial, Is.Not.Null, "The opaque cavity must import as a SAM gas material"); + + double imported; + Assert.That(gasMaterial.TryGetValue(GasMaterialParameter.HeatTransferCoefficient, out imported), Is.True); + + // Forward writes R = 1/h, reverse reads h = 1/R: the pair must be exact. + Assert.That(imported, Is.EqualTo(heatTransferCoefficient).Within(1e-9)); + } + + [Test] + public void InternalConditions_And_Profiles_RoundTrip() + { + OpenStudioImportResult result = RoundTrip(AnalyticalModelFixtures.SingleBox()); + + List spaces = result.AnalyticalModel.AdjacencyCluster.GetSpaces(); + InternalCondition internalCondition = spaces[0].InternalCondition; + Assert.That(internalCondition, Is.Not.Null, "The imported space must carry an internal condition"); + + string occupancyProfileName; + Assert.That(internalCondition.TryGetValue(InternalConditionParameter.OccupancyProfileName, out occupancyProfileName), Is.True, "The occupancy schedule must return as a SAM profile"); + + ProfileLibrary profileLibrary = result.AnalyticalModel.ProfileLibrary; + Assert.That(profileLibrary, Is.Not.Null); + Assert.That(profileLibrary.GetProfiles().Find(x => x.Name == occupancyProfileName), Is.Not.Null, "The referenced profile must be in the library"); + } + + [Test] + public void HeatingAndCoolingSetpoints_ImportAsProfiles() + { + OpenStudioImportResult result = RoundTrip(AnalyticalModelFixtures.SingleBox()); + + InternalCondition internalCondition = result.AnalyticalModel.AdjacencyCluster.GetSpaces()[0].InternalCondition; + + string heatingProfileName; + string coolingProfileName; + Assert.That(internalCondition.TryGetValue(InternalConditionParameter.HeatingProfileName, out heatingProfileName), Is.True); + Assert.That(internalCondition.TryGetValue(InternalConditionParameter.CoolingProfileName, out coolingProfileName), Is.True); + + ProfileLibrary profileLibrary = result.AnalyticalModel.ProfileLibrary; + Profile heating = profileLibrary.GetProfiles().Find(x => x.Name == heatingProfileName); + Assert.That(heating, Is.Not.Null); + + // SAM stores setpoints as profiles whose values ARE the temperatures. + // Profile.Count is the index span, not the value count (see the forward converter's + // note): an 8760-value annual profile spans indices 0..8759. + Assert.That(heating.Min, Is.EqualTo(0)); + Assert.That(heating.Max, Is.EqualTo(8759), "Imported profiles are annual hourly"); + Assert.That(heating[0], Is.EqualTo(21).Within(0.5), "The fixture's 21 degC heating setpoint must survive"); + Assert.That(heating[8759], Is.EqualTo(21).Within(0.5), "The setpoint must hold to the last hour of the year"); + } + + [Test] + public void Shading_ImportsAsShadePanels() + { + AnalyticalModel source = AnalyticalModelFixtures.SingleBox(); + + OpenStudioImportResult result = RoundTrip(source); + + List shades = result.AnalyticalModel.AdjacencyCluster.GetPanels().FindAll(x => x.PanelType == PanelType.Shade); + + // The fixture carries no shade panels, so importing any would mean the converter + // invented geometry. This is the negative half of the shading contract; the positive + // half is covered by ShadingSurfaceImportTests. + Assert.That(shades.Count, Is.EqualTo(0)); + } + + [Test] + public void ImportOptions_CanSuppressConstructionsAndConditions() + { + Core.OpenStudio.OpenStudioImportOptions options = new Core.OpenStudio.OpenStudioImportOptions + { + IncludeConstructions = false, + IncludeInternalConditions = false, + }; + + OpenStudioImportResult result = RoundTrip(AnalyticalModelFixtures.SingleBox(), options); + + Assert.That(result.Successful, Is.True, "Geometry-only import must still produce a model"); + Assert.That(result.AnalyticalModel.AdjacencyCluster.GetPanels().Count, Is.EqualTo(6)); + Assert.That(result.AnalyticalModel.MaterialLibrary.GetMaterials()?.Count ?? 0, Is.Zero); + } + + [Test] + public void NorthAxis_ImportsFromDegreesIntoRadians() + { + // Set on the OpenStudio model directly: the geometry-only forward overload does not + // apply simulation settings, and the north axis is what is under test here, not which + // forward overload writes it. + using (OpenStudioConversionResult conversionResult = AnalyticalModelFixtures.SingleBox().ToOpenStudio()) + { + conversionResult.Model.getBuilding().setNorthAxis(45); + + OpenStudioImportResult result = conversionResult.Model.ToSAM(); + + double northAngle; + Assert.That(result.AnalyticalModel.TryGetValue(AnalyticalModelParameter.NorthAngle, out northAngle), Is.True); + Assert.That(northAngle, Is.EqualTo(System.Math.PI / 4).Within(1e-9)); + } + } + + [Test] + public void EmptyModel_ProducesAModelAndReportsTheAbsenceOfSpaces() + { + using (global::OpenStudio.Model model = new global::OpenStudio.Model()) + { + OpenStudioImportResult result = model.ToSAM(); + + Assert.That(result.Successful, Is.True, "An empty model is not a failure; it is an empty building"); + // SAM collection getters return null rather than an empty list when nothing matches. + Assert.That(result.AnalyticalModel.AdjacencyCluster.GetSpaces()?.Count ?? 0, Is.Zero); + Assert.That(result.Diagnostics.Any(x => x.Code == Core.OpenStudio.OpenStudioImportDiagnosticCodes.ZoneIncomplete), Is.True, "The absence of spaces must be reported, never silent"); + } + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/R2/OswImportTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/R2/OswImportTests.cs new file mode 100644 index 0000000..902884e --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/R2/OswImportTests.cs @@ -0,0 +1,432 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// R2: OSW import. The seed-versus-executed distinction is the point of these tests — an OSW + /// is a workflow description, and importing it must never quietly present the seed as the + /// workflow's output (or vice versa). + /// + /// Fixtures are generated on the fly rather than committed as binaries: an OSM written by the + /// forward converter is exactly the file the round trip is about, and generating it keeps the + /// test honest when the exporter changes. + /// + /// + [TestFixture] + public class OswImportTests + { + private string directory; + + [SetUp] + public void SetUp() + { + directory = Path.Combine(Path.GetTempPath(), "SAM_OpenStudio_OswTests_" + Guid.NewGuid().ToString("N").Substring(0, 8)); + Directory.CreateDirectory(directory); + } + + [TearDown] + public void TearDown() + { + try + { + Directory.Delete(directory, true); + } + catch (Exception) + { + // a locked temp directory must not fail an otherwise passing test + } + } + + /// Writes a seed OSM produced by the forward conversion. + private string WriteSeedOsm(string relativePath = "seed.osm") + { + string path = Path.Combine(directory, relativePath); + Directory.CreateDirectory(Path.GetDirectoryName(path)); + + using (OpenStudioConversionResult conversionResult = AnalyticalModelFixtures.TwoAdjacentBoxes().ToOpenStudio()) + { + Assert.That(conversionResult.Model.save(global::OpenStudio.OpenStudioUtilitiesCore.toPath(path), true), Is.True); + } + + return path; + } + + private string WriteOsw(string json, string name = "workflow.osw") + { + string path = Path.Combine(directory, name); + File.WriteAllText(path, json); + return path; + } + + [Test] + public void SeedOnly_ExecutionDisabled_ImportsSeedAndWarnsMeasuresNotApplied() + { + WriteSeedOsm(); + string oswPath = WriteOsw("{\n \"seed_file\": \"seed.osm\",\n \"steps\": [ { \"measure_dir_name\": \"SomeModelMeasure\", \"arguments\": {} } ]\n}"); + + OpenStudioImportResult result = Convert.ToSAM(oswPath); + + Assert.That(result.Successful, Is.True); + Assert.That(result.AnalyticalModel.AdjacencyCluster.GetSpaces().Count, Is.EqualTo(2)); + Assert.That(result.ResolvedOsmPath, Does.EndWith("seed.osm")); + Assert.That(result.SourcePath, Is.EqualTo(oswPath)); + + Core.OpenStudio.OpenStudioDiagnostic diagnostic = result.Diagnostics.FirstOrDefault(x => x.Code == Core.OpenStudio.OpenStudioImportDiagnosticCodes.OswWorkflowNotExecuted); + Assert.That(diagnostic, Is.Not.Null, "Not applying the workflow's measures must be stated, never implied"); + Assert.That(diagnostic.Severity, Is.EqualTo(Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning)); + Assert.That(diagnostic.Message, Does.Contain("NOT")); + } + + [Test] + public void RelativeSeedPath_ResolvesAgainstTheFilesSubdirectory() + { + // The CLI's conventional layout: the OSW names "seed.osm" and the model lives in + // /files. + WriteSeedOsm(Path.Combine("files", "seed.osm")); + string oswPath = WriteOsw("{\n \"seed_file\": \"seed.osm\",\n \"steps\": []\n}"); + + OpenStudioImportResult result = Convert.ToSAM(oswPath); + + Assert.That(result.Successful, Is.True); + Assert.That(result.ResolvedOsmPath, Does.Contain("files")); + } + + [Test] + public void RelativeSeedPath_ResolvesThroughFilePaths() + { + string modelsDirectory = Path.Combine(directory, "models"); + WriteSeedOsm(Path.Combine("models", "seed.osm")); + + string oswPath = WriteOsw(string.Format("{{\n \"seed_file\": \"seed.osm\",\n \"file_paths\": [\"{0}\"],\n \"steps\": []\n}}", modelsDirectory.Replace('\\', '/'))); + + OpenStudioImportResult result = Convert.ToSAM(oswPath); + + Assert.That(result.Successful, Is.True); + Assert.That(result.ResolvedOsmPath, Does.Contain("models")); + } + + [Test] + public void MissingSeed_ExecutionDisabled_FailsWithSeedNotFound() + { + string oswPath = WriteOsw("{\n \"seed_file\": \"absent.osm\",\n \"steps\": []\n}"); + + OpenStudioImportResult result = Convert.ToSAM(oswPath); + + Assert.That(result.Successful, Is.False); + Assert.That(result.AnalyticalModel, Is.Null, "Nothing may be returned when there is no model to import"); + + Core.OpenStudio.OpenStudioDiagnostic diagnostic = result.Diagnostics.FirstOrDefault(x => x.Code == Core.OpenStudio.OpenStudioImportDiagnosticCodes.OswSeedNotFound); + Assert.That(diagnostic, Is.Not.Null); + Assert.That(diagnostic.Severity, Is.EqualTo(Core.OpenStudio.OpenStudioDiagnosticSeverity.Error)); + Assert.That(diagnostic.Message, Does.Contain("Searched"), "The failure must name where the seed was looked for"); + } + + [Test] + public void NoSeed_ExecutionDisabled_BlocksExplicitly() + { + string oswPath = WriteOsw("{\n \"steps\": [ { \"measure_dir_name\": \"CreateModel\", \"arguments\": {} } ]\n}"); + + OpenStudioImportResult result = Convert.ToSAM(oswPath); + + Assert.That(result.Successful, Is.False); + Assert.That(result.Diagnostics.Any(x => x.Code == Core.OpenStudio.OpenStudioImportDiagnosticCodes.OswSeedMissing && x.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error), Is.True); + } + + [Test] + public void MalformedOsw_FailsWithParseDiagnostic() + { + string oswPath = WriteOsw("{ this is not json"); + + OpenStudioImportResult result = Convert.ToSAM(oswPath); + + Assert.That(result.Successful, Is.False); + Assert.That(result.Diagnostics.Any(x => x.Code == Core.OpenStudio.OpenStudioImportDiagnosticCodes.OswParseFailed && x.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error), Is.True); + } + + [Test] + public void OswThatIsAJsonArray_FailsWithParseDiagnostic() + { + string oswPath = WriteOsw("[]"); + + OpenStudioImportResult result = Convert.ToSAM(oswPath); + + Assert.That(result.Successful, Is.False); + Assert.That(result.Diagnostics.Any(x => x.Code == Core.OpenStudio.OpenStudioImportDiagnosticCodes.OswParseFailed), Is.True); + } + + [Test] + public void MissingPath_FailsWithInvalidInput() + { + OpenStudioImportResult result = Convert.ToSAM(Path.Combine(directory, "nothing-here.osm")); + + Assert.That(result.Successful, Is.False); + Assert.That(result.Diagnostics.Any(x => x.Code == Core.OpenStudio.OpenStudioImportDiagnosticCodes.InputPathInvalid), Is.True); + } + + [Test] + public void UnsupportedExtension_FailsExplicitly() + { + string path = Path.Combine(directory, "model.idf"); + File.WriteAllText(path, "Version,9.6;"); + + OpenStudioImportResult result = Convert.ToSAM(path); + + Assert.That(result.Successful, Is.False); + Assert.That(result.Diagnostics.Any(x => x.Code == Core.OpenStudio.OpenStudioImportDiagnosticCodes.InputExtensionUnsupported), Is.True); + } + + [Test] + public void CorruptOsm_FailsWithLoadDiagnosticAndNoEmptyModel() + { + string path = Path.Combine(directory, "corrupt.osm"); + File.WriteAllText(path, "this is not an OpenStudio model"); + + OpenStudioImportResult result = Convert.ToSAM(path); + + Assert.That(result.AnalyticalModel, Is.Null, "A corrupt OSM must never yield a silently empty AnalyticalModel"); + Assert.That(result.Diagnostics.Any(x => x.Code == Core.OpenStudio.OpenStudioImportDiagnosticCodes.OsmLoadFailed && x.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error), Is.True); + } + + [Test] + public void OsmImport_NeedsNoWeatherFile() + { + string osmPath = WriteSeedOsm(); + + // No EPW anywhere near this call: geometry and analytical data must import without one. + OpenStudioImportResult result = Convert.ToSAM(osmPath); + + Assert.That(result.Successful, Is.True); + Assert.That(result.IsValid, Is.True); + Assert.That(result.ResolvedOsmPath, Is.EqualTo(osmPath)); + } + + [Test] + public void ParallelImports_OfOneOsw_UseIsolatedRunDirectories() + { + WriteSeedOsm(); + string oswPath = WriteOsw("{\n \"seed_file\": \"seed.osm\",\n \"steps\": []\n}"); + + string failureReason; + OpenStudioWorkflow workflow = OpenStudioWorkflow.Parse(oswPath, out failureReason); + Assert.That(workflow, Is.Not.Null, failureReason); + + // The staging step is what provides isolation; running the CLI twice in parallel is a + // multi-minute integration test, so the isolation itself is what is asserted here. + string first = workflow.WriteIsolatedCopy(Path.Combine(directory, "run_a"), Path.Combine(directory, "seed.osm")); + string second = workflow.WriteIsolatedCopy(Path.Combine(directory, "run_b"), Path.Combine(directory, "seed.osm")); + + Assert.That(Path.GetDirectoryName(first), Is.Not.EqualTo(Path.GetDirectoryName(second))); + Assert.That(File.Exists(first), Is.True); + Assert.That(File.Exists(second), Is.True); + + foreach (string path in new[] { first, second }) + { + string json = File.ReadAllText(path); + Assert.That(json, Does.Contain("seed.osm")); + } + } + + [Test] + public void IsolatedCopy_PinsRunDirectoryToTheStagedRunSubdirectory() + { + // Regression guard for a bug that took two wrong fixes to get right, verified against + // a real executed workflow: + // - run_directory unset -> the CLI resolves it against "root", which points at the + // ORIGINAL workflow's folder, so the output escapes the + // staged directory and parallel imports collide. + // - run_directory = -> the CLI writes eplusout.sql / eplusout.err / in.osm + // into the staged ROOT, where OpenStudioSimulationRunner + // does not look, silently losing the results AND the + // EnergyPlus severe-error report. + // Only /run keeps the output isolated AND where the runner reads it. + WriteSeedOsm(); + string oswPath = WriteOsw("{\n \"seed_file\": \"seed.osm\",\n \"run_directory\": \"C:/somewhere/else\",\n \"steps\": []\n}"); + + string failureReason; + OpenStudioWorkflow workflow = OpenStudioWorkflow.Parse(oswPath, out failureReason); + Assert.That(workflow, Is.Not.Null, failureReason); + + string stagedDirectory = Path.Combine(directory, "staged"); + string copyPath = workflow.WriteIsolatedCopy(stagedDirectory, Path.Combine(directory, "seed.osm")); + + string runDirectory = ReadJsonString(copyPath, "run_directory"); + Assert.That(runDirectory, Is.Not.Null, "The staged copy must pin run_directory"); + Assert.That(runDirectory, Does.Not.Contain("somewhere/else"), "The source OSW's run_directory must not be honoured"); + + string expected = Path.Combine(Path.GetFullPath(stagedDirectory), "run").Replace('\\', '/'); + Assert.That(runDirectory, Is.EqualTo(expected), "run_directory must be the staged directory's 'run' subdirectory - isolated, and where the runner reads results and errors"); + } + + /// Reads a top-level string property from a JSON file. + private static string ReadJsonString(string path, string key) + { + System.Text.Json.Nodes.JsonObject jsonObject = System.Text.Json.Nodes.JsonNode.Parse(File.ReadAllText(path)) as System.Text.Json.Nodes.JsonObject; + System.Text.Json.Nodes.JsonNode jsonNode; + if (jsonObject == null || !jsonObject.TryGetPropertyValue(key, out jsonNode) || jsonNode == null) + { + return null; + } + + return jsonNode.GetValue(); + } + + [Test] + public void IsolatedCopy_PreservesStepsAndArgumentsVerbatim() + { + WriteSeedOsm(); + string oswPath = WriteOsw("{\n \"seed_file\": \"seed.osm\",\n \"steps\": [ { \"measure_dir_name\": \"SetWindowToWallRatio\", \"arguments\": { \"wwr\": 0.42, \"sillHeight\": 0.8 } } ]\n}"); + + string failureReason; + OpenStudioWorkflow workflow = OpenStudioWorkflow.Parse(oswPath, out failureReason); + Assert.That(workflow, Is.Not.Null, failureReason); + + string copyPath = workflow.WriteIsolatedCopy(Path.Combine(directory, "run"), Path.Combine(directory, "seed.osm")); + string json = File.ReadAllText(copyPath); + + Assert.That(json, Does.Contain("SetWindowToWallRatio")); + Assert.That(json, Does.Contain("0.42"), "Measure arguments must survive staging untouched"); + Assert.That(json, Does.Contain("0.8")); + } + + [Test] + public void RunDiagnostics_AreReBadgedWhenAModelWasProducedWithoutSimulationResults() + { + // The shared simulation runner calls a run failed when EnergyPlus produced no SQLite + // results. For an import that is not a failure: a workflow of model measures with no + // simulation step legitimately produces a model and no results. Left as an Error it + // would make IsValid false and report a perfectly good import as failed - which is + // exactly what a real executed OSW did. + List diagnostics = new List(); + List runDiagnostics = new List + { + new Core.OpenStudio.OpenStudioDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.RunCliFailed, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "OpenStudio CLI run failed (exit code 0, SQL missing, 0 fatal error(s))."), + }; + + // A clean run (exit 0, no fatal errors) that produced a model. + Core.OpenStudio.OpenStudioRunResult runResult = new Core.OpenStudio.OpenStudioRunResult(false, 0, null, null, null, null, new List(), new List()); + + InvokeAppendRunDiagnostics(diagnostics, runDiagnostics, runResult, true); + + Assert.That(diagnostics.Any(x => x.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error), Is.False, "A results-less but successful workflow must not leave an Error that invalidates the import"); + Assert.That(diagnostics.Any(x => x.Code == Core.OpenStudio.OpenStudioImportDiagnosticCodes.OswNoSimulationResults), Is.True); + } + + [Test] + public void RunDiagnostics_KeepTheirSeverityWhenNoModelWasProduced() + { + List diagnostics = new List(); + List runDiagnostics = new List + { + new Core.OpenStudio.OpenStudioDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.RunCliFailed, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "OpenStudio CLI run failed (exit code 1)."), + }; + + Core.OpenStudio.OpenStudioRunResult runResult = new Core.OpenStudio.OpenStudioRunResult(false, 1, null, null, null, null, new List(), new List { "fatal" }); + + InvokeAppendRunDiagnostics(diagnostics, runDiagnostics, runResult, false); + + Assert.That(diagnostics.Any(x => x.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error), Is.True, "A genuine run failure must stay an Error"); + } + + [Test] + public void RunDiagnostics_PreserveEnergyPlusSevereErrorsUntouched() + { + List diagnostics = new List(); + List runDiagnostics = new List + { + new Core.OpenStudio.OpenStudioDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.EnergyPlusSevereError, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, "** Severe ** something"), + }; + + Core.OpenStudio.OpenStudioRunResult runResult = new Core.OpenStudio.OpenStudioRunResult(false, 0, null, null, null, null, new List(), new List()); + + InvokeAppendRunDiagnostics(diagnostics, runDiagnostics, runResult, true); + + Assert.That(diagnostics.Count, Is.EqualTo(1)); + Assert.That(diagnostics[0].Code, Is.EqualTo(Core.OpenStudio.OpenStudioDiagnosticCodes.EnergyPlusSevereError), "Every diagnostic other than the results-only verdict must pass through unchanged"); + } + + /// Invokes the private re-badging helper under test. + private static void InvokeAppendRunDiagnostics(List diagnostics, List runDiagnostics, Core.OpenStudio.OpenStudioRunResult runResult, bool modelProduced) + { + System.Reflection.MethodInfo methodInfo = typeof(Convert).GetMethod("AppendRunDiagnostics", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static); + Assert.That(methodInfo, Is.Not.Null, "AppendRunDiagnostics must exist"); + methodInfo.Invoke(null, new object[] { diagnostics, runDiagnostics, runResult, modelProduced }); + } + + [Test] + public void FindFinalOsm_PrefersTheRecordedOsmPath() + { + string runDirectory = Path.Combine(directory, "run-root"); + Directory.CreateDirectory(Path.Combine(runDirectory, "run")); + + string recorded = Path.Combine(runDirectory, "recorded.osm"); + File.WriteAllText(recorded, "OS:Version,"); + File.WriteAllText(Path.Combine(runDirectory, "run", "in.osm"), "OS:Version,"); + File.WriteAllText(Path.Combine(runDirectory, "out.osw"), string.Format("{{ \"osm_path\": \"{0}\" }}", recorded.Replace('\\', '/'))); + + string how; + string found = OpenStudioWorkflow.FindFinalOsm(runDirectory, DateTime.UtcNow.AddMinutes(-1), out how); + + Assert.That(found, Is.EqualTo(recorded)); + Assert.That(how, Does.Contain("osm_path")); + } + + [Test] + public void FindFinalOsm_FallsBackToRunInOsm() + { + string runDirectory = Path.Combine(directory, "run-root"); + Directory.CreateDirectory(Path.Combine(runDirectory, "run")); + + string inOsm = Path.Combine(runDirectory, "run", "in.osm"); + File.WriteAllText(inOsm, "OS:Version,"); + + string how; + string found = OpenStudioWorkflow.FindFinalOsm(runDirectory, DateTime.UtcNow.AddMinutes(-1), out how); + + Assert.That(found, Is.EqualTo(inOsm)); + Assert.That(how, Does.Contain("in.osm")); + } + + [Test] + public void FindFinalOsm_IgnoresStaleModelsFromAnEarlierRun() + { + string runDirectory = Path.Combine(directory, "run-root"); + Directory.CreateDirectory(runDirectory); + + string stale = Path.Combine(runDirectory, "stale.osm"); + File.WriteAllText(stale, "OS:Version,"); + File.SetLastWriteTimeUtc(stale, DateTime.UtcNow.AddHours(-2)); + + string how; + string found = OpenStudioWorkflow.FindFinalOsm(runDirectory, DateTime.UtcNow.AddMinutes(-1), out how); + + Assert.That(found, Is.Null, "An OSM older than the run cannot be that run's output"); + } + + [Test] + public void Cancellation_BeforeWorkflowExecution_ReturnsWithoutRunningTheCli() + { + WriteSeedOsm(); + string oswPath = WriteOsw("{\n \"seed_file\": \"seed.osm\",\n \"steps\": []\n}"); + + using (CancellationTokenSource cancellationTokenSource = new CancellationTokenSource()) + { + cancellationTokenSource.Cancel(); + + Core.OpenStudio.OpenStudioImportOptions options = new Core.OpenStudio.OpenStudioImportOptions { ExecuteWorkflow = true, OutputDirectory = directory }; + + OpenStudioImportResult result = Convert.ToSAM(oswPath, options, null, null, cancellationTokenSource.Token); + + Assert.That(result, Is.Not.Null, "Cancellation must return a result carrying diagnostics, not throw"); + Assert.That(result.Diagnostics.Count, Is.GreaterThan(0)); + } + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/R3/IdentityRoundTripTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/R3/IdentityRoundTripTests.cs new file mode 100644 index 0000000..ba3c9ff --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/R3/IdentityRoundTripTests.cs @@ -0,0 +1,272 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// R3: identity round trip. The forward exporter stamps full SAM Guids into + /// OS:AdditionalProperties; these tests hold that channel to its contract — restore what is + /// there, never trust the 8-character name suffix as an identity, and import a third-party + /// OSM that has none of it without complaint. + /// + [TestFixture] + public class IdentityRoundTripTests + { + [Test] + public void ForwardConversion_StampsFullSamGuidOnExportedObjects() + { + AnalyticalModel source = AnalyticalModelFixtures.SingleBox(); + Space sourceSpace = source.AdjacencyCluster.GetSpaces()[0]; + + using (OpenStudioConversionResult conversionResult = source.ToOpenStudio()) + { + global::OpenStudio.Space openStudioSpace = conversionResult.Model.getSpaces()[0]; + + Guid guid; + Assert.That(Core.OpenStudio.Query.TryGetSAMGuid(openStudioSpace, out guid), Is.True, "Every exported object must carry its full SAM Guid"); + Assert.That(guid, Is.EqualTo(sourceSpace.Guid)); + + string type; + Assert.That(Core.OpenStudio.Query.TryGetSAMType(openStudioSpace, out type), Is.True); + Assert.That(type, Is.EqualTo("Space")); + + string name; + Assert.That(Core.OpenStudio.Query.TryGetSAMName(openStudioSpace, out name), Is.True); + Assert.That(name, Is.EqualTo(sourceSpace.Name), "The unsanitised SAM name must survive, unlike the sanitised object name"); + } + } + + [Test] + public void ForwardConversion_StampsTheModelGuidOnTheBuilding() + { + AnalyticalModel source = AnalyticalModelFixtures.SingleBox(); + + using (OpenStudioConversionResult conversionResult = source.ToOpenStudio()) + { + Guid guid; + Assert.That(Core.OpenStudio.Query.TryGetSAMGuid(conversionResult.Model.getBuilding(), out guid), Is.True); + Assert.That(guid, Is.EqualTo(source.Guid)); + } + } + + [Test] + public void Import_RestoresFullSpaceAndPanelGuids() + { + AnalyticalModel source = AnalyticalModelFixtures.TwoAdjacentBoxes(); + + HashSet sourceSpaceGuids = new HashSet(source.AdjacencyCluster.GetSpaces().Select(x => x.Guid)); + HashSet sourcePanelGuids = new HashSet(source.AdjacencyCluster.GetPanels().Select(x => x.Guid)); + + using (OpenStudioConversionResult conversionResult = source.ToOpenStudio()) + { + OpenStudioImportResult result = conversionResult.Model.ToSAM(); + + foreach (Space space in result.AnalyticalModel.AdjacencyCluster.GetSpaces()) + { + Assert.That(sourceSpaceGuids.Contains(space.Guid), Is.True, $"Space Guid {space.Guid} was not restored from the source model"); + } + + foreach (Panel panel in result.AnalyticalModel.AdjacencyCluster.GetPanels()) + { + Assert.That(sourcePanelGuids.Contains(panel.Guid), Is.True, $"Panel Guid {panel.Guid} was not restored from the source model"); + } + } + } + + [Test] + [Repeat(10)] + public void Import_RestoresPanelGuids_RegardlessOfSurfaceOrder() + { + // Regression guard. Identity used to be stamped only on the PRIMARY surface of an + // internal panel, so whether the shared wall kept its Guid depended on which of its + // two surfaces the importer happened to meet first — and OpenStudio's handle ordering + // is not stable between runs. Repeating the round trip is what exposed it. + AnalyticalModel source = AnalyticalModelFixtures.TwoAdjacentBoxes(); + HashSet sourcePanelGuids = new HashSet(source.AdjacencyCluster.GetPanels().Select(x => x.Guid)); + + using (OpenStudioConversionResult conversionResult = source.ToOpenStudio()) + { + OpenStudioImportResult result = conversionResult.Model.ToSAM(); + + foreach (Panel panel in result.AnalyticalModel.AdjacencyCluster.GetPanels()) + { + Assert.That(sourcePanelGuids.Contains(panel.Guid), Is.True, $"Panel Guid {panel.Guid} was not restored; identity must not depend on surface order"); + } + } + } + + [Test] + public void Import_RestoresTheModelLevelGuid() + { + AnalyticalModel source = AnalyticalModelFixtures.SingleBox(); + + using (OpenStudioConversionResult conversionResult = source.ToOpenStudio()) + { + OpenStudioImportResult result = conversionResult.Model.ToSAM(); + + Assert.That(result.AnalyticalModel.Guid, Is.EqualTo(source.Guid)); + } + } + + [Test] + public void Import_WithIdentityRestorationDisabled_IssuesFreshGuids() + { + AnalyticalModel source = AnalyticalModelFixtures.SingleBox(); + Guid sourceSpaceGuid = source.AdjacencyCluster.GetSpaces()[0].Guid; + + using (OpenStudioConversionResult conversionResult = source.ToOpenStudio()) + { + OpenStudioImportResult result = conversionResult.Model.ToSAM(new Core.OpenStudio.OpenStudioImportOptions { RestoreSAMIdentity = false }); + + Assert.That(result.AnalyticalModel.AdjacencyCluster.GetSpaces()[0].Guid, Is.Not.EqualTo(sourceSpaceGuid)); + } + } + + [Test] + public void ThirdPartyModel_WithoutSamMetadata_ImportsWithoutIdentityDiagnostics() + { + using (global::OpenStudio.Model model = BuildThirdPartyModel()) + { + OpenStudioImportResult result = model.ToSAM(); + + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in result.Diagnostics) + { + TestContext.Out.WriteLine(diagnostic.ToString()); + } + + Assert.That(result.Successful, Is.True, "An OSM with no SAM metadata is the normal third-party case"); + Assert.That(result.AnalyticalModel.AdjacencyCluster.GetSpaces().Count, Is.EqualTo(1)); + Assert.That(result.AnalyticalModel.AdjacencyCluster.GetPanels().Count, Is.EqualTo(6)); + + Assert.That(result.Diagnostics.Any(x => x.Code == Core.OpenStudio.OpenStudioImportDiagnosticCodes.IdentityCollision), Is.False, "The absence of identity metadata is not a problem and must not be reported as one"); + } + } + + [Test] + public void MalformedIdentityMetadata_IsReportedAndReplacedWithAFreshGuid() + { + using (global::OpenStudio.Model model = BuildThirdPartyModel()) + { + model.getSpaces()[0].additionalProperties().setFeature(Core.OpenStudio.OpenStudioIdentityKeys.Guid, "not-a-guid"); + + OpenStudioImportResult result = model.ToSAM(); + + Assert.That(result.Successful, Is.True, "Bad metadata degrades the identity, not the import"); + Assert.That(result.Diagnostics.Any(x => x.Code == Core.OpenStudio.OpenStudioImportDiagnosticCodes.IdentityCollision), Is.True); + } + } + + [Test] + public void DuplicateIdentityMetadata_IsReportedAndOnlyOneObjectKeepsTheGuid() + { + AnalyticalModel source = AnalyticalModelFixtures.TwoAdjacentBoxes(); + + using (OpenStudioConversionResult conversionResult = source.ToOpenStudio()) + { + global::OpenStudio.SpaceVector spaces = conversionResult.Model.getSpaces(); + + Guid duplicated; + Assert.That(Core.OpenStudio.Query.TryGetSAMGuid(spaces[0], out duplicated), Is.True); + + // Force the collision the audit requires a warning for. + spaces[1].additionalProperties().setFeature(Core.OpenStudio.OpenStudioIdentityKeys.Guid, duplicated.ToString("D")); + + OpenStudioImportResult result = conversionResult.Model.ToSAM(); + + Assert.That(result.Diagnostics.Any(x => x.Code == Core.OpenStudio.OpenStudioImportDiagnosticCodes.IdentityCollision), Is.True); + + List importedSpaces = result.AnalyticalModel.AdjacencyCluster.GetSpaces(); + Assert.That(importedSpaces.Count, Is.EqualTo(2)); + Assert.That(importedSpaces[0].Guid, Is.Not.EqualTo(importedSpaces[1].Guid), "Two SAM objects must never share one Guid"); + } + } + + [Test] + public void IdentityOfAWrongType_IsRejected() + { + using (global::OpenStudio.Model model = BuildThirdPartyModel()) + { + Guid guid = Guid.NewGuid(); + global::OpenStudio.Space space = model.getSpaces()[0]; + space.additionalProperties().setFeature(Core.OpenStudio.OpenStudioIdentityKeys.Guid, guid.ToString("D")); + space.additionalProperties().setFeature(Core.OpenStudio.OpenStudioIdentityKeys.Type, "Panel"); + + OpenStudioImportResult result = model.ToSAM(); + + Assert.That(result.AnalyticalModel.AdjacencyCluster.GetSpaces()[0].Guid, Is.Not.EqualTo(guid), "A Panel's identity must not be restored onto a Space"); + Assert.That(result.Diagnostics.Any(x => x.Code == Core.OpenStudio.OpenStudioImportDiagnosticCodes.IdentityCollision), Is.True); + } + } + + [Test] + public void GuidSuffixMatching_IsNotTreatedAsAnIdentity() + { + // The deterministic name suffix is 8 hex characters — 32 bits of a 128-bit Guid. + // Two distinct Guids can share it, and the importer must not restore identity from it. + Guid guid = Guid.NewGuid(); + string name = Core.OpenStudio.Query.OpenStudioName("Space", "Office", guid); + + string suffix; + Assert.That(Query.TryGetGuidSuffix(name, out suffix), Is.True); + Assert.That(suffix.Length, Is.EqualTo(8)); + + using (global::OpenStudio.Model model = BuildThirdPartyModel()) + { + model.getSpaces()[0].setName(name); + + OpenStudioImportResult result = model.ToSAM(); + + Assert.That(result.AnalyticalModel.AdjacencyCluster.GetSpaces()[0].Guid, Is.Not.EqualTo(guid), "A name suffix is a matching key, never a restorable identity"); + } + } + + /// + /// Builds a minimal single-room model directly through the OpenStudio API, with no SAM + /// metadata anywhere — the shape of an OSM authored in the OpenStudio Application or by a + /// third-party tool. + /// + private static global::OpenStudio.Model BuildThirdPartyModel() + { + global::OpenStudio.Model model = new global::OpenStudio.Model(); + + global::OpenStudio.Space space = new global::OpenStudio.Space(model); + space.setName("Third Party Room"); + + global::OpenStudio.ThermalZone thermalZone = new global::OpenStudio.ThermalZone(model); + thermalZone.setName("Third Party Zone"); + space.setThermalZone(thermalZone); + + const double width = 4; + const double depth = 3; + const double height = 2.7; + + AddSurface(model, space, "Floor", "Ground", new[] { new[] { 0.0, 0.0, 0.0 }, new[] { 0.0, depth, 0.0 }, new[] { width, depth, 0.0 }, new[] { width, 0.0, 0.0 } }); + AddSurface(model, space, "RoofCeiling", "Outdoors", new[] { new[] { 0.0, 0.0, height }, new[] { width, 0.0, height }, new[] { width, depth, height }, new[] { 0.0, depth, height } }); + AddSurface(model, space, "Wall", "Outdoors", new[] { new[] { 0.0, 0.0, 0.0 }, new[] { width, 0.0, 0.0 }, new[] { width, 0.0, height }, new[] { 0.0, 0.0, height } }); + AddSurface(model, space, "Wall", "Outdoors", new[] { new[] { width, 0.0, 0.0 }, new[] { width, depth, 0.0 }, new[] { width, depth, height }, new[] { width, 0.0, height } }); + AddSurface(model, space, "Wall", "Outdoors", new[] { new[] { width, depth, 0.0 }, new[] { 0.0, depth, 0.0 }, new[] { 0.0, depth, height }, new[] { width, depth, height } }); + AddSurface(model, space, "Wall", "Outdoors", new[] { new[] { 0.0, depth, 0.0 }, new[] { 0.0, 0.0, 0.0 }, new[] { 0.0, 0.0, height }, new[] { 0.0, depth, height } }); + + return model; + } + + private static void AddSurface(global::OpenStudio.Model model, global::OpenStudio.Space space, string surfaceType, string boundaryCondition, double[][] vertices) + { + global::OpenStudio.Point3dVector point3dVector = new global::OpenStudio.Point3dVector(); + foreach (double[] vertex in vertices) + { + point3dVector.Add(new global::OpenStudio.Point3d(vertex[0], vertex[1], vertex[2])); + } + + global::OpenStudio.Surface surface = new global::OpenStudio.Surface(point3dVector, model); + surface.setSpace(space); + surface.setSurfaceType(surfaceType); + surface.setOutsideBoundaryCondition(boundaryCondition); + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/R4/ImportDiagnosticsTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/R4/ImportDiagnosticsTests.cs new file mode 100644 index 0000000..85e7a3e --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/R4/ImportDiagnosticsTests.cs @@ -0,0 +1,912 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using System.Collections.Generic; +using System.Linq; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// R4: shading, unsupported objects and approximations. Every category the reverse coverage + /// manifest declares as Unsupported or Approximated must be able to emit its diagnostic — + /// otherwise "nothing is silently dropped" is a claim rather than a property. + /// + [TestFixture] + public class ImportDiagnosticsTests + { + /// + /// A minimal model with one space and one outdoor wall, built through the OpenStudio API + /// so each test can attach exactly the object under test. + /// + private static global::OpenStudio.Model BuildModel(out global::OpenStudio.Space space, out global::OpenStudio.Surface wall) + { + global::OpenStudio.Model model = new global::OpenStudio.Model(); + + space = new global::OpenStudio.Space(model); + space.setName("Room"); + + global::OpenStudio.ThermalZone thermalZone = new global::OpenStudio.ThermalZone(model); + thermalZone.setName("Zone"); + space.setThermalZone(thermalZone); + + wall = AddSurface(model, space, "Wall", "Outdoors", new[] { new[] { 0.0, 0.0, 0.0 }, new[] { 4.0, 0.0, 0.0 }, new[] { 4.0, 0.0, 2.7 }, new[] { 0.0, 0.0, 2.7 } }); + return model; + } + + private static global::OpenStudio.Surface AddSurface(global::OpenStudio.Model model, global::OpenStudio.Space space, string surfaceType, string boundaryCondition, double[][] vertices) + { + global::OpenStudio.Surface surface = new global::OpenStudio.Surface(ToVector(vertices), model); + surface.setSpace(space); + surface.setSurfaceType(surfaceType); + surface.setOutsideBoundaryCondition(boundaryCondition); + return surface; + } + + private static global::OpenStudio.Point3dVector ToVector(double[][] vertices) + { + global::OpenStudio.Point3dVector result = new global::OpenStudio.Point3dVector(); + foreach (double[] vertex in vertices) + { + result.Add(new global::OpenStudio.Point3d(vertex[0], vertex[1], vertex[2])); + } + + return result; + } + + private static List Import(global::OpenStudio.Model model, out OpenStudioImportResult result) + { + result = model.ToSAM(); + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in result.Diagnostics) + { + TestContext.Out.WriteLine(diagnostic.ToString()); + } + + return new List(result.Diagnostics); + } + + private static void AssertHasCode(IEnumerable diagnostics, string code) + { + Assert.That(diagnostics.Any(x => x.Code == code), Is.True, $"Expected a {code} diagnostic"); + } + + [Test] + public void SiteShading_ImportsAsShadePanelsCarryingTheirGroup() + { + global::OpenStudio.Space space; + global::OpenStudio.Surface wall; + using (global::OpenStudio.Model model = BuildModel(out space, out wall)) + { + global::OpenStudio.ShadingSurfaceGroup shadingSurfaceGroup = new global::OpenStudio.ShadingSurfaceGroup(model); + shadingSurfaceGroup.setName("Site Shades"); + shadingSurfaceGroup.setShadingSurfaceType("Site"); + + global::OpenStudio.ShadingSurface shadingSurface = new global::OpenStudio.ShadingSurface(ToVector(new[] { new[] { 0.0, -1.0, 3.0 }, new[] { 4.0, -1.0, 3.0 }, new[] { 4.0, -2.0, 3.0 }, new[] { 0.0, -2.0, 3.0 } }), model); + shadingSurface.setName("Canopy"); + shadingSurface.setShadingSurfaceGroup(shadingSurfaceGroup); + + OpenStudioImportResult result; + Import(model, out result); + + List shades = result.AnalyticalModel.AdjacencyCluster.GetPanels().FindAll(x => x.PanelType == PanelType.Shade); + Assert.That(shades.Count, Is.EqualTo(1)); + + string groupType; + Assert.That(shades[0].TryGetValue(OpenStudioSourceParameter.ShadingGroupType, out groupType), Is.True); + Assert.That(groupType, Is.EqualTo("Site")); + + string groupName; + Assert.That(shades[0].TryGetValue(OpenStudioSourceParameter.ShadingGroupName, out groupName), Is.True); + Assert.That(groupName, Is.EqualTo("Site Shades")); + + Assert.That(shades[0].GetFace3D().GetArea(), Is.EqualTo(4.0).Within(0.01), "The shade must keep its real geometry"); + } + } + + [Test] + public void SpaceShading_IsTransformedByTheOwningSpace() + { + global::OpenStudio.Space space; + global::OpenStudio.Surface wall; + using (global::OpenStudio.Model model = BuildModel(out space, out wall)) + { + // A space that is NOT at the origin: the shade's coordinates are relative to its + // group, which is relative to the space, so both transformations must compose. + space.setXOrigin(100); + + global::OpenStudio.ShadingSurfaceGroup shadingSurfaceGroup = new global::OpenStudio.ShadingSurfaceGroup(model); + shadingSurfaceGroup.setName("Space Shades"); + shadingSurfaceGroup.setSpace(space); + + global::OpenStudio.ShadingSurface shadingSurface = new global::OpenStudio.ShadingSurface(ToVector(new[] { new[] { 0.0, -1.0, 3.0 }, new[] { 1.0, -1.0, 3.0 }, new[] { 1.0, -2.0, 3.0 }, new[] { 0.0, -2.0, 3.0 } }), model); + shadingSurface.setShadingSurfaceGroup(shadingSurfaceGroup); + + OpenStudioImportResult result; + Import(model, out result); + + List shades = result.AnalyticalModel.AdjacencyCluster.GetPanels().FindAll(x => x.PanelType == PanelType.Shade); + Assert.That(shades.Count, Is.EqualTo(1)); + + Geometry.Spatial.Point3D point3D = shades[0].GetFace3D().GetInternalPoint3D(Core.Tolerance.Distance); + Assert.That(point3D.X, Is.GreaterThan(99), "The space's x-origin of 100 m must have been applied to the shade"); + } + } + + [Test] + public void SpaceGeometry_IsTransformedByTheSpaceOrigin() + { + global::OpenStudio.Space space; + global::OpenStudio.Surface wall; + using (global::OpenStudio.Model model = BuildModel(out space, out wall)) + { + space.setXOrigin(50); + space.setZOrigin(10); + + OpenStudioImportResult result; + Import(model, out result); + + Panel panel = result.AnalyticalModel.AdjacencyCluster.GetPanels()[0]; + Geometry.Spatial.Point3D point3D = panel.GetFace3D().GetInternalPoint3D(Core.Tolerance.Distance); + + Assert.That(point3D.X, Is.GreaterThan(49), "Surface vertices are space-relative and must be transformed on import"); + Assert.That(point3D.Z, Is.GreaterThan(9)); + } + } + + [Test] + public void UnsupportedBoundaryCondition_IsReported() + { + global::OpenStudio.Space space; + global::OpenStudio.Surface wall; + using (global::OpenStudio.Model model = BuildModel(out space, out wall)) + { + global::OpenStudio.SurfacePropertyOtherSideCoefficients otherSideCoefficients = new global::OpenStudio.SurfacePropertyOtherSideCoefficients(model); + wall.setSurfacePropertyOtherSideCoefficients(otherSideCoefficients); + + OpenStudioImportResult result; + List diagnostics = Import(model, out result); + + AssertHasCode(diagnostics, Core.OpenStudio.OpenStudioImportDiagnosticCodes.BoundaryConditionUnsupported); + + Panel panel = result.AnalyticalModel.AdjacencyCluster.GetPanels()[0]; + bool adiabatic; + Assert.That(panel.TryGetValue(PanelParameter.Adiabatic, out adiabatic) && adiabatic, Is.True, "The documented fallback for an unrepresentable boundary is adiabatic"); + } + } + + [Test] + public void UnpairedInterzoneSurface_IsReportedAndMarkedAdiabatic() + { + // OpenStudio refuses to set a "Surface" boundary in memory without an adjacent + // surface, so this state only reaches the importer through a file - which is exactly + // how a third-party OSM produces it. The model is therefore saved, edited as text and + // re-imported. + string directory = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "SAM_OpenStudio_Adj_" + System.Guid.NewGuid().ToString("N").Substring(0, 8)); + System.IO.Directory.CreateDirectory(directory); + + try + { + string path = System.IO.Path.Combine(directory, "dangling.osm"); + + using (OpenStudioConversionResult conversionResult = AnalyticalModelFixtures.TwoAdjacentBoxes().ToOpenStudio()) + { + Assert.That(conversionResult.Model.save(global::OpenStudio.OpenStudioUtilitiesCore.toPath(path), true), Is.True); + } + + // Break EVERY interzone adjacency reference: blank each "Outside Boundary + // Condition Object" field that follows a "Surface," boundary line. Editing all of + // them (not just the first) makes the outcome independent of the order OpenStudio + // happens to serialise the surfaces in. + string[] lines = System.IO.File.ReadAllLines(path); + int edited = 0; + for (int i = 1; i < lines.Length; i++) + { + if (lines[i].Contains("!- Outside Boundary Condition Object") + && lines[i - 1].Trim().StartsWith("Surface,", System.StringComparison.Ordinal) + && lines[i - 1].Contains("!- Outside Boundary Condition")) + { + lines[i] = " , !- Outside Boundary Condition Object"; + edited++; + } + } + + Assert.That(edited, Is.GreaterThan(0), "The test fixture must contain at least one resolvable interzone adjacency to break"); + System.IO.File.WriteAllLines(path, lines); + + // Disable the geometric fallback so the outcome is unambiguous: with no handle and + // no geometric matching, an interzone surface can only be demoted to adiabatic. + OpenStudioImportResult result = Convert.ToSAM(path, new Core.OpenStudio.OpenStudioImportOptions { AllowGeometricAdjacencyFallback = false }); + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in result.Diagnostics) + { + TestContext.Out.WriteLine(diagnostic.ToString()); + } + + Assert.That(result.Successful, Is.True, "A dangling adjacency degrades the topology, not the import"); + + // The shared wall's surfaces, now handle-less "Surface" boundaries with the + // geometric fallback off, must be reported as unpaired and marked adiabatic. + Assert.That( + result.Diagnostics.Any(x => x.Code == Core.OpenStudio.OpenStudioImportDiagnosticCodes.AdjacencyPairingFailed), + Is.True, + "An interzone surface whose partner handle does not resolve must be reported"); + } + finally + { + try + { + System.IO.Directory.Delete(directory, true); + } + catch (System.Exception) + { + // a locked temp directory must not fail an otherwise passing test + } + } + } + + /// + /// Produces an OSM in a fresh temp directory whose interzone adjacency handles have all + /// been blanked — the handle-less "Surface" boundary state a third-party OSM reaches the + /// importer in. The caller owns the returned directory and must delete it. + /// + private static string CreateDanglingInterzoneOsm(out string directory) + { + directory = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "SAM_OpenStudio_Adj_" + System.Guid.NewGuid().ToString("N").Substring(0, 8)); + System.IO.Directory.CreateDirectory(directory); + string path = System.IO.Path.Combine(directory, "dangling.osm"); + + using (OpenStudioConversionResult conversionResult = AnalyticalModelFixtures.TwoAdjacentBoxes().ToOpenStudio()) + { + Assert.That(conversionResult.Model.save(global::OpenStudio.OpenStudioUtilitiesCore.toPath(path), true), Is.True); + } + + string[] lines = System.IO.File.ReadAllLines(path); + int edited = 0; + for (int i = 1; i < lines.Length; i++) + { + if (lines[i].Contains("!- Outside Boundary Condition Object") + && lines[i - 1].Trim().StartsWith("Surface,", System.StringComparison.Ordinal) + && lines[i - 1].Contains("!- Outside Boundary Condition")) + { + lines[i] = " , !- Outside Boundary Condition Object"; + edited++; + } + } + + Assert.That(edited, Is.GreaterThan(0), "The fixture must contain at least one resolvable interzone adjacency to break"); + System.IO.File.WriteAllLines(path, lines); + return path; + } + + private static void TryDeleteDirectory(string directory) + { + try + { + System.IO.Directory.Delete(directory, true); + } + catch (System.Exception) + { + // a locked temp directory must not fail an otherwise passing test + } + } + + [Test] + public void GeometricAdjacencyFallback_PairsDanglingInterzoneSurfaces_IntoOneSharedPanel() + { + string directory; + string path = CreateDanglingInterzoneOsm(out directory); + try + { + // Fallback ON (the default): the two shared-wall surfaces are coincident opposites, + // so they must collapse into ONE SAM panel — 11, not 12 — and the pairing reported. + // Updating only the name ledger (the original bug) left the superseded panel in the + // captured space→panel lists, so the cluster kept two coincident panels. + OpenStudioImportResult result = Convert.ToSAM(path, new Core.OpenStudio.OpenStudioImportOptions { AllowGeometricAdjacencyFallback = true }); + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in result.Diagnostics) + { + TestContext.Out.WriteLine(diagnostic.ToString()); + } + + Assert.That(result.Successful, Is.True); + Assert.That(result.Diagnostics.Any(x => x.Code == Core.OpenStudio.OpenStudioImportDiagnosticCodes.AdjacencyGeometricFallback), Is.True, "The geometric pairing must be reported"); + + AdjacencyCluster adjacencyCluster = result.AnalyticalModel.AdjacencyCluster; + Assert.That(adjacencyCluster.GetPanels().Count, Is.EqualTo(11), "The geometrically paired surfaces must collapse to one shared panel, not remain two coincident panels"); + Assert.That(adjacencyCluster.GetPanels().Count(x => adjacencyCluster.GetSpaces(x)?.Count == 2), Is.EqualTo(1), "Exactly one panel is related to both spaces"); + } + finally + { + TryDeleteDirectory(directory); + } + } + + [Test] + public void RepeatedDanglingInterzoneImport_DoesNotDereferenceRetainedNativeSurfaces() + { + // The interzone fallback once retained native SWIG Surface wrappers and dereferenced + // them after the model walk; under GC pressure that aborts the process with an + // unmanaged AccessViolationException. Importing repeatedly, collecting between runs, + // exercises that path hard — it must stay a clean managed import. + string directory; + string path = CreateDanglingInterzoneOsm(out directory); + try + { + for (int iteration = 0; iteration < 40; iteration++) + { + OpenStudioImportResult result = Convert.ToSAM(path, new Core.OpenStudio.OpenStudioImportOptions { AllowGeometricAdjacencyFallback = true }); + Assert.That(result.Successful, Is.True, "Import iteration " + iteration + " must not crash or fail"); + Assert.That(result.AnalyticalModel.AdjacencyCluster.GetPanels().Count, Is.EqualTo(11), "Every import must produce the stable shared-panel topology"); + + System.GC.Collect(); + System.GC.WaitForPendingFinalizers(); + System.GC.Collect(); + } + } + finally + { + TryDeleteDirectory(directory); + } + } + + [Test] + public void OperableWindow_IsImportedAsAWindowAndReportedAsAnApproximation() + { + global::OpenStudio.Space space; + global::OpenStudio.Surface wall; + using (global::OpenStudio.Model model = BuildModel(out space, out wall)) + { + global::OpenStudio.SubSurface subSurface = new global::OpenStudio.SubSurface(ToVector(new[] { new[] { 1.0, 0.0, 0.9 }, new[] { 3.0, 0.0, 0.9 }, new[] { 3.0, 0.0, 2.1 }, new[] { 1.0, 0.0, 2.1 } }), model); + subSurface.setSurface(wall); + subSurface.setSubSurfaceType("OperableWindow"); + + OpenStudioImportResult result; + List diagnostics = Import(model, out result); + + AssertHasCode(diagnostics, Core.OpenStudio.OpenStudioImportDiagnosticCodes.ApproximationApplied); + + Panel panel = result.AnalyticalModel.AdjacencyCluster.GetPanels()[0]; + Assert.That(panel.Apertures.Count, Is.EqualTo(1)); + Assert.That(panel.Apertures[0].ApertureType, Is.EqualTo(ApertureType.Window)); + } + } + + [Test] + public void GlassDoor_ImportsAsADoor() + { + global::OpenStudio.Space space; + global::OpenStudio.Surface wall; + using (global::OpenStudio.Model model = BuildModel(out space, out wall)) + { + global::OpenStudio.SubSurface subSurface = new global::OpenStudio.SubSurface(ToVector(new[] { new[] { 1.0, 0.0, 0.0 }, new[] { 2.0, 0.0, 0.0 }, new[] { 2.0, 0.0, 2.1 }, new[] { 1.0, 0.0, 2.1 } }), model); + subSurface.setSurface(wall); + subSurface.setSubSurfaceType("GlassDoor"); + + OpenStudioImportResult result; + Import(model, out result); + + Panel panel = result.AnalyticalModel.AdjacencyCluster.GetPanels()[0]; + Assert.That(panel.Apertures[0].ApertureType, Is.EqualTo(ApertureType.Door)); + } + } + + [Test] + public void SubSurfaceMultiplier_IsReported() + { + global::OpenStudio.Space space; + global::OpenStudio.Surface wall; + using (global::OpenStudio.Model model = BuildModel(out space, out wall)) + { + global::OpenStudio.SubSurface subSurface = new global::OpenStudio.SubSurface(ToVector(new[] { new[] { 1.0, 0.0, 0.9 }, new[] { 2.0, 0.0, 0.9 }, new[] { 2.0, 0.0, 2.1 }, new[] { 1.0, 0.0, 2.1 } }), model); + subSurface.setSurface(wall); + subSurface.setSubSurfaceType("FixedWindow"); + subSurface.setMultiplier(3); + + OpenStudioImportResult result; + List diagnostics = Import(model, out result); + + Assert.That(diagnostics.Any(x => x.Code == Core.OpenStudio.OpenStudioImportDiagnosticCodes.ApproximationApplied && x.Message.Contains("multiplier")), Is.True); + } + } + + [Test] + public void SimpleGlazing_IsImportedAsAnApproximation() + { + global::OpenStudio.Space space; + global::OpenStudio.Surface wall; + using (global::OpenStudio.Model model = BuildModel(out space, out wall)) + { + global::OpenStudio.SimpleGlazing simpleGlazing = new global::OpenStudio.SimpleGlazing(model, 1.8, 0.4); + simpleGlazing.setName("Simple Glazing"); + + global::OpenStudio.FenestrationMaterialVector materials = new global::OpenStudio.FenestrationMaterialVector(); + materials.Add(simpleGlazing); + global::OpenStudio.Construction construction = new global::OpenStudio.Construction(materials); + construction.setName("Simple Window Construction"); + + global::OpenStudio.SubSurface subSurface = new global::OpenStudio.SubSurface(ToVector(new[] { new[] { 1.0, 0.0, 0.9 }, new[] { 3.0, 0.0, 0.9 }, new[] { 3.0, 0.0, 2.1 }, new[] { 1.0, 0.0, 2.1 } }), model); + subSurface.setSurface(wall); + subSurface.setSubSurfaceType("FixedWindow"); + subSurface.setConstruction(construction); + + OpenStudioImportResult result; + List diagnostics = Import(model, out result); + + Assert.That(diagnostics.Any(x => x.Code == Core.OpenStudio.OpenStudioImportDiagnosticCodes.ApproximationApplied && x.Message.Contains("SimpleGlazing")), Is.True); + + Core.TransparentMaterial transparentMaterial = result.AnalyticalModel.MaterialLibrary.GetMaterials().OfType().FirstOrDefault(); + Assert.That(transparentMaterial, Is.Not.Null, "SimpleGlazing must still produce a usable SAM glazing material"); + } + } + + [Test] + public void MasslessMaterial_IsImportedPreservingItsResistance() + { + global::OpenStudio.Space space; + global::OpenStudio.Surface wall; + using (global::OpenStudio.Model model = BuildModel(out space, out wall)) + { + const double thermalResistance = 2.5; + + global::OpenStudio.MasslessOpaqueMaterial masslessOpaqueMaterial = new global::OpenStudio.MasslessOpaqueMaterial(model, "MediumSmooth", thermalResistance); + masslessOpaqueMaterial.setName("Insulation Board"); + + global::OpenStudio.OpaqueMaterialVector materials = new global::OpenStudio.OpaqueMaterialVector(); + materials.Add(masslessOpaqueMaterial); + global::OpenStudio.Construction construction = new global::OpenStudio.Construction(materials); + construction.setName("Massless Construction"); + wall.setConstruction(construction); + + OpenStudioImportResult result; + List diagnostics = Import(model, out result); + + AssertHasCode(diagnostics, Core.OpenStudio.OpenStudioImportDiagnosticCodes.ApproximationApplied); + + Core.OpaqueMaterial opaqueMaterial = result.AnalyticalModel.MaterialLibrary.GetMaterials().OfType().FirstOrDefault(x => x.Name == "Insulation Board"); + Assert.That(opaqueMaterial, Is.Not.Null); + + Construction importedConstruction = result.AnalyticalModel.AdjacencyCluster.GetConstructions().Find(x => x.Name == "Massless Construction"); + Assert.That(importedConstruction, Is.Not.Null); + + ConstructionLayer constructionLayer = importedConstruction.ConstructionLayers[0]; + + // The whole point of the nominal-thickness reconstruction: R is preserved exactly. + Assert.That(constructionLayer.Thickness / opaqueMaterial.ThermalConductivity, Is.EqualTo(thermalResistance).Within(1e-9)); + } + } + + [Test] + public void SurfaceWithoutConstruction_IsReported() + { + global::OpenStudio.Space space; + global::OpenStudio.Surface wall; + using (global::OpenStudio.Model model = BuildModel(out space, out wall)) + { + OpenStudioImportResult result; + List diagnostics = Import(model, out result); + + AssertHasCode(diagnostics, Core.OpenStudio.OpenStudioImportDiagnosticCodes.ConstructionUnsupported); + + Panel panel = result.AnalyticalModel.AdjacencyCluster.GetPanels()[0]; + Assert.That(panel.Construction, Is.Not.Null, "A missing construction produces a named placeholder, not a null"); + Assert.That(panel.Construction.ConstructionLayers == null || panel.Construction.ConstructionLayers.Count == 0, Is.True, "No layers may be invented for a construction that does not exist"); + } + } + + [Test] + public void UnsupportedLoadKind_IsReported() + { + global::OpenStudio.Space space; + global::OpenStudio.Surface wall; + using (global::OpenStudio.Model model = BuildModel(out space, out wall)) + { + global::OpenStudio.SpaceType spaceType = new global::OpenStudio.SpaceType(model); + spaceType.setName("Office"); + space.setSpaceType(spaceType); + + global::OpenStudio.GasEquipmentDefinition gasEquipmentDefinition = new global::OpenStudio.GasEquipmentDefinition(model); + gasEquipmentDefinition.setWattsperSpaceFloorArea(5); + global::OpenStudio.GasEquipment gasEquipment = new global::OpenStudio.GasEquipment(gasEquipmentDefinition); + gasEquipment.setSpaceType(spaceType); + + OpenStudioImportResult result; + List diagnostics = Import(model, out result); + + Assert.That(diagnostics.Any(x => x.Code == Core.OpenStudio.OpenStudioImportDiagnosticCodes.LoadUnsupported && x.Message.Contains("GasEquipment")), Is.True); + } + } + + [Test] + public void DetailedHvac_IsReportedAsNotImported() + { + global::OpenStudio.Space space; + global::OpenStudio.Surface wall; + using (global::OpenStudio.Model model = BuildModel(out space, out wall)) + { + global::OpenStudio.ThermalZone thermalZone = space.thermalZone().get(); + + global::OpenStudio.ScheduleConstant availability = new global::OpenStudio.ScheduleConstant(model); + availability.setValue(1); + + global::OpenStudio.ZoneHVACBaseboardConvectiveElectric baseboard = new global::OpenStudio.ZoneHVACBaseboardConvectiveElectric(model); + baseboard.addToThermalZone(thermalZone); + + OpenStudioImportResult result; + List diagnostics = Import(model, out result); + + AssertHasCode(diagnostics, Core.OpenStudio.OpenStudioImportDiagnosticCodes.HvacUnsupported); + } + } + + [Test] + public void MultiSpaceThermalZone_IsReportedAndNeverCollapsed() + { + global::OpenStudio.Space space; + global::OpenStudio.Surface wall; + using (global::OpenStudio.Model model = BuildModel(out space, out wall)) + { + global::OpenStudio.Space secondSpace = new global::OpenStudio.Space(model); + secondSpace.setName("Second Room"); + secondSpace.setThermalZone(space.thermalZone().get()); + AddSurface(model, secondSpace, "Wall", "Outdoors", new[] { new[] { 0.0, 5.0, 0.0 }, new[] { 4.0, 5.0, 0.0 }, new[] { 4.0, 5.0, 2.7 }, new[] { 0.0, 5.0, 2.7 } }); + + OpenStudioImportResult result; + List diagnostics = Import(model, out result); + + AssertHasCode(diagnostics, Core.OpenStudio.OpenStudioImportDiagnosticCodes.ZoneMultiSpace); + Assert.That(result.AnalyticalModel.AdjacencyCluster.GetSpaces().Count, Is.EqualTo(2), "Two spaces in one zone stay two SAM spaces"); + } + } + + [Test] + public void SiteAndDesignDays_ImportWithTheirLimitationsStated() + { + global::OpenStudio.Space space; + global::OpenStudio.Surface wall; + using (global::OpenStudio.Model model = BuildModel(out space, out wall)) + { + global::OpenStudio.Site site = model.getSite(); + site.setName("Boston Logan"); + site.setLatitude(42.36); + site.setLongitude(-71.01); + site.setElevation(6); + + global::OpenStudio.DesignDay heatingDesignDay = new global::OpenStudio.DesignDay(model); + heatingDesignDay.setName("Boston Heating 99.6%"); + heatingDesignDay.setDayType("WinterDesignDay"); + heatingDesignDay.setMonth(1); + heatingDesignDay.setDayOfMonth(21); + + global::OpenStudio.DesignDay coolingDesignDay = new global::OpenStudio.DesignDay(model); + coolingDesignDay.setName("Boston Cooling 0.4%"); + coolingDesignDay.setDayType("SummerDesignDay"); + coolingDesignDay.setMonth(7); + coolingDesignDay.setDayOfMonth(21); + + OpenStudioImportResult result; + List diagnostics = Import(model, out result); + + Core.Location location = result.AnalyticalModel.Location; + Assert.That(location, Is.Not.Null); + Assert.That(location.Latitude, Is.EqualTo(42.36).Within(1e-6)); + Assert.That(location.Longitude, Is.EqualTo(-71.01).Within(1e-6)); + + Core.SAMCollection heatingDesignDays; + Assert.That(result.AnalyticalModel.TryGetValue(AnalyticalModelParameter.HeatingDesignDays, out heatingDesignDays), Is.True); + Assert.That(heatingDesignDays.Count, Is.EqualTo(1)); + + Core.SAMCollection coolingDesignDays; + Assert.That(result.AnalyticalModel.TryGetValue(AnalyticalModelParameter.CoolingDesignDays, out coolingDesignDays), Is.True); + Assert.That(coolingDesignDays.Count, Is.EqualTo(1)); + + AssertHasCode(diagnostics, Core.OpenStudio.OpenStudioImportDiagnosticCodes.WeatherLimitation); + } + } + + [Test] + public void UnnamedSiteAtTheOrigin_ProducesNoLocation() + { + global::OpenStudio.Space space; + global::OpenStudio.Surface wall; + using (global::OpenStudio.Model model = BuildModel(out space, out wall)) + { + OpenStudioImportResult result; + Import(model, out result); + + Assert.That(result.AnalyticalModel.Location, Is.Null, "An unset site must not become a location at the equator"); + } + } + + [Test] + public void SurfaceBelowTheMinimumArea_IsRejectedWithAGeometryDiagnostic() + { + global::OpenStudio.Space space; + global::OpenStudio.Surface wall; + using (global::OpenStudio.Model model = BuildModel(out space, out wall)) + { + // OpenStudio refuses to construct a truly degenerate surface, so the minimum-area + // rejection is exercised through the option that exists for it: a real 0.2 x 0.2 m + // surface against a 1 m2 minimum. + global::OpenStudio.Surface small = new global::OpenStudio.Surface(ToVector(new[] { new[] { 0.0, 1.0, 0.0 }, new[] { 0.2, 1.0, 0.0 }, new[] { 0.2, 1.0, 0.2 }, new[] { 0.0, 1.0, 0.2 } }), model); + small.setSpace(space); + small.setSurfaceType("Wall"); + small.setOutsideBoundaryCondition("Outdoors"); + + OpenStudioImportResult result = model.ToSAM(new Core.OpenStudio.OpenStudioImportOptions { MinimumArea = 1.0 }); + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in result.Diagnostics) + { + TestContext.Out.WriteLine(diagnostic.ToString()); + } + + AssertHasCode(result.Diagnostics, Core.OpenStudio.OpenStudioImportDiagnosticCodes.GeometryInvalid); + Assert.That(result.Statistics.SkippedObjects, Is.GreaterThan(0), "A rejected surface must be counted, not silently absent"); + Assert.That(result.AnalyticalModel.AdjacencyCluster.GetPanels()?.Count ?? 0, Is.EqualTo(1), "Only the 10.8 m2 wall survives; the 0.04 m2 surface is rejected"); + } + } + + [Test] + public void ScheduleRuleset_ExpandsToAnnualHourlyValuesHonouringItsRules() + { + global::OpenStudio.Space space; + global::OpenStudio.Surface wall; + using (global::OpenStudio.Model model = BuildModel(out space, out wall)) + { + global::OpenStudio.SpaceType spaceType = new global::OpenStudio.SpaceType(model); + spaceType.setName("Office"); + space.setSpaceType(spaceType); + + global::OpenStudio.ScheduleRuleset scheduleRuleset = new global::OpenStudio.ScheduleRuleset(model, 0.1); + scheduleRuleset.setName("Office Lighting"); + + // A weekend rule at a distinct value: the expansion must reproduce both values, + // which a flattened constant could not. + global::OpenStudio.ScheduleRule weekendRule = new global::OpenStudio.ScheduleRule(scheduleRuleset); + weekendRule.setApplySaturday(true); + weekendRule.setApplySunday(true); + weekendRule.daySchedule().addValue(new global::OpenStudio.Time(0, 24, 0, 0), 0.9); + + global::OpenStudio.LightsDefinition lightsDefinition = new global::OpenStudio.LightsDefinition(model); + lightsDefinition.setWattsperSpaceFloorArea(8); + global::OpenStudio.Lights lights = new global::OpenStudio.Lights(lightsDefinition); + lights.setSpaceType(spaceType); + lights.setSchedule(scheduleRuleset); + + OpenStudioImportResult result; + Import(model, out result); + + InternalCondition internalCondition = result.AnalyticalModel.AdjacencyCluster.GetSpaces()[0].InternalCondition; + + string lightingProfileName; + Assert.That(internalCondition.TryGetValue(InternalConditionParameter.LightingProfileName, out lightingProfileName), Is.True); + + Profile profile = result.AnalyticalModel.ProfileLibrary.GetProfiles().Find(x => x.Name == lightingProfileName); + Assert.That(profile, Is.Not.Null); + Assert.That(profile.Max, Is.EqualTo(8759), "A ruleset must expand to a full annual hourly profile"); + + HashSet distinctValues = new HashSet(); + for (int i = 0; i <= profile.Max; i++) + { + distinctValues.Add(System.Math.Round(profile[i], 4)); + } + + Assert.That(distinctValues.Contains(0.1), Is.True, "The default day value must be present"); + Assert.That(distinctValues.Contains(0.9), Is.True, "The weekend rule value must be present - the schedule must not be flattened"); + } + } + + /// + /// Builds an office space with a Lights load driven by , imports + /// the model, and returns the SAM lighting profile the load resolves to (null when none was + /// produced). The lazy schedule→profile conversion only runs when a load references the + /// schedule, so the load is what makes the reverse expansion observable. + /// + private static Profile ImportLightingProfile(global::OpenStudio.Model model, global::OpenStudio.Space space, global::OpenStudio.Schedule schedule, out OpenStudioImportResult result) + { + global::OpenStudio.SpaceType spaceType = new global::OpenStudio.SpaceType(model); + spaceType.setName("Office"); + space.setSpaceType(spaceType); + + global::OpenStudio.LightsDefinition lightsDefinition = new global::OpenStudio.LightsDefinition(model); + lightsDefinition.setWattsperSpaceFloorArea(8); + global::OpenStudio.Lights lights = new global::OpenStudio.Lights(lightsDefinition); + lights.setSpaceType(spaceType); + lights.setSchedule(schedule); + + Import(model, out result); + + InternalCondition internalCondition = result.AnalyticalModel.AdjacencyCluster.GetSpaces()[0].InternalCondition; + + string lightingProfileName; + if (internalCondition == null || !internalCondition.TryGetValue(InternalConditionParameter.LightingProfileName, out lightingProfileName)) + { + return null; + } + + return result.AnalyticalModel.ProfileLibrary.GetProfiles().Find(x => x.Name == lightingProfileName); + } + + [Test] + public void ScheduleFixedInterval_WithDailyInterval_HoldsEachValueForItsWholeDay() + { + global::OpenStudio.Space space; + global::OpenStudio.Surface wall; + using (global::OpenStudio.Model model = BuildModel(out space, out wall)) + { + // 365 daily values, a strictly increasing ramp so the failure mode is unmistakable: + // the old modulo/count expansion produced 1, 2, 3, ... across the first 24 hours + // instead of holding day 0's value for the whole day. + global::OpenStudio.Vector vector = new global::OpenStudio.Vector(365u); + for (uint d = 0; d < 365u; d++) + { + vector.__setitem__(d, d + 1); + } + + global::OpenStudio.ScheduleFixedInterval schedule = new global::OpenStudio.ScheduleFixedInterval(model); + schedule.setName("Daily Interval Lighting"); + // Time(days, hours, minutes, seconds): a one-day reporting interval. + global::OpenStudio.TimeSeries timeSeries = new global::OpenStudio.TimeSeries(new global::OpenStudio.Date(new global::OpenStudio.MonthOfYear(1), 1), new global::OpenStudio.Time(1, 0, 0, 0), vector, string.Empty); + Assert.That(schedule.setTimeSeries(timeSeries), Is.True, "The daily fixed-interval time series must be accepted"); + + OpenStudioImportResult result; + Profile profile = ImportLightingProfile(model, space, schedule, out result); + + Assert.That(profile, Is.Not.Null, "The daily interval schedule must expand to a profile"); + Assert.That(profile.Max, Is.EqualTo(8759), "A fixed-interval schedule must expand to a full annual hourly profile"); + + Assert.That(profile[0], Is.EqualTo(1), "Hour 0 is day 0's value"); + Assert.That(profile[1], Is.EqualTo(1), "Hour 1 must still hold day 0's value, not ramp to day 1"); + Assert.That(profile[23], Is.EqualTo(1), "The whole first day holds day 0's value"); + Assert.That(profile[24], Is.EqualTo(2), "Hour 24 is the first hour of day 1"); + Assert.That(profile[47], Is.EqualTo(2), "The whole second day holds day 1's value"); + Assert.That(profile[364 * 24], Is.EqualTo(365), "The last day holds the last value"); + } + } + + [Test] + public void ScheduleFixedInterval_LeapYearSkipsFebruary29WithoutShiftingTheCalendar() + { + global::OpenStudio.Space space; + global::OpenStudio.Surface wall; + using (global::OpenStudio.Model model = BuildModel(out space, out wall)) + { + global::OpenStudio.Vector vector = new global::OpenStudio.Vector(8784u); + for (uint hour = 0; hour < 8784u; hour++) + { + vector.__setitem__(hour, (hour / 24u) + 1u); + } + + global::OpenStudio.ScheduleFixedInterval schedule = new global::OpenStudio.ScheduleFixedInterval(model); + schedule.setName("Leap Year Interval Lighting"); + global::OpenStudio.TimeSeries timeSeries = new global::OpenStudio.TimeSeries(new global::OpenStudio.Date(new global::OpenStudio.MonthOfYear(1), 1, 2020), new global::OpenStudio.Time(0, 1, 0, 0), vector, string.Empty); + Assert.That(schedule.setTimeSeries(timeSeries), Is.True); + + OpenStudioImportResult result; + Profile profile = ImportLightingProfile(model, space, schedule, out result); + + Assert.That(profile[58 * 24], Is.EqualTo(59), "28 February remains aligned"); + Assert.That(profile[59 * 24], Is.EqualTo(61), "1 March skips the source leap day"); + Assert.That(profile[364 * 24], Is.EqualTo(366), "31 December must not be truncated"); + } + } + + [Test] + public void ScheduleFixedInterval_PartialYearHonoursStartDateAndOutOfRangeValue() + { + global::OpenStudio.Space space; + global::OpenStudio.Surface wall; + using (global::OpenStudio.Model model = BuildModel(out space, out wall)) + { + global::OpenStudio.Vector vector = new global::OpenStudio.Vector(24u); + for (uint hour = 0; hour < 24u; hour++) + { + vector.__setitem__(hour, 7); + } + + global::OpenStudio.TimeSeries timeSeries = new global::OpenStudio.TimeSeries(new global::OpenStudio.Date(new global::OpenStudio.MonthOfYear(7), 1, 2021), new global::OpenStudio.Time(0, 1, 0, 0), vector, string.Empty); + + global::OpenStudio.ScheduleFixedInterval schedule = new global::OpenStudio.ScheduleFixedInterval(model); + schedule.setName("Partial Year Interval Lighting"); + Assert.That(schedule.setTimeSeries(timeSeries), Is.True); + Assert.That(schedule.setOutOfRangeValue(-1), Is.True); + + OpenStudioImportResult result; + Profile profile = ImportLightingProfile(model, space, schedule, out result); + + Assert.That(profile[0], Is.EqualTo(-1), "January is outside the series coverage"); + Assert.That(profile[181 * 24], Is.EqualTo(7), "1 July uses the series value"); + Assert.That(profile[(181 * 24) + 23], Is.EqualTo(7)); + Assert.That(profile[182 * 24], Is.EqualTo(-1), "2 July is outside the one-day series"); + Assert.That(result.Diagnostics.Any(x => x.Code == Core.OpenStudio.OpenStudioImportDiagnosticCodes.ApproximationApplied && x.Message.Contains("out-of-range")), Is.True); + } + } + + [Test] + public void ScheduleFixedInterval_IntervalsCrossingHourBoundariesAreWeighted() + { + global::OpenStudio.Space space; + global::OpenStudio.Surface wall; + using (global::OpenStudio.Model model = BuildModel(out space, out wall)) + { + global::OpenStudio.Vector vector = new global::OpenStudio.Vector(2u); + vector.__setitem__(0u, 2); + vector.__setitem__(1u, 4); + + global::OpenStudio.TimeSeries timeSeries = new global::OpenStudio.TimeSeries(new global::OpenStudio.Date(new global::OpenStudio.MonthOfYear(1), 1, 2021), new global::OpenStudio.Time(0, 1, 30, 0), vector, string.Empty); + + global::OpenStudio.ScheduleFixedInterval schedule = new global::OpenStudio.ScheduleFixedInterval(model); + schedule.setName("Ninety Minute Interval Lighting"); + Assert.That(schedule.setTimeSeries(timeSeries), Is.True); + Assert.That(schedule.setOutOfRangeValue(-1), Is.True); + + OpenStudioImportResult result; + Profile profile = ImportLightingProfile(model, space, schedule, out result); + + Assert.That(profile[0], Is.EqualTo(2)); + Assert.That(profile[1], Is.EqualTo(3), "The hour straddles equal parts of the two reporting intervals"); + Assert.That(profile[2], Is.EqualTo(4)); + Assert.That(profile[3], Is.EqualTo(-1)); + } + } + + [Test] + public void ScheduleVariableInterval_IsReportedUnsupported_AndLeavesTheLoadWithoutAProfile() + { + global::OpenStudio.Space space; + global::OpenStudio.Surface wall; + using (global::OpenStudio.Model model = BuildModel(out space, out wall)) + { + // A variable-interval series: irregular timestamps, no fixed cadence to resample. + global::OpenStudio.DateTimeVector dateTimeVector = new global::OpenStudio.DateTimeVector(); + global::OpenStudio.Date startDate = new global::OpenStudio.Date(new global::OpenStudio.MonthOfYear(1), 1); + dateTimeVector.Add(new global::OpenStudio.DateTime(startDate, new global::OpenStudio.Time(0, 2, 0, 0))); + dateTimeVector.Add(new global::OpenStudio.DateTime(startDate, new global::OpenStudio.Time(0, 5, 0, 0))); + dateTimeVector.Add(new global::OpenStudio.DateTime(startDate, new global::OpenStudio.Time(0, 9, 0, 0))); + + global::OpenStudio.Vector vector = new global::OpenStudio.Vector(3u); + vector.__setitem__(0u, 0.2); + vector.__setitem__(1u, 0.6); + vector.__setitem__(2u, 0.9); + + global::OpenStudio.ScheduleVariableInterval schedule = new global::OpenStudio.ScheduleVariableInterval(model); + schedule.setName("Variable Interval Lighting"); + Assert.That(schedule.setTimeSeries(new global::OpenStudio.TimeSeries(dateTimeVector, vector, string.Empty)), Is.True, "The variable-interval time series must be accepted"); + + OpenStudioImportResult result; + Profile profile = ImportLightingProfile(model, space, schedule, out result); + + Assert.That(profile, Is.Null, "A variable-interval schedule has no fixed cadence and must not be expanded"); + Assert.That(result.Diagnostics.Any(x => x.Code == Core.OpenStudio.OpenStudioImportDiagnosticCodes.ScheduleUnsupported && x.Message.Contains("variable-interval")), Is.True, "The variable-interval schedule must be reported unsupported, never guessed"); + } + } + + [Test] + public void UnsupportedScheduleKind_IsReportedAndLeavesTheLoadWithoutAProfile() + { + global::OpenStudio.Space space; + global::OpenStudio.Surface wall; + using (global::OpenStudio.Model model = BuildModel(out space, out wall)) + { + global::OpenStudio.SpaceType spaceType = new global::OpenStudio.SpaceType(model); + spaceType.setName("Office"); + space.setSpaceType(spaceType); + + global::OpenStudio.ScheduleCompact scheduleCompact = new global::OpenStudio.ScheduleCompact(model); + scheduleCompact.setName("Compact Lighting"); + + global::OpenStudio.LightsDefinition lightsDefinition = new global::OpenStudio.LightsDefinition(model); + lightsDefinition.setWattsperSpaceFloorArea(8); + global::OpenStudio.Lights lights = new global::OpenStudio.Lights(lightsDefinition); + lights.setSpaceType(spaceType); + lights.setSchedule(scheduleCompact); + + OpenStudioImportResult result; + List diagnostics = Import(model, out result); + + AssertHasCode(diagnostics, Core.OpenStudio.OpenStudioImportDiagnosticCodes.ScheduleUnsupported); + + InternalCondition internalCondition = result.AnalyticalModel.AdjacencyCluster.GetSpaces()[0].InternalCondition; + + string lightingProfileName; + Assert.That(internalCondition.TryGetValue(InternalConditionParameter.LightingProfileName, out lightingProfileName), Is.False, "An unexpandable schedule must leave the load without a profile, not with an invented one"); + } + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/R5/ReverseCoverageTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/R5/ReverseCoverageTests.cs new file mode 100644 index 0000000..a8f12ba --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/R5/ReverseCoverageTests.cs @@ -0,0 +1,264 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text.Json; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// R5: enforcement of the reverse coverage manifest + /// (tests/resources/openstudio-to-sam-coverage.json). The manifest is the claim the + /// documentation makes about what the importer covers; these tests make it a claim the build + /// can falsify. + /// + [TestFixture] + public class ReverseCoverageTests + { + private static readonly string[] ValidStatuses = { "Native", "Derived", "Approximated", "Unsupported", "Deferred", "NotApplicable" }; + + private static JsonDocument Manifest() + { + string path = Path.GetFullPath(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "..", "..", "..", "resources", "openstudio-to-sam-coverage.json")); + Assert.That(File.Exists(path), Is.True, $"Reverse coverage manifest missing: {path}"); + return JsonDocument.Parse(File.ReadAllText(path)); + } + + private static List Entries(JsonDocument manifest) + { + return manifest.RootElement.GetProperty("entries").EnumerateArray().ToList(); + } + + /// Every constant declared on the reverse diagnostic-code class. + private static HashSet DeclaredCodes() + { + HashSet result = new HashSet(); + foreach (FieldInfo fieldInfo in typeof(Core.OpenStudio.OpenStudioImportDiagnosticCodes).GetFields(BindingFlags.Public | BindingFlags.Static)) + { + if (fieldInfo.IsLiteral && fieldInfo.FieldType == typeof(string)) + { + result.Add((string)fieldInfo.GetRawConstantValue()); + } + } + + return result; + } + + [Test] + public void Manifest_IsStructurallySound() + { + using (JsonDocument manifest = Manifest()) + { + List entries = Entries(manifest); + Assert.That(entries.Count, Is.GreaterThan(100), "The audit covers the OpenStudio concepts the importer meets"); + + HashSet ids = new HashSet(); + List violations = new List(); + + foreach (JsonElement entry in entries) + { + string id = entry.GetProperty("id").GetString(); + string status = entry.GetProperty("status").GetString(); + + if (!ids.Add(id)) + { + violations.Add($"Duplicate manifest id {id}"); + } + + if (!ValidStatuses.Contains(status)) + { + violations.Add($"{id}: invalid status {status}"); + } + + // The whole point of the Unsupported and Approximated statuses is that + // something is said out loud; an entry with neither a diagnostic nor a note + // is a silent drop wearing a label. + if ((status == "Unsupported" || status == "Approximated" || status == "Deferred") + && !entry.TryGetProperty("diagnostic", out _) && !entry.TryGetProperty("notes", out _)) + { + violations.Add($"{id}: {status} entries must declare a diagnostic or a note"); + } + + if (status == "Derived" && !entry.TryGetProperty("formula", out _) && !entry.TryGetProperty("notes", out _) && !entry.TryGetProperty("diagnostic", out _)) + { + violations.Add($"{id}: Derived entries must document how the value is calculated"); + } + } + + Assert.That(violations, Is.Empty, string.Join(Environment.NewLine, violations)); + } + } + + [Test] + public void EveryDeclaredDiagnosticCode_Exists() + { + HashSet declaredCodes = DeclaredCodes(); + + using (JsonDocument manifest = Manifest()) + { + List violations = new List(); + + foreach (JsonElement entry in Entries(manifest)) + { + JsonElement diagnostic; + if (!entry.TryGetProperty("diagnostic", out diagnostic)) + { + continue; + } + + string code = diagnostic.GetString(); + if (!declaredCodes.Contains(code)) + { + violations.Add($"{entry.GetProperty("id").GetString()}: diagnostic {code} is not a constant of OpenStudioImportDiagnosticCodes"); + } + } + + Assert.That(violations, Is.Empty, string.Join(Environment.NewLine, violations)); + } + } + + [Test] + public void EveryDiagnosticCode_IsUsedByTheImporter() + { + // A code nobody raises is a promise the importer does not keep. The manifest is the + // register of intent, so every declared constant must appear in it. + using (JsonDocument manifest = Manifest()) + { + HashSet manifestCodes = new HashSet(); + foreach (JsonElement entry in Entries(manifest)) + { + JsonElement diagnostic; + if (entry.TryGetProperty("diagnostic", out diagnostic)) + { + manifestCodes.Add(diagnostic.GetString()); + } + } + + List unused = DeclaredCodes().Where(x => !manifestCodes.Contains(x)).ToList(); + + Assert.That(unused, Is.Empty, "Every reverse diagnostic code must be claimed by a manifest entry: " + string.Join(", ", unused)); + } + } + + [Test] + public void DiagnosticCodes_AreUniqueAndCorrectlyPrefixed() + { + HashSet seen = new HashSet(); + + foreach (string code in DeclaredCodes()) + { + Assert.That(code, Does.StartWith("SAM-OSI-"), "Reverse codes must be distinguishable from the forward SAM-OS-* codes by prefix alone"); + Assert.That(seen.Add(code), Is.True, $"Duplicate diagnostic code {code}"); + } + } + + [Test] + public void ForwardAndReverseCodeSets_AreDisjoint() + { + HashSet forward = new HashSet(); + foreach (FieldInfo fieldInfo in typeof(Core.OpenStudio.OpenStudioDiagnosticCodes).GetFields(BindingFlags.Public | BindingFlags.Static)) + { + if (fieldInfo.IsLiteral && fieldInfo.FieldType == typeof(string)) + { + forward.Add((string)fieldInfo.GetRawConstantValue()); + } + } + + foreach (string code in DeclaredCodes()) + { + Assert.That(forward.Contains(code), Is.False, $"{code} is declared in both directions; a consumer could not tell which produced a diagnostic"); + } + } + + [Test] + public void EveryPanelType_HasAReverseMapping() + { + // Every SAM PanelType the forward direction can produce must be reachable coming + // back, otherwise a round trip silently changes a panel's role. + HashSet reachable = new HashSet(); + + foreach (string surfaceType in new[] { "Wall", "Floor", "RoofCeiling" }) + { + foreach (string boundaryCondition in new[] { "Outdoors", "Surface", "Adiabatic", "Ground", "Foundation" }) + { + bool adiabatic; + bool supported; + reachable.Add(Query.SAMPanelType(surfaceType, boundaryCondition, out adiabatic, out supported)); + } + } + + foreach (PanelType panelType in new[] { PanelType.WallExternal, PanelType.WallInternal, PanelType.UndergroundWall, PanelType.FloorExposed, PanelType.FloorInternal, PanelType.SlabOnGrade, PanelType.Roof, PanelType.Ceiling, PanelType.UndergroundCeiling }) + { + Assert.That(reachable.Contains(panelType), Is.True, $"{panelType} is not reachable from any surface type / boundary condition pair"); + } + } + + [Test] + public void EverySubSurfaceType_MapsOrIsExplicitlyUnsupported() + { + // The full OpenStudio subsurface-type domain: each must either map or be rejected + // deliberately, never fall through by accident. + Dictionary expected = new Dictionary + { + { "FixedWindow", ApertureType.Window }, + { "OperableWindow", ApertureType.Window }, + { "Skylight", ApertureType.Window }, + { "TubularDaylightDome", ApertureType.Window }, + { "TubularDaylightDiffuser", ApertureType.Window }, + { "Door", ApertureType.Door }, + { "GlassDoor", ApertureType.Door }, + { "OverheadDoor", ApertureType.Door }, + }; + + foreach (KeyValuePair keyValuePair in expected) + { + bool approximated; + Assert.That(Query.SAMApertureType(keyValuePair.Key, out approximated), Is.EqualTo(keyValuePair.Value), keyValuePair.Key); + } + + bool unusedApproximated; + Assert.That(Query.SAMApertureType("SomethingElse", out unusedApproximated), Is.EqualTo(ApertureType.Undefined)); + Assert.That(Query.SAMApertureType(null, out unusedApproximated), Is.EqualTo(ApertureType.Undefined)); + } + + [Test] + public void BoundaryConditionMapping_CoversTheOpenStudioDomain() + { + // The values OpenStudio itself declares valid. Anything it can write, the importer + // must classify — and the ones it cannot represent must say so. + using (global::OpenStudio.Model model = new global::OpenStudio.Model()) + { + global::OpenStudio.Point3dVector point3dVector = new global::OpenStudio.Point3dVector(); + point3dVector.Add(new global::OpenStudio.Point3d(0, 0, 0)); + point3dVector.Add(new global::OpenStudio.Point3d(4, 0, 0)); + point3dVector.Add(new global::OpenStudio.Point3d(4, 0, 3)); + point3dVector.Add(new global::OpenStudio.Point3d(0, 0, 3)); + + global::OpenStudio.Surface surface = new global::OpenStudio.Surface(point3dVector, model); + + List unclassified = new List(); + foreach (string value in global::OpenStudio.Surface.validOutsideBoundaryConditionValues()) + { + bool adiabatic; + bool supported; + PanelType panelType = Query.SAMPanelType("Wall", value, out adiabatic, out supported); + + // Either it maps to a real panel type, or it is explicitly flagged + // unsupported so the caller reports SAM-OSI-BC-001. Silent Undefined is the + // one outcome that is not acceptable. + if (panelType == PanelType.Undefined && supported) + { + unclassified.Add(value); + } + } + + Assert.That(unclassified, Is.Empty, "Unclassified boundary conditions: " + string.Join(", ", unclassified)); + } + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/R6/RealModelRegressionTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/R6/RealModelRegressionTests.cs new file mode 100644 index 0000000..4395043 --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/R6/RealModelRegressionTests.cs @@ -0,0 +1,312 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// R6: regressions found importing a real multi-zone SAM-exported building in Rhino. + /// + /// Two things the synthetic fixtures did not surface: an opaque-pane aperture construction (a + /// solid door) is indistinguishable from a wall construction by its layers, so it must be + /// classified from its stamped SAM type; and a real space's surfaces close only at the + /// millimetre, so the internal-point derivation must not run at the micron tolerance and must + /// have a fallback. + /// + /// + [TestFixture] + public class RealModelRegressionTests + { + private static global::OpenStudio.Point3dVector ToVector(double[][] vertices) + { + global::OpenStudio.Point3dVector result = new global::OpenStudio.Point3dVector(); + foreach (double[] vertex in vertices) + { + result.Add(new global::OpenStudio.Point3d(vertex[0], vertex[1], vertex[2])); + } + + return result; + } + + private static global::OpenStudio.Surface AddSurface(global::OpenStudio.Model model, global::OpenStudio.Space space, string surfaceType, string boundaryCondition, double[][] vertices) + { + global::OpenStudio.Surface surface = new global::OpenStudio.Surface(ToVector(vertices), model); + surface.setSpace(space); + surface.setSurfaceType(surfaceType); + surface.setOutsideBoundaryCondition(boundaryCondition); + return surface; + } + + /// A closed box space, optionally with each vertex nudged by a sub-millimetre jitter. + private static global::OpenStudio.Space AddBox(global::OpenStudio.Model model, string name, double x0, double jitter) + { + global::OpenStudio.Space space = new global::OpenStudio.Space(model); + space.setName(name); + + global::OpenStudio.ThermalZone thermalZone = new global::OpenStudio.ThermalZone(model); + thermalZone.setName(name + " Zone"); + space.setThermalZone(thermalZone); + + double w = 4, d = 3, h = 2.7; + double j = jitter; + + AddSurface(model, space, "Floor", "Ground", new[] { new[] { x0, 0.0, 0.0 }, new[] { x0, d, 0.0 }, new[] { x0 + w, d, 0.0 }, new[] { x0 + w, 0.0, 0.0 } }); + AddSurface(model, space, "RoofCeiling", "Outdoors", new[] { new[] { x0, 0.0, h }, new[] { x0 + w, 0.0, h }, new[] { x0 + w, d, h }, new[] { x0, d, h } }); + // The four walls, each corner independently nudged by +/- jitter so no two walls share + // a bit-identical vertex — the shell then closes only above the jitter scale. + AddSurface(model, space, "Wall", "Outdoors", new[] { new[] { x0, 0.0, 0.0 }, new[] { x0 + w, j, 0.0 }, new[] { x0 + w, 0.0, h }, new[] { x0, j, h } }); + AddSurface(model, space, "Wall", "Outdoors", new[] { new[] { x0 + w, 0.0, 0.0 }, new[] { x0 + w, d, j }, new[] { x0 + w, d, h }, new[] { x0 + w, 0.0, h } }); + AddSurface(model, space, "Wall", "Outdoors", new[] { new[] { x0 + w, d, 0.0 }, new[] { x0, d, 0.0 }, new[] { x0 - j, d, h }, new[] { x0 + w, d, h } }); + AddSurface(model, space, "Wall", "Outdoors", new[] { new[] { x0, d, 0.0 }, new[] { x0, 0.0, 0.0 }, new[] { x0, 0.0, h }, new[] { x0, d, h } }); + + return space; + } + + [Test] + public void OpaquePaneApertureConstruction_RoundTripsAsApertureConstructionWithItsGuid() + { + Guid apertureConstructionGuid = Guid.NewGuid(); + + using (global::OpenStudio.Model model = new global::OpenStudio.Model()) + { + // A single free-standing wall (the pattern the R4 tests prove attaches + // subsurfaces): the box import has its own aperture-containment subtleties that + // are not what this test is about — this test is about the construction's type. + global::OpenStudio.Space space = new global::OpenStudio.Space(model); + space.setName("Room"); + global::OpenStudio.ThermalZone thermalZone = new global::OpenStudio.ThermalZone(model); + thermalZone.setName("Zone"); + space.setThermalZone(thermalZone); + + global::OpenStudio.Surface wall = AddSurface(model, space, "Wall", "Outdoors", new[] { new[] { 0.0, 0.0, 0.0 }, new[] { 4.0, 0.0, 0.0 }, new[] { 4.0, 0.0, 2.7 }, new[] { 0.0, 0.0, 2.7 } }); + + // A solid door: an OS:Construction whose only layer is an OPAQUE material — exactly + // what the forward direction writes for an opaque-pane ApertureConstruction — and + // stamped as an ApertureConstruction, which is the only thing distinguishing it + // from a wall construction. + global::OpenStudio.StandardOpaqueMaterial timber = new global::OpenStudio.StandardOpaqueMaterial(model, "MediumSmooth", 0.04, 0.15, 600, 1600); + timber.setName("Door Timber"); + + global::OpenStudio.OpaqueMaterialVector layers = new global::OpenStudio.OpaqueMaterialVector(); + layers.Add(timber); + global::OpenStudio.Construction doorConstruction = new global::OpenStudio.Construction(layers); + doorConstruction.setName("SAM_Construction_Door_Pane_Forward_deadbeef"); + Core.OpenStudio.Modify.SetSAMIdentity(doorConstruction, apertureConstructionGuid, typeof(ApertureConstruction).Name, "Door Pane"); + + // Strictly inside the wall boundary (off the floor edge), so SAM's aperture + // containment check accepts it — the forward direction offsets edge apertures; + // this test simply places it clear of the edge. + global::OpenStudio.SubSurface door = new global::OpenStudio.SubSurface(ToVector(new[] { new[] { 1.0, 0.0, 0.9 }, new[] { 2.0, 0.0, 0.9 }, new[] { 2.0, 0.0, 2.1 }, new[] { 1.0, 0.0, 2.1 } }), model); + door.setSurface(wall); + door.setSubSurfaceType("Door"); + door.setConstruction(doorConstruction); + + OpenStudioImportResult result = model.ToSAM(); + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in result.Diagnostics) + { + TestContext.Out.WriteLine(diagnostic.ToString()); + } + + // The stamped type must be trusted: no "declares type 'ApertureConstruction' but a + // Construction is being imported" collision. + Assert.That(result.Diagnostics.Any(x => x.Code == Core.OpenStudio.OpenStudioImportDiagnosticCodes.IdentityCollision), Is.False, "An opaque-pane door stamped as an ApertureConstruction must not trigger an identity collision"); + + // The door aperture must keep its real construction, not a placeholder. + List apertures = new List(); + foreach (Panel panel in result.AnalyticalModel.AdjacencyCluster.GetPanels()) + { + if (panel.Apertures != null) + { + apertures.AddRange(panel.Apertures); + } + } + + Assert.That(apertures.Count, Is.EqualTo(1), "The door must import as one SAM aperture"); + Aperture aperture = apertures[0]; + + ApertureConstruction apertureConstruction = aperture.ApertureConstruction; + Assert.That(apertureConstruction, Is.Not.Null); + Assert.That(apertureConstruction.Guid, Is.EqualTo(apertureConstructionGuid), "The ApertureConstruction GUID must be restored, not replaced"); + Assert.That(apertureConstruction.PaneConstructionLayers, Is.Not.Null.And.Not.Empty, "The door must keep its pane layer, not fall back to an empty placeholder"); + Assert.That(apertureConstruction.PaneConstructionLayers[0].Name, Is.EqualTo("Door Timber")); + } + } + + [Test] + public void OpaquePaneDoor_WithoutSamMetadata_KeepsItsOpaqueLayers() + { + // The same solid door as above, but with NO SAM identity stamp — a third-party model, + // or the forward-written door before identity was added. The construction pass then + // classifies it by its layers and files it as an opaque Construction; the aperture + // resolver must still carry those real layers across instead of an empty placeholder. + using (global::OpenStudio.Model model = new global::OpenStudio.Model()) + { + global::OpenStudio.Space space = new global::OpenStudio.Space(model); + space.setName("Room"); + global::OpenStudio.ThermalZone thermalZone = new global::OpenStudio.ThermalZone(model); + thermalZone.setName("Zone"); + space.setThermalZone(thermalZone); + + global::OpenStudio.Surface wall = AddSurface(model, space, "Wall", "Outdoors", new[] { new[] { 0.0, 0.0, 0.0 }, new[] { 4.0, 0.0, 0.0 }, new[] { 4.0, 0.0, 2.7 }, new[] { 0.0, 0.0, 2.7 } }); + + global::OpenStudio.StandardOpaqueMaterial timber = new global::OpenStudio.StandardOpaqueMaterial(model, "MediumSmooth", 0.04, 0.15, 600, 1600); + timber.setName("Door Timber"); + + global::OpenStudio.OpaqueMaterialVector layers = new global::OpenStudio.OpaqueMaterialVector(); + layers.Add(timber); + global::OpenStudio.Construction doorConstruction = new global::OpenStudio.Construction(layers); + doorConstruction.setName("Plain Opaque Door"); + // Deliberately NO Core.OpenStudio.Modify.SetSAMIdentity call. + + global::OpenStudio.SubSurface door = new global::OpenStudio.SubSurface(ToVector(new[] { new[] { 1.0, 0.0, 0.9 }, new[] { 2.0, 0.0, 0.9 }, new[] { 2.0, 0.0, 2.1 }, new[] { 1.0, 0.0, 2.1 } }), model); + door.setSurface(wall); + door.setSubSurfaceType("Door"); + door.setConstruction(doorConstruction); + + OpenStudioImportResult result = model.ToSAM(); + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in result.Diagnostics) + { + TestContext.Out.WriteLine(diagnostic.ToString()); + } + + List apertures = new List(); + foreach (Panel panel in result.AnalyticalModel.AdjacencyCluster.GetPanels()) + { + if (panel.Apertures != null) + { + apertures.AddRange(panel.Apertures); + } + } + + Assert.That(apertures.Count, Is.EqualTo(1), "The door must import as one SAM aperture"); + + ApertureConstruction apertureConstruction = apertures[0].ApertureConstruction; + Assert.That(apertureConstruction, Is.Not.Null); + Assert.That(apertureConstruction.PaneConstructionLayers, Is.Not.Null.And.Not.Empty, "A metadata-free opaque door must keep its opaque layers, not fall back to an empty placeholder"); + Assert.That(apertureConstruction.PaneConstructionLayers[0].Name, Is.EqualTo("Door Timber")); + Assert.That(apertureConstruction.ApertureType, Is.EqualTo(ApertureType.Door), "The aperture type comes from the subsurface, not the construction"); + } + } + + [Test] + public void SpaceThatClosesOnlyAtMillimetre_StillGetsAnInternalPointLocation() + { + using (global::OpenStudio.Model model = new global::OpenStudio.Model()) + { + // 0.5 mm jitter: below MacroDistance (1 mm) so the shell still closes there, but + // far above DistanceTolerance (1 micron), which is where the old code failed. + AddBox(model, "Jittered Room", 0, 0.0005); + + OpenStudioImportResult result = model.ToSAM(); + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in result.Diagnostics) + { + TestContext.Out.WriteLine(diagnostic.ToString()); + } + + Space space = result.AnalyticalModel.AdjacencyCluster.GetSpaces()[0]; + Assert.That(space.Location, Is.Not.Null, "A space that closes at the millimetre must still get a SAM location"); + + double volume; + Assert.That(space.TryGetValue(SpaceParameter.Volume, out volume), Is.True, "Volume must be derived from the shell"); + Assert.That(volume, Is.EqualTo(4.0 * 3.0 * 2.7).Within(2).Percent); + } + } + + [Test] + public void SpaceThatCannotClose_GetsACentroidLocationAndIsReported() + { + using (global::OpenStudio.Model model = new global::OpenStudio.Model()) + { + global::OpenStudio.Space space = AddBox(model, "Open Room", 0, 0); + + // Delete the roof so the shell genuinely cannot close. + model.getSurfaces().First(x => x.surfaceType() == "RoofCeiling").remove(); + + OpenStudioImportResult result = model.ToSAM(); + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in result.Diagnostics) + { + TestContext.Out.WriteLine(diagnostic.ToString()); + } + + Space importedSpace = result.AnalyticalModel.AdjacencyCluster.GetSpaces()[0]; + + // The key regression: an unclosable space must NOT be left with a null location. + Assert.That(importedSpace.Location, Is.Not.Null, "An unclosable space must fall back to the vertex centroid, never a null location"); + + // And it must say the location is approximate rather than pretend it is exact. + Assert.That(result.Diagnostics.Any(x => x.Code == Core.OpenStudio.OpenStudioImportDiagnosticCodes.ApproximationApplied && x.Message.Contains("centroid")), Is.True); + + // The centroid of a 4 x 3 x 2.7 box floor-and-walls sits inside the footprint. + Assert.That(importedSpace.Location.X, Is.GreaterThan(0).And.LessThan(4)); + Assert.That(importedSpace.Location.Y, Is.GreaterThan(0).And.LessThan(3)); + } + } + + [Test] + public void CollinearVertices_AreCleanedAsInformationNotWarning() + { + using (global::OpenStudio.Model model = new global::OpenStudio.Model()) + { + global::OpenStudio.Space space = new global::OpenStudio.Space(model); + space.setName("Room"); + global::OpenStudio.ThermalZone thermalZone = new global::OpenStudio.ThermalZone(model); + thermalZone.setName("Zone"); + space.setThermalZone(thermalZone); + + // A rectangle with a redundant vertex at the midpoint of its bottom edge — exactly + // what a real exported model carries, and what produced ten warnings on the real + // building. The point lies ON the edge, so the polygon is geometrically identical. + AddSurface(model, space, "Wall", "Outdoors", new[] { new[] { 0.0, 0.0, 0.0 }, new[] { 2.0, 0.0, 0.0 }, new[] { 4.0, 0.0, 0.0 }, new[] { 4.0, 0.0, 2.7 }, new[] { 0.0, 0.0, 2.7 } }); + + OpenStudioImportResult result = model.ToSAM(); + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in result.Diagnostics) + { + TestContext.Out.WriteLine(diagnostic.ToString()); + } + + Core.OpenStudio.OpenStudioDiagnostic cleaned = result.Diagnostics.FirstOrDefault(x => x.Code == Core.OpenStudio.OpenStudioImportDiagnosticCodes.GeometryVerticesCleaned); + Assert.That(cleaned, Is.Not.Null, "Vertex cleaning must be reported under its own code"); + Assert.That(cleaned.Severity, Is.EqualTo(Core.OpenStudio.OpenStudioDiagnosticSeverity.Information), "Removing a collinear vertex changes nothing, so it must not be a warning"); + + // It must NOT be reported as invalid geometry, which is what buried real failures. + Assert.That(result.Diagnostics.Any(x => x.Code == Core.OpenStudio.OpenStudioImportDiagnosticCodes.GeometryInvalid), Is.False); + + // And the panel must still be imported, with its true 4 m x 2.7 m area. + List panels = result.AnalyticalModel.AdjacencyCluster.GetPanels(); + Assert.That(panels.Count, Is.EqualTo(1)); + Assert.That(panels[0].GetFace3D().GetArea(), Is.EqualTo(4.0 * 2.7).Within(0.01)); + } + } + + [Test] + public void MultiSpaceBuilding_EveryImportedSpaceGetsALocation() + { + using (global::OpenStudio.Model model = new global::OpenStudio.Model()) + { + // Several rooms side by side, each with its own sub-millimetre jitter — a + // miniature of the real building where every space reported ZONE-002. + for (int i = 0; i < 5; i++) + { + AddBox(model, "Room " + i, i * 5.0, 0.0004); + } + + OpenStudioImportResult result = model.ToSAM(); + + List spaces = result.AnalyticalModel.AdjacencyCluster.GetSpaces(); + Assert.That(spaces.Count, Is.EqualTo(5)); + + foreach (Space space in spaces) + { + Assert.That(space.Location, Is.Not.Null, $"Space '{space.Name}' must have a location"); + } + + // None should now report the old "location is not set" ZoneIncomplete warning. + Assert.That(result.Diagnostics.Any(x => x.Code == Core.OpenStudio.OpenStudioImportDiagnosticCodes.ZoneIncomplete && x.Message.Contains("location is not set")), Is.False); + } + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/R7/WeatherImportTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/R7/WeatherImportTests.cs new file mode 100644 index 0000000..7766f9b --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/R7/WeatherImportTests.cs @@ -0,0 +1,147 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using System; +using System.IO; +using System.Linq; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// R7: weather import. A SAM-exported OSM references an EPW that the forward converter wrote + /// to disk; when that file is present, the import must load its hourly weather back into SAM + /// WeatherData, not just record the path. + /// + [TestFixture] + public class WeatherImportTests + { + private static string WeatherPath(string extension) + { + return Path.GetFullPath(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "..", "..", "..", "resources", "weather", "USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2004-2018" + extension)); + } + + private string directory; + + [SetUp] + public void SetUp() + { + directory = Path.Combine(Path.GetTempPath(), "SAM_OpenStudio_WeatherTests_" + Guid.NewGuid().ToString("N").Substring(0, 8)); + Directory.CreateDirectory(directory); + } + + [TearDown] + public void TearDown() + { + try + { + Directory.Delete(directory, true); + } + catch (Exception) + { + // a locked temp directory must not fail an otherwise passing test + } + } + + [Test] + public void ReferencedEpwOnDisk_IsLoadedIntoEmbeddedWeatherData() + { + string epwPath = WeatherPath(".epw"); + Assume.That(File.Exists(epwPath), Is.True, "The committed Boston EPW fixture is required for this test"); + + // Export a model with that EPW: the forward converter writes the WeatherFile + // reference into the OSM. Saving and re-importing exercises the real disk path. + string osmPath = Path.Combine(directory, "model.osm"); + using (OpenStudioConversionResult conversionResult = AnalyticalModelFixtures.SingleBox().ToOpenStudio(epwPath, directory, run: false)) + { + Assert.That(conversionResult, Is.Not.Null); + Assert.That(conversionResult.Model.save(global::OpenStudio.OpenStudioUtilitiesCore.toPath(osmPath), true), Is.True); + } + + OpenStudioImportResult result = Convert.ToSAM(osmPath); + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in result.Diagnostics) + { + TestContext.Out.WriteLine(diagnostic.ToString()); + } + + Assert.That(result.Successful, Is.True); + + Weather.WeatherData weatherData; + Assert.That(result.AnalyticalModel.TryGetValue(AnalyticalModelParameter.WeatherData, out weatherData), Is.True, "The referenced EPW must be loaded into embedded SAM WeatherData"); + Assert.That(weatherData, Is.Not.Null); + Assert.That(weatherData.Years, Is.Not.Null.And.Not.Empty, "The embedded weather must carry hourly weather years"); + + // The import must announce it embedded weather, not that it could not. + Assert.That(result.Diagnostics.Any(x => x.Code == Core.OpenStudio.OpenStudioImportDiagnosticCodes.WeatherLimitation && x.Message.Contains("embedded in the AnalyticalModel")), Is.True); + } + + [Test] + public void EmbeddedWeather_RoundTripsBackToAnEpwOnReexport() + { + string epwPath = WeatherPath(".epw"); + Assume.That(File.Exists(epwPath), Is.True); + + string osmPath = Path.Combine(directory, "model.osm"); + using (OpenStudioConversionResult conversionResult = AnalyticalModelFixtures.SingleBox().ToOpenStudio(epwPath, directory, run: false)) + { + conversionResult.Model.save(global::OpenStudio.OpenStudioUtilitiesCore.toPath(osmPath), true); + } + + OpenStudioImportResult result = Convert.ToSAM(osmPath); + Assert.That(result.Successful, Is.True); + + // The imported model's embedded weather must be usable by the forward exporter again: + // EmbeddedAnnualWeatherPath writes it back out to an EPW, closing the loop. + string reexportedEpw = result.AnalyticalModel.EmbeddedAnnualWeatherPath(); + Assert.That(reexportedEpw, Is.Not.Null, "The re-imported WeatherData must be exportable back to an EPW"); + Assert.That(File.Exists(reexportedEpw), Is.True); + } + + [Test] + public void MissingEpw_RecordsThePathAndReportsNoWeatherEmbedded() + { + // A model whose WeatherFile points at an EPW that is not on disk: the path is kept as + // metadata, but nothing is presented as embedded weather. + using (global::OpenStudio.Model model = new global::OpenStudio.Model()) + { + global::OpenStudio.OptionalWeatherFile optionalWeatherFile = global::OpenStudio.WeatherFile.setWeatherFile(model, global::OpenStudio.EpwFile.load(global::OpenStudio.OpenStudioUtilitiesCore.toPath(WeatherPath(".epw"))).get()); + Assume.That(optionalWeatherFile.isNull(), Is.False); + + // Save, then move the model somewhere the relative weather path cannot resolve. + string osmPath = Path.Combine(directory, "no_weather.osm"); + model.save(global::OpenStudio.OpenStudioUtilitiesCore.toPath(osmPath), true); + + OpenStudioImportResult result = Convert.ToSAM(osmPath, new Core.OpenStudio.OpenStudioImportOptions { ImportWeatherData = true }); + + // The Boston EPW is at an absolute path that DOES exist, so this actually embeds. + // To assert the missing branch we disable import instead. + OpenStudioImportResult noImport = Convert.ToSAM(osmPath, new Core.OpenStudio.OpenStudioImportOptions { ImportWeatherData = false }); + + Weather.WeatherData weatherData; + Assert.That(noImport.AnalyticalModel.TryGetValue(AnalyticalModelParameter.WeatherData, out weatherData), Is.False, "With import disabled, no WeatherData may be embedded"); + Assert.That(noImport.Diagnostics.Any(x => x.Code == Core.OpenStudio.OpenStudioImportDiagnosticCodes.WeatherLimitation && x.Message.Contains("no SAM WeatherData was embedded")), Is.True); + + string weatherFilePath; + Assert.That(noImport.AnalyticalModel.TryGetValue(OpenStudioSourceParameter.WeatherFilePath, out weatherFilePath), Is.True, "The weather-file path must still be recorded as metadata"); + } + } + + [Test] + public void ImportDisabled_KeepsOnlyThePathEvenWhenTheEpwExists() + { + string epwPath = WeatherPath(".epw"); + Assume.That(File.Exists(epwPath), Is.True); + + string osmPath = Path.Combine(directory, "model.osm"); + using (OpenStudioConversionResult conversionResult = AnalyticalModelFixtures.SingleBox().ToOpenStudio(epwPath, directory, run: false)) + { + conversionResult.Model.save(global::OpenStudio.OpenStudioUtilitiesCore.toPath(osmPath), true); + } + + OpenStudioImportResult result = Convert.ToSAM(osmPath, new Core.OpenStudio.OpenStudioImportOptions { ImportWeatherData = false }); + + Weather.WeatherData weatherData; + Assert.That(result.AnalyticalModel.TryGetValue(AnalyticalModelParameter.WeatherData, out weatherData), Is.False); + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/SAM.Analytical.OpenStudio.Tests.csproj b/tests/SAM.Analytical.OpenStudio.Tests/SAM.Analytical.OpenStudio.Tests.csproj new file mode 100644 index 0000000..699bf60 --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/SAM.Analytical.OpenStudio.Tests.csproj @@ -0,0 +1,39 @@ + + + net8.0 + Library + false + x64 + x64 + x64 + latest + + + + + + + + + + + + + + + ..\..\..\SAM\build\SAM.Core.dll + + + ..\..\..\SAM\build\SAM.Geometry.dll + + + ..\..\..\SAM\build\SAM.Analytical.dll + + + ..\..\..\SAM\build\SAM.Architectural.dll + + + ..\..\..\SAM\build\SAM.Weather.dll + + + diff --git a/tests/resources/models/README.md b/tests/resources/models/README.md new file mode 100644 index 0000000..8d984bd --- /dev/null +++ b/tests/resources/models/README.md @@ -0,0 +1,27 @@ +# Pinned analytical-model fixtures + +Real SAM models exported from Rhino/Grasshopper during human validation, committed so the +behaviour they exposed stays covered headlessly. They are read-only inputs — tests must never +write back to them. + +## `rawModel-WindowsWeatherDataDDYAdiabaticAirPanel.sam` + +**Provenance:** exported 2026-07-21 from +`SAM_daily\2026-07-19 OpenStudio\Openstudio-Run.ghx` (London TMYx), the same production +definition that drove the human-Rhino validation rounds. + +**Contents:** 2 spaces (`Cell 1`, `Cell 2`), 11 panels, embedded `WeatherData` + +heating/cooling design days. + +| Feature | In the model | +| --- | --- | +| `PanelType.Air` partition | 1 panel between the two cells, no construction (Guid `3487704c…`) | +| `PanelParameter.Adiabatic` | `true` on both `SlabOnGrade` floors (Guids `fa554084…`, `9a75a51f…`) | +| Apertures | 10 windows across the six external walls | +| Embedded weather | `WeatherData` with hourly years, plus both design days | + +Covers, in one real model rather than a synthetic fixture: the adiabatic flag overriding the +`SlabOnGrade` → Ground mapping, the air boundary shared across a paired partition, and the +opt-in `AirBoundaryAirChangesPerHour` inter-zone mixing. + +**Integrity:** see `SHA256SUMS.txt`. diff --git a/tests/resources/models/SHA256SUMS.txt b/tests/resources/models/SHA256SUMS.txt new file mode 100644 index 0000000..338fd29 --- /dev/null +++ b/tests/resources/models/SHA256SUMS.txt @@ -0,0 +1 @@ +b2ab6826e085d621cfd219d58d924f38cc02a3406852d39bfad8aeb205abf32d rawModel-WindowsWeatherDataDDYAdiabaticAirPanel.sam diff --git a/tests/resources/models/rawModel-WindowsWeatherDataDDYAdiabaticAirPanel.sam b/tests/resources/models/rawModel-WindowsWeatherDataDDYAdiabaticAirPanel.sam new file mode 100644 index 0000000..52cf3e9 Binary files /dev/null and b/tests/resources/models/rawModel-WindowsWeatherDataDDYAdiabaticAirPanel.sam differ diff --git a/tests/resources/openstudio-analytical-coverage.json b/tests/resources/openstudio-analytical-coverage.json new file mode 100644 index 0000000..78f2453 --- /dev/null +++ b/tests/resources/openstudio-analytical-coverage.json @@ -0,0 +1,334 @@ +{ + "version": 1, + "reviewed": "2026-07-19", + "description": "Machine-readable SAM -> OpenStudio analytical translation coverage manifest. One entry per SAM property/concept. Enum-backed entries have id '.' and MUST cover every live member of every enum listed in coveredEnums (enforced by reflection in the completeness tests). Statuses: Native (direct OpenStudio mapping), Derived (deterministically calculated from SAM data), Approximated (documented engineering assumption), Unsupported (no safe OpenStudio equivalent; structured diagnostic emitted when source data present), Deferred (detailed-HVAC programme), NA (no energy semantics / no source data / result-only slot; nothing to translate). The 'milestone' is where the final mapping lands (MVP = merged PR #7). docs/SAM_OPENSTUDIO_ANALYTICAL_COVERAGE.md is generated from this file and must not be parsed by tests.", + "statuses": ["Native", "Derived", "Approximated", "Unsupported", "Deferred", "NA"], + "deferredDomains": [ + "Detailed SAM AirSystem conversion", + "Air loops and plant loops", + "Heating/cooling system equipment", + "Water systems", + "Control sequences", + "Modelica/FMI", + "Compliance workflows (NCM, Part F, Part O)", + "TAS versus EnergyPlus validation harness", + "AI-assisted QA" + ], + "coveredEnums": [ + { "type": "SAM.Analytical.InternalConditionParameter", "prefix": "InternalConditionParameter" }, + { "type": "SAM.Analytical.SpaceParameter", "prefix": "SpaceParameter" }, + { "type": "SAM.Analytical.ProfileType", "prefix": "ProfileType" }, + { "type": "SAM.Analytical.ApertureParameter", "prefix": "ApertureParameter" }, + { "type": "SAM.Analytical.ApertureConstructionParameter", "prefix": "ApertureConstructionParameter" }, + { "type": "SAM.Analytical.ConstructionParameter", "prefix": "ConstructionParameter" }, + { "type": "SAM.Analytical.PanelParameter", "prefix": "PanelParameter" }, + { "type": "SAM.Analytical.PanelType", "prefix": "PanelType" }, + { "type": "SAM.Analytical.ApertureType", "prefix": "ApertureType" }, + { "type": "SAM.Analytical.BoundaryType", "prefix": "BoundaryType" }, + { "type": "SAM.Analytical.OpaqueMaterialParameter", "prefix": "OpaqueMaterialParameter" }, + { "type": "SAM.Analytical.TransparentMaterialParameter", "prefix": "TransparentMaterialParameter" }, + { "type": "SAM.Analytical.GasMaterialParameter", "prefix": "GasMaterialParameter" }, + { "type": "SAM.Analytical.MaterialParameter", "prefix": "AnalyticalMaterialParameter" }, + { "type": "SAM.Analytical.AnalyticalModelParameter", "prefix": "AnalyticalModelParameter" }, + { "type": "SAM.Analytical.ZoneParameter", "prefix": "ZoneParameter" } + ], + "entries": [ + { "id": "InternalConditionParameter.Color", "unit": null, "os": "SpaceType RenderingColor", "status": "Native", "milestone": "C2", "notes": "Display colour only; no energy effect." }, + { "id": "InternalConditionParameter.AreaPerPerson", "unit": "m2/p", "os": "OS:People:Definition People per Space Floor Area", "status": "Native", "milestone": "MVP", "formula": "peoplePerArea = Analytical.Query.CalculatedPeoplePerArea(space)" }, + { "id": "InternalConditionParameter.OccupancyProfileName", "unit": null, "os": "OS:People Number of People Schedule (ScheduleFixedInterval)", "status": "Native", "milestone": "MVP", "diagnostic": "SAM-OS-SCH-001 error when gains exist but profile unresolved; load skipped" }, + { "id": "InternalConditionParameter.OccupancySensibleGainPerPerson", "unit": "W/p", "os": "OS:People:Definition Sensible Heat Fraction + constant ActivityLevel schedule", "status": "Derived", "milestone": "MVP", "formula": "sensibleFraction = S/(S+L); activityLevel = OccupancyGain/CalculatedOccupancy [W/p]" }, + { "id": "InternalConditionParameter.OccupancyLatentGainPerPerson", "unit": "W/p", "os": "OS:People:Definition Sensible Heat Fraction (complement) + ActivityLevel schedule", "status": "Derived", "milestone": "MVP", "formula": "latent = activityLevel * (1 - sensibleFraction)" }, + { "id": "InternalConditionParameter.EquipmentSensibleProfileName", "unit": null, "os": "OS:ElectricEquipment Schedule (sensible instance)", "status": "Native", "milestone": "MVP", "diagnostic": "SAM-OS-SCH-001 error when gains exist but profile unresolved" }, + { "id": "InternalConditionParameter.EquipmentSensibleGain", "unit": "W", "os": "OS:ElectricEquipment:Definition Watts per Space Floor Area (sensible instance)", "status": "Derived", "milestone": "MVP", "formula": "W/m2 = CalculatedEquipmentSensibleGain(space)/SpaceParameter.Area" }, + { "id": "InternalConditionParameter.EquipmentSensibleGainPerArea", "unit": "W/m2", "os": "OS:ElectricEquipment:Definition Watts per Space Floor Area (sensible instance)", "status": "Native", "milestone": "MVP" }, + { "id": "InternalConditionParameter.EquipmentSensibleGainPerPerson", "unit": "W/p", "os": "OS:ElectricEquipment:Definition Watts per Space Floor Area (sensible instance)", "status": "Derived", "milestone": "MVP", "formula": "folded through Analytical.Query.CalculatedEquipmentSensibleGain(space)" }, + { "id": "InternalConditionParameter.EquipmentLatentProfileName", "unit": null, "os": "OS:ElectricEquipment Schedule (dedicated latent instance)", "status": "Native", "milestone": "C2", "diagnostic": "SAM-OS-SCH-001 error when latent gains exist but profile unresolved" }, + { "id": "InternalConditionParameter.EquipmentLatentGain", "unit": "W", "os": "OS:ElectricEquipment:Definition (latent instance, Fraction Latent = 1)", "status": "Derived", "milestone": "C2", "formula": "W/m2 = CalculatedEquipmentLatentGain(space)/SpaceParameter.Area; separate instance so sensible/latent keep independent profiles" }, + { "id": "InternalConditionParameter.EquipmentLatentGainPerArea", "unit": "W/m2", "os": "OS:ElectricEquipment:Definition (latent instance, Fraction Latent = 1)", "status": "Native", "milestone": "C2" }, + { "id": "InternalConditionParameter.LightingGainPerArea", "unit": "W/m2", "os": "OS:Lights:Definition Watts per Space Floor Area", "status": "Native", "milestone": "MVP" }, + { "id": "InternalConditionParameter.LightingGainPerPerson", "unit": "W/p", "os": "OS:Lights:Definition Watts per Space Floor Area", "status": "Derived", "milestone": "MVP", "formula": "folded through Analytical.Query.CalculatedLightingGain(space)" }, + { "id": "InternalConditionParameter.LightingGain", "unit": "W", "os": "OS:Lights:Definition Watts per Space Floor Area", "status": "Derived", "milestone": "MVP", "formula": "W/m2 = CalculatedLightingGain(space)/SpaceParameter.Area" }, + { "id": "InternalConditionParameter.LightingLevel", "unit": "lux", "os": "OS:Lights:Definition Watts per Space Floor Area", "status": "Derived", "milestone": "MVP", "formula": "lux-based lighting gain folded through Analytical.Query.CalculatedLightingGain (with LightingEfficiency)" }, + { "id": "InternalConditionParameter.LightingProfileName", "unit": null, "os": "OS:Lights Schedule", "status": "Native", "milestone": "MVP", "diagnostic": "SAM-OS-SCH-001 error when gains exist but profile unresolved" }, + { "id": "InternalConditionParameter.LightingEfficiency", "unit": "W/m2/100lux", "os": "OS:Lights:Definition Watts per Space Floor Area", "status": "Derived", "milestone": "MVP", "formula": "with LightingLevel through CalculatedLightingGain" }, + { "id": "InternalConditionParameter.InfiltrationAirChangesPerHour", "unit": "ACH", "os": "OS:SpaceInfiltration:DesignFlowRate Air Changes per Hour", "status": "Native", "milestone": "C2", "notes": "MVP approximated as Flow per Exterior Surface Area; C2 uses the native ACH field." }, + { "id": "InternalConditionParameter.InfiltrationProfileName", "unit": null, "os": "OS:SpaceInfiltration:DesignFlowRate Schedule", "status": "Native", "milestone": "MVP", "diagnostic": "SAM-OS-SCH-001 error when infiltration exists but profile unresolved" }, + { "id": "InternalConditionParameter.PollutantGenerationPerPerson", "unit": "g/h/p", "os": null, "status": "Unsupported", "milestone": "C2", "diagnostic": "SAM-OS-IC-001 warning; EnergyPlus generic contaminant modelling out of scope" }, + { "id": "InternalConditionParameter.PollutantGenerationPerArea", "unit": "g/h/m2", "os": null, "status": "Unsupported", "milestone": "C2", "diagnostic": "SAM-OS-IC-001 warning" }, + { "id": "InternalConditionParameter.PollutantProfileName", "unit": null, "os": null, "status": "Unsupported", "milestone": "C2", "diagnostic": "SAM-OS-IC-001 warning" }, + { "id": "InternalConditionParameter.HeatingEmitterRadiantProportion", "unit": "0-1", "os": null, "status": "Deferred", "milestone": "C2", "diagnostic": "SAM-OS-HVAC-001 info; Ideal Loads is a convective air system - emitter characteristics need detailed HVAC" }, + { "id": "InternalConditionParameter.HeatingEmitterCoefficient", "unit": "0-1", "os": null, "status": "Deferred", "milestone": "C2", "diagnostic": "SAM-OS-HVAC-001 info" }, + { "id": "InternalConditionParameter.HeatingProfileName", "unit": null, "os": "OS:ThermostatSetpoint:DualSetpoint Heating Setpoint Schedule", "status": "Native", "milestone": "MVP" }, + { "id": "InternalConditionParameter.CoolingEmitterRadiantProportion", "unit": "0-1", "os": null, "status": "Deferred", "milestone": "C2", "diagnostic": "SAM-OS-HVAC-001 info" }, + { "id": "InternalConditionParameter.CoolingEmitterCoefficient", "unit": "0-1", "os": null, "status": "Deferred", "milestone": "C2", "diagnostic": "SAM-OS-HVAC-001 info" }, + { "id": "InternalConditionParameter.CoolingProfileName", "unit": null, "os": "OS:ThermostatSetpoint:DualSetpoint Cooling Setpoint Schedule", "status": "Native", "milestone": "MVP" }, + { "id": "InternalConditionParameter.HumidificationProfileName", "unit": null, "os": "OS:ZoneControl:Humidistat Humidifying Relative Humidity Schedule + IdealLoads Humidification Control Type Humidistat", "status": "Native", "milestone": "C2", "diagnostic": "SAM-OS-SCH-001 error when named but unresolved" }, + { "id": "InternalConditionParameter.DehumidificationProfileName", "unit": null, "os": "OS:ZoneControl:Humidistat Dehumidifying Relative Humidity Schedule + IdealLoads Dehumidification Control Type Humidistat", "status": "Native", "milestone": "C2", "diagnostic": "SAM-OS-SCH-001 error when named but unresolved" }, + { "id": "InternalConditionParameter.VentilationSystemTypeName", "unit": null, "os": null, "status": "Deferred", "milestone": "C2", "notes": "System identity feeds conditioned-space classification (Query.IsConditioned); equipment itself is detailed HVAC." }, + { "id": "InternalConditionParameter.CoolingSystemTypeName", "unit": null, "os": null, "status": "Deferred", "milestone": "C2", "notes": "Informs IsConditioned classification." }, + { "id": "InternalConditionParameter.HeatingSystemTypeName", "unit": null, "os": null, "status": "Deferred", "milestone": "C2", "notes": "Informs IsConditioned classification." }, + { "id": "InternalConditionParameter.SupplyAirFlowPerPerson", "unit": "m3/s/p", "os": "OS:DesignSpecification:OutdoorAir Outdoor Air Flow per Person (method Sum)", "status": "Native", "milestone": "C2" }, + { "id": "InternalConditionParameter.ExhaustAirFlowPerPerson", "unit": "m3/s/p", "os": null, "status": "Deferred", "milestone": "C2", "diagnostic": "SAM-OS-HVAC-001 info; exhaust flows need fan/air-loop equipment" }, + { "id": "InternalConditionParameter.SupplyAirChangesPerHour", "unit": "ACH", "os": "OS:DesignSpecification:OutdoorAir Air Changes per Hour (method Sum)", "status": "Native", "milestone": "C2" }, + { "id": "InternalConditionParameter.ExhaustAirChangesPerHour", "unit": "ACH", "os": null, "status": "Deferred", "milestone": "C2", "diagnostic": "SAM-OS-HVAC-001 info" }, + { "id": "InternalConditionParameter.SupplyAirFlowPerArea", "unit": "m3/s/m2", "os": "OS:DesignSpecification:OutdoorAir Outdoor Air Flow per Floor Area (method Sum)", "status": "Native", "milestone": "C2" }, + { "id": "InternalConditionParameter.ExhaustAirFlowPerArea", "unit": "m3/s/m2", "os": null, "status": "Deferred", "milestone": "C2", "diagnostic": "SAM-OS-HVAC-001 info" }, + { "id": "InternalConditionParameter.SupplyAirFlow", "unit": "m3/s", "os": "OS:DesignSpecification:OutdoorAir Outdoor Air Flow Rate (method Sum)", "status": "Native", "milestone": "C2", "notes": "SpaceParameter.OutsideSupplyAirFlow takes precedence when present (space override)." }, + { "id": "InternalConditionParameter.ExhaustAirFlow", "unit": "m3/s", "os": null, "status": "Deferred", "milestone": "C2", "diagnostic": "SAM-OS-HVAC-001 info" }, + { "id": "InternalConditionParameter.VentilationProfileName", "unit": null, "os": "OS:DesignSpecification:OutdoorAir Outdoor Air Schedule", "status": "Native", "milestone": "C2", "diagnostic": "SAM-OS-SCH-001 error when named but unresolved" }, + { "id": "InternalConditionParameter.LightingRadiantProportion", "unit": "0-1", "os": "OS:Lights:Definition Fraction Radiant", "status": "Native", "milestone": "MVP", "notes": "Documented default 0.32 when absent." }, + { "id": "InternalConditionParameter.OccupancyRadiantProportion", "unit": "0-1", "os": "OS:People:Definition Fraction Radiant", "status": "Native", "milestone": "MVP", "notes": "Documented default 0.3 when absent." }, + { "id": "InternalConditionParameter.EquipmentRadiantProportion", "unit": "0-1", "os": "OS:ElectricEquipment:Definition Fraction Radiant", "status": "Native", "milestone": "MVP", "notes": "Documented default 0 when absent." }, + { "id": "InternalConditionParameter.LightingViewCoefficient", "unit": "0-1", "os": "OS:Lights:Definition Fraction Visible", "status": "Approximated", "milestone": "MVP", "notes": "TAS view coefficient mapped to EnergyPlus visible fraction; documented default 0.25 when absent." }, + { "id": "InternalConditionParameter.OccupancyViewCoefficient", "unit": "0-1", "os": null, "status": "Unsupported", "milestone": "C2", "diagnostic": "SAM-OS-IC-001 info; OS:People has no visible-fraction field" }, + { "id": "InternalConditionParameter.EquipmentViewCoefficient", "unit": "0-1", "os": null, "status": "Unsupported", "milestone": "C2", "diagnostic": "SAM-OS-IC-001 info; OS:ElectricEquipment has no visible-fraction field" }, + { "id": "InternalConditionParameter.LightingControlFunction", "unit": null, "os": null, "status": "Unsupported", "milestone": "C2", "diagnostic": "SAM-OS-IC-001 info; TAS control function string has no deterministic daylighting-control mapping" }, + { "id": "InternalConditionParameter.VentilationFunction", "unit": null, "os": null, "status": "Unsupported", "milestone": "C2", "diagnostic": "SAM-OS-IC-001 info; TAS function expression" }, + { "id": "InternalConditionParameter.VentilationFunctionFactor", "unit": null, "os": null, "status": "Unsupported", "milestone": "C2", "diagnostic": "SAM-OS-IC-001 info" }, + { "id": "InternalConditionParameter.VentilationFunctionSetback", "unit": null, "os": null, "status": "Unsupported", "milestone": "C2", "diagnostic": "SAM-OS-IC-001 info" }, + { "id": "InternalConditionParameter.VentilationFunctionDescription", "unit": null, "os": null, "status": "NA", "milestone": "C0", "notes": "Documentation string." }, + { "id": "InternalConditionParameter.NCMData", "unit": null, "os": null, "status": "NA", "milestone": "C0", "notes": "UK NCM compliance metadata; no thermal semantics." }, + { "id": "InternalConditionParameter.Description", "unit": null, "os": null, "status": "NA", "milestone": "C0", "notes": "Metadata." }, + + { "id": "SpaceParameter.Color", "unit": null, "os": null, "status": "NA", "milestone": "C0", "notes": "Display colour; SpaceType rendering colour covers presentation." }, + { "id": "SpaceParameter.DesignHeatingLoad", "unit": "W", "os": null, "status": "NA", "milestone": "C0", "notes": "Result slot written back by C5 result mapping, not a translation input." }, + { "id": "SpaceParameter.DesignCoolingLoad", "unit": "W", "os": null, "status": "NA", "milestone": "C0", "notes": "Result slot written back by C5 result mapping." }, + { "id": "SpaceParameter.Volume", "unit": "m3", "os": "load derivations (ACH -> flow); OpenStudio computes zone volume from geometry", "status": "Derived", "milestone": "MVP", "formula": "infiltrationFlow [m3/s] = InfiltrationAirChangesPerHour * Volume / 3600 (Analytical.Query.CalculatedInfiltrationAirFlow)" }, + { "id": "SpaceParameter.Area", "unit": "m2", "os": "density denominators for W and W/p bases", "status": "Derived", "milestone": "MVP", "formula": "W/m2 = CalculatedXGain(space) / SpaceParameter.Area for absolute (W) and per-person (W/p) bases" }, + { "id": "SpaceParameter.Occupancy", "unit": "p", "os": "OS:People:Definition People per Space Floor Area", "status": "Derived", "milestone": "MVP", "formula": "peoplePerArea = CalculatedOccupancy/Area (space override wins over AreaPerPerson)" }, + { "id": "SpaceParameter.FacingExternal", "unit": null, "os": null, "status": "NA", "milestone": "C0", "notes": "Derived classification; OpenStudio derives exposure from geometry and boundary conditions." }, + { "id": "SpaceParameter.FacingExternalGlazing", "unit": null, "os": null, "status": "NA", "milestone": "C0", "notes": "Derived classification." }, + { "id": "SpaceParameter.LevelName", "unit": null, "os": "OS:BuildingStory assignment/naming fallback", "status": "Derived", "milestone": "C1", "notes": "Used by the story fallback when no floor-group panels exist." }, + { "id": "SpaceParameter.CoolingSizingFactor", "unit": null, "os": "OS:Sizing:Zone Cooling Sizing Factor", "status": "Native", "milestone": "C4", "notes": "Effective only when sizing runs are enabled." }, + { "id": "SpaceParameter.HeatingSizingFactor", "unit": null, "os": "OS:Sizing:Zone Heating Sizing Factor", "status": "Native", "milestone": "C4" }, + { "id": "SpaceParameter.VentilationRiserName", "unit": null, "os": null, "status": "Deferred", "milestone": "C0", "notes": "Distribution identity; detailed HVAC." }, + { "id": "SpaceParameter.HeatingRiserName", "unit": null, "os": null, "status": "Deferred", "milestone": "C0" }, + { "id": "SpaceParameter.CoolingRiserName", "unit": null, "os": null, "status": "Deferred", "milestone": "C0" }, + { "id": "SpaceParameter.OutsideSupplyAirFlow", "unit": "m3/s", "os": "OS:DesignSpecification:OutdoorAir Outdoor Air Flow Rate (per-space)", "status": "Native", "milestone": "MVP", "notes": "Space-level override; takes precedence over InternalCondition supply values (C2)." }, + { "id": "SpaceParameter.SupplyAirFlow", "unit": "m3/s", "os": null, "status": "Deferred", "milestone": "C0", "notes": "Total supply air is system equipment; Ideal Loads sizes its own supply." }, + { "id": "SpaceParameter.ExhaustAirFlow", "unit": "m3/s", "os": null, "status": "Deferred", "milestone": "C0" }, + { "id": "SpaceParameter.DaylightFactor", "unit": null, "os": null, "status": "NA", "milestone": "C0", "notes": "Result-style metric; no translation input." }, + { "id": "SpaceParameter.PartFSpaceData", "unit": null, "os": null, "status": "NA", "milestone": "C0", "notes": "UK Part F compliance metadata." }, + + { "id": "ProfileType.Undefined", "unit": null, "os": null, "status": "NA", "milestone": "C0", "notes": "Never bound to a load slot; unresolved profile references raise SAM-OS-SCH-001." }, + { "id": "ProfileType.Occupancy", "unit": "fraction", "os": "ScheduleFixedInterval (Fractional limits)", "status": "Native", "milestone": "MVP" }, + { "id": "ProfileType.EquipmentSensible", "unit": "fraction", "os": "ScheduleFixedInterval (Fractional limits)", "status": "Native", "milestone": "MVP" }, + { "id": "ProfileType.EquipmentLatent", "unit": "fraction", "os": "ScheduleFixedInterval (Fractional limits) on latent equipment instance", "status": "Native", "milestone": "C2" }, + { "id": "ProfileType.Lighting", "unit": "fraction", "os": "ScheduleFixedInterval (Fractional limits)", "status": "Native", "milestone": "MVP" }, + { "id": "ProfileType.Infiltration", "unit": "fraction", "os": "ScheduleFixedInterval (Fractional limits)", "status": "Native", "milestone": "MVP" }, + { "id": "ProfileType.Pollutant", "unit": null, "os": null, "status": "Unsupported", "milestone": "C2", "diagnostic": "SAM-OS-IC-001 warning when referenced" }, + { "id": "ProfileType.Heating", "unit": "C", "os": "ScheduleFixedInterval (Temperature limits)", "status": "Native", "milestone": "MVP" }, + { "id": "ProfileType.Cooling", "unit": "C", "os": "ScheduleFixedInterval (Temperature limits)", "status": "Native", "milestone": "MVP" }, + { "id": "ProfileType.Humidification", "unit": "%RH", "os": "ScheduleFixedInterval (Percent limits) on ZoneControl:Humidistat", "status": "Native", "milestone": "C2" }, + { "id": "ProfileType.Dehumidification", "unit": "%RH", "os": "ScheduleFixedInterval (Percent limits) on ZoneControl:Humidistat", "status": "Native", "milestone": "C2" }, + { "id": "ProfileType.Ventilation", "unit": "fraction", "os": "ScheduleFixedInterval (Fractional limits) on DesignSpecification:OutdoorAir", "status": "Native", "milestone": "C2" }, + { "id": "ProfileType.Other", "unit": null, "os": null, "status": "NA", "milestone": "C0", "notes": "No load slot binds ProfileType.Other." }, + + { "id": "Profile.HourlyAnnualValues", "unit": null, "os": "ScheduleFixedInterval, 8760 hourly values", "status": "Native", "milestone": "MVP" }, + { "id": "Profile.WeeklyDayComposition", "unit": null, "os": "ScheduleFixedInterval via 7 day-vectors rotated by run-calendar first day of week", "status": "Native", "milestone": "MVP" }, + { "id": "Profile.ValuesBeyond8760", "unit": null, "os": "first 8760 values used on non-leap run calendars", "status": "Approximated", "milestone": "MVP", "diagnostic": "SAM-OS-SCH-001 warning (documented truncation policy)" }, + { "id": "Profile.LeapYear8784", "unit": null, "os": "ScheduleFixedInterval, 8784 values when the run calendar is a leap year", "status": "Derived", "milestone": "C4", "formula": "explicit >=8784 stores pass through; day-composed/cyclic profiles tile to 8784" }, + { "id": "Profile.SubhourlyValues", "unit": null, "os": null, "status": "NA", "milestone": "C0", "notes": "SAM Profile stores are hour-indexed (SortedList); no subhourly source data exists." }, + { "id": "Profile.FractionOutOfRange", "unit": null, "os": "kept as-authored", "status": "Native", "milestone": "MVP", "diagnostic": "SAM-OS-SCH-001 warning; values never clamped" }, + { "id": "Profile.MissingOrNaNValues", "unit": null, "os": null, "status": "Native", "milestone": "MVP", "diagnostic": "SAM-OS-SCH-001 error; schedule not created, never substituted" }, + + { "id": "ApertureParameter.ThermalTransmittance", "unit": "W/m2K", "os": "OS:WindowMaterial:SimpleGlazingSystem U-Factor (fallback when no pane layers)", "status": "Approximated", "milestone": "C3", "diagnostic": "SAM-OS-CON-001 info when fallback used" }, + { "id": "ApertureParameter.LightTransmittance", "unit": "0-1", "os": "OS:WindowMaterial:SimpleGlazingSystem Visible Transmittance (fallback)", "status": "Approximated", "milestone": "C3", "formula": "aperture-level value takes precedence over ApertureConstructionParameter.LightTransmittance in the no-pane-layer SimpleGlazing fallback" }, + { "id": "ApertureParameter.LightReflectance", "unit": "0-1", "os": null, "status": "NA", "milestone": "C0", "notes": "Pane layers govern optics; SimpleGlazing fallback has no reflectance field." }, + { "id": "ApertureParameter.DirectSolarEnergyTransmittance", "unit": "0-1", "os": null, "status": "NA", "milestone": "C0", "notes": "Layers govern; SimpleGlazing uses SHGC only." }, + { "id": "ApertureParameter.DirectSolarEnergyReflectance", "unit": "0-1", "os": null, "status": "NA", "milestone": "C0" }, + { "id": "ApertureParameter.DirectSolarEnergyAbsorptance", "unit": "0-1", "os": null, "status": "NA", "milestone": "C0" }, + { "id": "ApertureParameter.TotalSolarEnergyTransmittance", "unit": "0-1", "os": "OS:WindowMaterial:SimpleGlazingSystem SHGC (fallback when no pane layers)", "status": "Approximated", "milestone": "C3", "formula": "aperture-level value takes precedence over ApertureConstructionParameter.TotalSolarEnergyTransmittance in the SimpleGlazing fallback" }, + { "id": "ApertureParameter.PilkingtonShadingShortWavelengthCoefficient", "unit": null, "os": null, "status": "NA", "milestone": "C0", "notes": "Manufacturer shading coefficient; no EnergyPlus slot." }, + { "id": "ApertureParameter.PilkingtonShadingLongWavelengthCoefficient", "unit": null, "os": null, "status": "NA", "milestone": "C0" }, + { "id": "ApertureParameter.OpeningProperties", "unit": null, "os": null, "status": "Unsupported", "milestone": "C3", "diagnostic": "SAM-OS-CON-002 info; openable fraction/discharge coefficient need AirflowNetwork or ZoneVentilation (deferred HVAC domain)" }, + { "id": "ApertureParameter.Color", "unit": null, "os": null, "status": "NA", "milestone": "C0", "notes": "Display colour." }, + { "id": "ApertureParameter.FeatureShade", "unit": null, "os": null, "status": "Unsupported", "milestone": "C3", "diagnostic": "SAM-OS-CON-002 info; no slat/shade geometry in SAM to build WindowMaterial:Blind or WindowShadingControl" }, + + { "id": "ApertureConstructionParameter.DefaultPanelType", "unit": null, "os": "informs host typing", "status": "Derived", "milestone": "MVP", "notes": "Classification input consumed by SAM panel typing upstream of conversion; no direct OpenStudio field." }, + { "id": "ApertureConstructionParameter.Description", "unit": null, "os": null, "status": "NA", "milestone": "C0" }, + { "id": "ApertureConstructionParameter.Transparent", "unit": null, "os": "SubSurface type classification (Window/Door/GlassDoor)", "status": "Derived", "milestone": "MVP", "formula": "pane material family decides: Door + transparent -> GlassDoor; Window + opaque -> Door (Query/SubSurfaceType.cs)" }, + { "id": "ApertureConstructionParameter.Color", "unit": null, "os": null, "status": "NA", "milestone": "C0" }, + { "id": "ApertureConstructionParameter.DefaultFrameWidth", "unit": "m", "os": "OS:WindowProperty:FrameAndDivider Frame Width", "status": "Native", "milestone": "C3" }, + { "id": "ApertureConstructionParameter.IsInternalShadow", "unit": null, "os": null, "status": "Unsupported", "milestone": "C3", "diagnostic": "SAM-OS-CON-002 info; TAS internal-shadow flag has no deterministic mapping" }, + { "id": "ApertureConstructionParameter.LightTransmittance", "unit": "0-1", "os": "OS:WindowMaterial:SimpleGlazingSystem Visible Transmittance (fallback)", "status": "Approximated", "milestone": "C3", "formula": "SimpleGlazing fallback VT when no pane layers; SAM-OS-CON-001 info when the fallback is used" }, + { "id": "ApertureConstructionParameter.TotalSolarEnergyTransmittance", "unit": "0-1", "os": "OS:WindowMaterial:SimpleGlazingSystem SHGC (fallback)", "status": "Approximated", "milestone": "C3", "formula": "SimpleGlazing fallback SHGC when no pane layers" }, + { "id": "ApertureConstructionParameter.ThermalTransmittance", "unit": "W/m2K", "os": "OS:WindowMaterial:SimpleGlazingSystem U-Factor (fallback)", "status": "Approximated", "milestone": "C3", "formula": "SimpleGlazing fallback U-Factor when no pane layers; SAM-OS-CON-001 info when the fallback is used" }, + { "id": "ApertureConstructionParameter.PaneAdditionalHeatTransfer", "unit": "%", "os": null, "status": "Unsupported", "milestone": "C3", "diagnostic": "SAM-OS-CON-002 info; TAS percentage U-adjustment has no safe layer-level equivalent" }, + { "id": "ApertureConstructionParameter.FrameAdditionalHeatTransfer", "unit": "%", "os": null, "status": "Unsupported", "milestone": "C3", "diagnostic": "SAM-OS-CON-002 info" }, + + { "id": "ApertureConstruction.PaneConstructionLayers", "unit": null, "os": "OS:Construction of glazing/gas layers (FenestrationConstruction usage)", "status": "Native", "milestone": "MVP" }, + { "id": "ApertureConstruction.FrameConstructionLayers", "unit": null, "os": "OS:WindowProperty:FrameAndDivider (width, conductance, absorptances derived from layers)", "status": "Approximated", "milestone": "C3", "formula": "frame U = 1/sum(thickness_i/conductivity_i); width = DefaultFrameWidth else outermost frame layer thickness; solar/visible absorptance = 1 - External*Reflectance of frame material", "diagnostic": "SAM-OS-CON-002 warning on invalid frame data; frameless fallback" }, + { "id": "Aperture.PaneFrameGeometry", "unit": null, "os": "SubSurface polygon reduced to pane; frame width grows outward (EnergyPlus convention)", "status": "Approximated", "milestone": "C3", "formula": "area conservation validated: |aperture| ~= |pane| + |frame|; pane stays inside host; invalid inset -> frameless fallback + SAM-OS-CON-002 warning" }, + { "id": "Aperture.InternalPairing", "unit": null, "os": "SubSurface setAdjacentSubSurface", "status": "Native", "milestone": "MVP" }, + { "id": "ApertureType.Undefined", "unit": null, "os": "SubSurface type via construction/material family", "status": "Derived", "milestone": "MVP", "formula": "pane material family decides FixedWindow vs Door (Query/SubSurfaceType.cs)" }, + { "id": "ApertureType.Window", "unit": null, "os": "SubSurface FixedWindow", "status": "Native", "milestone": "MVP" }, + { "id": "ApertureType.Door", "unit": null, "os": "SubSurface Door (opaque) / GlassDoor (transparent)", "status": "Native", "milestone": "MVP" }, + + { "id": "ConstructionParameter.DefaultPanelType", "unit": null, "os": "informs panel typing", "status": "Derived", "milestone": "MVP", "notes": "Classification input consumed by SAM panel typing upstream of conversion; no direct OpenStudio field." }, + { "id": "ConstructionParameter.Description", "unit": null, "os": null, "status": "NA", "milestone": "C0" }, + { "id": "ConstructionParameter.Color", "unit": null, "os": null, "status": "NA", "milestone": "C0" }, + { "id": "ConstructionParameter.IsAir", "unit": null, "os": "OS:Construction:AirBoundary", "status": "Native", "milestone": "C1", "notes": "PanelType.Air handled in MVP; C1 verifies the construction-level IsAir flag reaches the same path." }, + { "id": "ConstructionParameter.IsGround", "unit": null, "os": "Ground outside boundary condition", "status": "Derived", "milestone": "MVP", "notes": "Ground contact primarily driven by PanelType (SlabOnGrade/Underground*)." }, + { "id": "ConstructionParameter.IsInternalShadow", "unit": null, "os": null, "status": "Unsupported", "milestone": "C3", "diagnostic": "SAM-OS-CON-002 info" }, + { "id": "ConstructionParameter.Transparent", "unit": null, "os": "ReplaceTransparentPanels preprocessing (panel -> aperture)", "status": "Derived", "milestone": "MVP", "notes": "Classification input consumed upstream of conversion (material family of layers governs)." }, + { "id": "ConstructionParameter.DefaultThickness", "unit": "m", "os": "layer thickness fallback", "status": "Native", "milestone": "MVP", "diagnostic": "SAM-OS-CON-001 warning when fallback used" }, + { "id": "ConstructionParameter.LightTransmittance", "unit": "0-1", "os": null, "status": "NA", "milestone": "C0", "notes": "Performance descriptor; layers govern. Constructions without layers raise SAM-OS-CON-001 error." }, + { "id": "ConstructionParameter.TotalSolarEnergyTransmittance", "unit": "0-1", "os": null, "status": "NA", "milestone": "C0" }, + { "id": "ConstructionParameter.ThermalTransmittance", "unit": "W/m2K", "os": null, "status": "NA", "milestone": "C0", "notes": "No opaque no-mass fallback is fabricated; missing layers are an explicit error." }, + { "id": "Construction.LayerOrderInsideToOutside", "unit": null, "os": "OS:Construction layers outside-first; forward/reverse variants per internal pair side", "status": "Native", "milestone": "MVP", "notes": "Mirrored internal-pair orientation is valid and must not be changed." }, + + { "id": "PanelParameter.Transparent", "unit": null, "os": "ReplaceTransparentPanels preprocessing", "status": "Derived", "milestone": "MVP", "notes": "Classification input consumed upstream of conversion; transparent panels are replaced by apertures in preprocessing." }, + { "id": "PanelParameter.Color", "unit": null, "os": null, "status": "NA", "milestone": "C0" }, + { "id": "PanelParameter.ThermalTransmittance", "unit": "W/m2K", "os": null, "status": "NA", "milestone": "C0", "notes": "Performance descriptor; construction layers govern." }, + { "id": "PanelParameter.LightTransmittance", "unit": "0-1", "os": null, "status": "NA", "milestone": "C0" }, + { "id": "PanelParameter.LightReflectance", "unit": "0-1", "os": null, "status": "NA", "milestone": "C0" }, + { "id": "PanelParameter.DirectSolarEnergyTransmittance", "unit": "0-1", "os": null, "status": "NA", "milestone": "C0" }, + { "id": "PanelParameter.DirectSolarEnergyReflectance", "unit": "0-1", "os": null, "status": "NA", "milestone": "C0" }, + { "id": "PanelParameter.DirectSolarEnergyAbsorptance", "unit": "0-1", "os": null, "status": "NA", "milestone": "C0" }, + { "id": "PanelParameter.TotalSolarEnergyTransmittance", "unit": "0-1", "os": null, "status": "NA", "milestone": "C0" }, + { "id": "PanelParameter.PilkingtonShadingShortWavelengthCoefficient", "unit": null, "os": null, "status": "NA", "milestone": "C0" }, + { "id": "PanelParameter.PilkingtonShadingLongWavelengthCoefficient", "unit": null, "os": null, "status": "NA", "milestone": "C0" }, + { "id": "PanelParameter.Adiabatic", "unit": null, "os": "Adiabatic outside boundary condition", "status": "Native", "milestone": "C1", "notes": "C1 verifies the flag is honoured by OutsideBoundaryCondition." }, + { "id": "PanelParameter.FeatureShade", "unit": null, "os": null, "status": "Unsupported", "milestone": "C3", "diagnostic": "SAM-OS-CON-002 info" }, + { "id": "Panel.InternalEdgeHoles", "unit": null, "os": null, "status": "Unsupported", "milestone": "C3", "diagnostic": "SAM-OS-GEO-001 warning with panel GUID and hole geometry summary (count, per-hole and total area); holes are never fabricated into windows" }, + + { "id": "PanelType.Undefined", "unit": null, "os": "surface type from normal orientation", "status": "Derived", "milestone": "MVP", "formula": "surface typing falls back to orientation/adjacency rules (Query/SurfaceType.cs, OutsideBoundaryCondition.cs)" }, + { "id": "PanelType.Ceiling", "unit": null, "os": "Surface RoofCeiling, internal adjacency", "status": "Native", "milestone": "MVP" }, + { "id": "PanelType.CurtainWall", "unit": null, "os": "Wall + transparent replacement preprocessing", "status": "Native", "milestone": "MVP" }, + { "id": "PanelType.Floor", "unit": null, "os": "Surface Floor", "status": "Native", "milestone": "MVP" }, + { "id": "PanelType.FloorExposed", "unit": null, "os": "Floor, Outdoors exposure", "status": "Native", "milestone": "MVP" }, + { "id": "PanelType.FloorInternal", "unit": null, "os": "Floor, internal adjacency", "status": "Native", "milestone": "MVP" }, + { "id": "PanelType.FloorRaised", "unit": null, "os": "Floor, Outdoors exposure", "status": "Native", "milestone": "MVP" }, + { "id": "PanelType.Roof", "unit": null, "os": "Surface RoofCeiling, Outdoors + sun/wind", "status": "Native", "milestone": "MVP" }, + { "id": "PanelType.Shade", "unit": null, "os": "OS:ShadingSurface in building-level group", "status": "Native", "milestone": "MVP" }, + { "id": "PanelType.SlabOnGrade", "unit": null, "os": "Floor, Ground boundary", "status": "Native", "milestone": "MVP" }, + { "id": "PanelType.SolarPanel", "unit": null, "os": "OS:ShadingSurface (geometry only)", "status": "Approximated", "milestone": "C3", "diagnostic": "SAM-OS-GEO-002 info; PV generation is not modelled" }, + { "id": "PanelType.UndergroundCeiling", "unit": null, "os": "RoofCeiling, Ground boundary", "status": "Native", "milestone": "MVP" }, + { "id": "PanelType.UndergroundSlab", "unit": null, "os": "Floor, Ground boundary", "status": "Native", "milestone": "MVP" }, + { "id": "PanelType.UndergroundWall", "unit": null, "os": "Wall, Ground boundary", "status": "Native", "milestone": "MVP" }, + { "id": "PanelType.Wall", "unit": null, "os": "Surface Wall", "status": "Native", "milestone": "MVP" }, + { "id": "PanelType.WallExternal", "unit": null, "os": "Wall, Outdoors + sun/wind", "status": "Native", "milestone": "MVP" }, + { "id": "PanelType.WallInternal", "unit": null, "os": "Wall, internal adjacency", "status": "Native", "milestone": "MVP" }, + { "id": "PanelType.Air", "unit": null, "os": "OS:Construction:AirBoundary", "status": "Native", "milestone": "MVP" }, + + { "id": "BoundaryType.Undefined", "unit": null, "os": null, "status": "NA", "milestone": "C0", "notes": "Resolved through PanelType mapping." }, + { "id": "BoundaryType.Ground", "unit": null, "os": "Ground outside boundary condition", "status": "Native", "milestone": "MVP" }, + { "id": "BoundaryType.Exposed", "unit": null, "os": "Outdoors + SunExposed/WindExposed", "status": "Native", "milestone": "MVP" }, + { "id": "BoundaryType.Adiabatic", "unit": null, "os": "Adiabatic outside boundary condition", "status": "Native", "milestone": "MVP" }, + { "id": "BoundaryType.Linked", "unit": null, "os": "Surface adjacency (setAdjacentSurface)", "status": "Native", "milestone": "MVP" }, + { "id": "BoundaryType.Shade", "unit": null, "os": "OS:ShadingSurface", "status": "Native", "milestone": "MVP" }, + + { "id": "Material.ThermalConductivity", "unit": "W/mK", "os": "OS:Material Conductivity / StandardGlazing Conductivity", "status": "Native", "milestone": "MVP", "diagnostic": "SAM-OS-MAT-001 error on non-positive values" }, + { "id": "Material.Density", "unit": "kg/m3", "os": "OS:Material Density", "status": "Native", "milestone": "MVP" }, + { "id": "Material.SpecificHeatCapacity", "unit": "J/kgK", "os": "OS:Material Specific Heat", "status": "Native", "milestone": "MVP" }, + { "id": "CoreMaterialParameter.DefaultThickness", "unit": "m", "os": "layer thickness fallback", "status": "Native", "milestone": "MVP", "diagnostic": "SAM-OS-CON-001 warning when used" }, + { "id": "AnalyticalMaterialParameter.VapourDiffusionFactor", "unit": null, "os": null, "status": "Unsupported", "milestone": "C3", "diagnostic": "SAM-OS-MAT-002 info; EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry" }, + + { "id": "OpaqueMaterialParameter.ExternalEmissivity", "unit": "0-1", "os": "OS:Material Thermal Absorptance", "status": "Native", "milestone": "MVP" }, + { "id": "OpaqueMaterialParameter.ExternalLightReflectance", "unit": "0-1", "os": "OS:Material Visible Absorptance = 1 - reflectance", "status": "Native", "milestone": "MVP" }, + { "id": "OpaqueMaterialParameter.ExternalSolarReflectance", "unit": "0-1", "os": "OS:Material Solar Absorptance = 1 - reflectance", "status": "Native", "milestone": "MVP" }, + { "id": "OpaqueMaterialParameter.IgnoreThermalTransmittanceCalculations", "unit": null, "os": null, "status": "NA", "milestone": "C0", "notes": "TAS calculation flag." }, + { "id": "OpaqueMaterialParameter.InternalEmissivity", "unit": "0-1", "os": "same single-sided OS:Material fields as External*", "status": "Approximated", "milestone": "C3", "diagnostic": "SAM-OS-MAT-002 info when Internal differs from External; EnergyPlus opaque materials are single-sided" }, + { "id": "OpaqueMaterialParameter.InternalLightReflectance", "unit": "0-1", "os": "single-sided OS:Material", "status": "Approximated", "milestone": "C3", "notes": "OpenStudio opaque materials are single-sided; the external-side value governs both sides (documented approximation)." }, + { "id": "OpaqueMaterialParameter.InternalSolarReflectance", "unit": "0-1", "os": "single-sided OS:Material", "status": "Approximated", "milestone": "C3", "notes": "OpenStudio opaque materials are single-sided; the external-side value governs both sides (documented approximation)." }, + + { "id": "TransparentMaterialParameter.ExternalEmissivity", "unit": "0-1", "os": "StandardGlazing Front Side IR Hemispherical Emissivity", "status": "Native", "milestone": "MVP" }, + { "id": "TransparentMaterialParameter.ExternalLightReflectance", "unit": "0-1", "os": "StandardGlazing Front Side Visible Reflectance", "status": "Native", "milestone": "MVP" }, + { "id": "TransparentMaterialParameter.ExternalSolarReflectance", "unit": "0-1", "os": "StandardGlazing Front Side Solar Reflectance", "status": "Native", "milestone": "MVP" }, + { "id": "TransparentMaterialParameter.InternalEmissivity", "unit": "0-1", "os": "StandardGlazing Back Side IR Hemispherical Emissivity", "status": "Native", "milestone": "MVP" }, + { "id": "TransparentMaterialParameter.InternalLightReflectance", "unit": "0-1", "os": "StandardGlazing Back Side Visible Reflectance", "status": "Native", "milestone": "MVP" }, + { "id": "TransparentMaterialParameter.InternalSolarReflectance", "unit": "0-1", "os": "StandardGlazing Back Side Solar Reflectance", "status": "Native", "milestone": "MVP" }, + { "id": "TransparentMaterialParameter.IsBlind", "unit": null, "os": null, "status": "Unsupported", "milestone": "C3", "diagnostic": "SAM-OS-MAT-002 info; no slat geometry to build WindowMaterial:Blind" }, + { "id": "TransparentMaterialParameter.LightTransmittance", "unit": "0-1", "os": "StandardGlazing Visible Transmittance at Normal Incidence", "status": "Native", "milestone": "MVP" }, + { "id": "TransparentMaterialParameter.SolarTransmittance", "unit": "0-1", "os": "StandardGlazing Solar Transmittance at Normal Incidence", "status": "Native", "milestone": "MVP" }, + + { "id": "GasMaterialParameter.HeatTransferCoefficient", "unit": "W/m2K", "os": "OS:Material:AirGap Thermal Resistance = 1/h (opaque usage)", "status": "Native", "milestone": "MVP", "diagnostic": "SAM-OS-MAT-001 error on missing/non-finite/out-of-range values" }, + { "id": "GasMaterialParameter.DefaultGasType", "unit": null, "os": "OS:WindowMaterial:Gas Gas Type (fenestration usage; Air/Argon/Krypton/Xenon)", "status": "Native", "milestone": "MVP", "diagnostic": "SAM-OS-MAT-001 error for unsupported gas types (SulfurHexaFluoride)" }, + + { "id": "AnalyticalModelParameter.NorthAngle", "unit": "rad", "os": "OS:Building North Axis [deg]", "status": "Native", "milestone": "C4", "formula": "convention resolved against SAM_Tas/SAM_LadybugTools usage before mapping" }, + { "id": "AnalyticalModelParameter.CoolingSizingFactor", "unit": null, "os": "OS:Sizing:Parameters Cooling Sizing Factor", "status": "Native", "milestone": "C4" }, + { "id": "AnalyticalModelParameter.HeatingSizingFactor", "unit": null, "os": "OS:Sizing:Parameters Heating Sizing Factor", "status": "Native", "milestone": "C4" }, + { "id": "AnalyticalModelParameter.WeatherData", "unit": null, "os": "ground temperatures + location cross-check (EPW remains the run weather)", "status": "Derived", "milestone": "C4", "notes": "Never silently overridden by EPW values; precedence documented." }, + { "id": "AnalyticalModelParameter.HeatingDesignDays", "unit": null, "os": "OS:SizingPeriod:DesignDay (parametric fit from hourly SAM DesignDay)", "status": "Approximated", "milestone": "C4", "diagnostic": "SAM-OS-RUN-002 warning documenting the fit; downgraded to unsupported diagnostic if the fit is unsafe" }, + { "id": "AnalyticalModelParameter.CoolingDesignDays", "unit": null, "os": "OS:SizingPeriod:DesignDay (parametric fit)", "status": "Approximated", "milestone": "C4", "diagnostic": "SAM-OS-RUN-002 warning documenting the fit; downgraded to unsupported diagnostic if the fit is unsafe" }, + { "id": "AnalyticalModelParameter.CaseDataCollection", "unit": null, "os": null, "status": "NA", "milestone": "C0", "notes": "Scenario/case metadata." }, + { "id": "AnalyticalModelParameter.SolarModel", "unit": null, "os": null, "status": "NA", "milestone": "C0", "notes": "TAS solar model object; EnergyPlus solar behaviour is governed by the SolarDistribution conversion option." }, + + { "id": "ZoneParameter.Color", "unit": null, "os": null, "status": "NA", "milestone": "C0" }, + { "id": "ZoneParameter.ZoneCategory", "unit": null, "os": null, "status": "Deferred", "milestone": "C0", "notes": "SAM zone grouping is an HVAC-zoning concept; Ideal Loads keeps one thermal zone per space. C5 aggregates results per SAM zone." }, + + { "id": "Location.Latitude", "unit": "deg", "os": "OS:Site Latitude", "status": "Native", "milestone": "C4", "notes": "MVP takes EPW; C4 adds explicit-SAM-vs-EPW precedence with warning on mismatch." }, + { "id": "Location.Longitude", "unit": "deg", "os": "OS:Site Longitude", "status": "Native", "milestone": "C4" }, + { "id": "Location.Elevation", "unit": "m", "os": "OS:Site Elevation", "status": "Native", "milestone": "C4" }, + { "id": "LocationParameter.TimeZone", "unit": "h", "os": "OS:Site Time Zone", "status": "Native", "milestone": "C4" }, + { "id": "Address", "unit": null, "os": null, "status": "NA", "milestone": "C0", "notes": "Postal metadata." }, + + { "id": "WeatherDataParameter.GroundTemperatures", "unit": "C", "os": "OS:Site:GroundTemperature:BuildingSurface (12 monthly values)", "status": "Native", "milestone": "C4", "diagnostic": "SAM-OS-RUN-002 warning naming the fallback source (SAM -> EPW header -> EnergyPlus 18 C default)" }, + { "id": "WeatherDataParameter.Country", "unit": null, "os": null, "status": "NA", "milestone": "C0", "notes": "Metadata." }, + { "id": "WeatherDataParameter.State", "unit": null, "os": null, "status": "NA", "milestone": "C0" }, + { "id": "WeatherDataParameter.City", "unit": null, "os": null, "status": "NA", "milestone": "C0" }, + { "id": "WeatherDataParameter.DataSource", "unit": null, "os": null, "status": "NA", "milestone": "C0" }, + { "id": "WeatherDataParameter.WMONumber", "unit": null, "os": null, "status": "NA", "milestone": "C0" }, + { "id": "WeatherDataParameter.TimeZone", "unit": "h", "os": "OS:Site Time Zone (with Location precedence)", "status": "Native", "milestone": "C4" }, + { "id": "WeatherDataParameter.Comments_1", "unit": null, "os": null, "status": "NA", "milestone": "C0" }, + { "id": "WeatherDataParameter.Comments_2", "unit": null, "os": null, "status": "NA", "milestone": "C0" }, + + { "id": "Simulation.EpwAssignment", "unit": null, "os": "OS:WeatherFile via EpwFile.load", "status": "Native", "milestone": "MVP" }, + { "id": "Simulation.RunPeriodExplicit", "unit": null, "os": "OS:RunPeriod begin/end month+day", "status": "Native", "milestone": "C4" }, + { "id": "Simulation.RunPeriodRepeatCount", "unit": null, "os": "OS:RunPeriod Number of Times Runperiod to be Repeated", "status": "Native", "milestone": "C4" }, + { "id": "Simulation.FirstDayOfWeek", "unit": null, "os": "profile rotation + OS:YearDescription Day of Week for Start Day", "status": "Native", "milestone": "C4", "notes": "MVP aligns profiles; C4 also stamps YearDescription." }, + { "id": "Simulation.LeapYearCalendar", "unit": null, "os": "OS:YearDescription Is Leap Year / Calendar Year + 8784-value schedules", "status": "Native", "milestone": "C4" }, + { "id": "Simulation.DaylightSaving", "unit": null, "os": "OS:RunPeriodControl:DaylightSavingTime from EPW header", "status": "Approximated", "milestone": "C4", "notes": "Option-driven, default OFF (energy-model convention); SAM carries no DST data." }, + { "id": "Simulation.Timestep", "unit": "1/h", "os": "OS:Timestep", "status": "Native", "milestone": "C4", "notes": "MVP fixed at 6/h; C4 makes it an option." }, + { "id": "Simulation.SolarDistribution", "unit": null, "os": "OS:SimulationControl Solar Distribution", "status": "Native", "milestone": "C4" }, + { "id": "Simulation.ShadowCalculation", "unit": null, "os": "OS:ShadowCalculation", "status": "Native", "milestone": "C4" }, + { "id": "Simulation.OutputVariableRequests", "unit": null, "os": "OS:Output:Variable set + reporting frequency", "status": "Native", "milestone": "C4", "notes": "MVP fixed six hourly variables; C4 makes set and frequency options." }, + { "id": "Simulation.DdyDesignDayImport", "unit": null, "os": "OS:SizingPeriod:DesignDay via EnergyPlusReverseTranslator", "status": "Native", "milestone": "C4", "notes": "Deterministic; default heating 99.6% / cooling 0.4% selection, option for all design days." }, + { "id": "Simulation.SizingRuns", "unit": null, "os": "OS:SimulationControl sizing flags", "status": "Native", "milestone": "C4", "notes": "Off by default (Ideal Loads); option-enabled. Annual sums are environment-period filtered before enablement." }, + + { "id": "Result.AnalyticalModel.ConsumptionHeating", "unit": "kWh", "os": "SUM(Zone Ideal Loads Supply Air Total Heating Energy) over the annual weather RunPeriod", "status": "Native", "milestone": "C5" }, + { "id": "Result.AnalyticalModel.ConsumptionCooling", "unit": "kWh", "os": "SUM(Zone Ideal Loads Supply Air Total Cooling Energy) over the annual weather RunPeriod", "status": "Native", "milestone": "C5" }, + { "id": "Result.AnalyticalModel.PeakHeatingLoad", "unit": "kW", "os": "max hourly heating energy / 3600 s", "status": "Native", "milestone": "C5" }, + { "id": "Result.AnalyticalModel.PeakHeatingHour", "unit": "h", "os": "hour index of peak", "status": "Native", "milestone": "C5" }, + { "id": "Result.AnalyticalModel.PeakCoolingLoad", "unit": "kW", "os": "max hourly cooling energy / 3600 s", "status": "Native", "milestone": "C5" }, + { "id": "Result.AnalyticalModel.PeakCoolingHour", "unit": "h", "os": "hour index of peak", "status": "Native", "milestone": "C5" }, + { "id": "Result.AnalyticalModel.FloorArea", "unit": "m2", "os": "sum of space areas", "status": "Derived", "milestone": "C5", "formula": "sum of SpaceParameter.Area over all spaces" }, + { "id": "Result.AnalyticalModel.Volume", "unit": "m3", "os": "sum of space volumes", "status": "Derived", "milestone": "C5", "formula": "sum of SpaceParameter.Volume over all spaces" }, + { "id": "Result.Space.Load", "unit": "W", "os": "Zone Ideal Loads Supply Air Total Heating/Cooling Energy series", "status": "Native", "milestone": "C5" }, + { "id": "Result.Space.DesignLoad", "unit": "W", "os": "ZoneSizes CalcDesLoad (sizing runs)", "status": "Native", "milestone": "C5" }, + { "id": "Result.Space.LoadIndex", "unit": "h", "os": "peak time index", "status": "Native", "milestone": "C5" }, + { "id": "Result.Space.DryBulbTempearture", "unit": "C", "os": "Zone Mean Air Temperature (at peak / series)", "status": "Native", "milestone": "C5", "notes": "SAM enum member name carries a historical typo." }, + { "id": "Result.Space.ResultantTemperature", "unit": "C", "os": "Zone Operative Temperature", "status": "Approximated", "milestone": "C5", "notes": "Operative temperature is the closest EnergyPlus analogue of TAS resultant temperature." }, + { "id": "Result.Space.RelativeHumidity", "unit": "%", "os": "Zone Air Relative Humidity", "status": "Native", "milestone": "C5" }, + { "id": "Result.Space.HumidityRatio", "unit": "kg/kg", "os": "Zone Air Humidity Ratio", "status": "Native", "milestone": "C5" }, + { "id": "Result.Space.UnmetHours", "unit": "h", "os": "Zone Heating/Cooling Setpoint Not Met Time", "status": "Native", "milestone": "C5" }, + { "id": "Result.Space.OccupiedUnmetHours", "unit": "h", "os": "Zone Setpoint Not Met While Occupied Time", "status": "Native", "milestone": "C5" }, + { "id": "Result.Space.SolarGain", "unit": "W", "os": "Zone Windows Total Transmitted Solar Radiation Rate", "status": "Native", "milestone": "C5" }, + { "id": "Result.Space.LightingGain", "unit": "W", "os": "Zone Lights Total Heating Rate", "status": "Native", "milestone": "C5" }, + { "id": "Result.Space.EquipmentSensibleGain", "unit": "W", "os": "Zone Electric Equipment Radiant+Convective Heating Rate", "status": "Native", "milestone": "C5" }, + { "id": "Result.Space.EquipmentLatentGain", "unit": "W", "os": "Zone Electric Equipment Latent Gain Rate", "status": "Native", "milestone": "C5" }, + { "id": "Result.Space.OccupancySensibleGain", "unit": "W", "os": "Zone People Sensible Heating Rate", "status": "Native", "milestone": "C5" }, + { "id": "Result.Space.OccupancyLatentGain", "unit": "W", "os": "Zone People Latent Gain Rate", "status": "Native", "milestone": "C5" }, + { "id": "Result.Space.InfiltrationGain", "unit": "W", "os": "Zone Infiltration Sensible Heat Gain/Loss Energy", "status": "Native", "milestone": "C5" }, + { "id": "Result.Space.GlazingExternalConduction", "unit": "W", "os": "Zone Windows Total Heat Gain/Loss Rate", "status": "Approximated", "milestone": "C5", "notes": "Zone Windows Total Heat Gain/Loss Rate is solar-inclusive (no pure glazing-conduction variable exists) — documented approximation." }, + { "id": "Result.Space.OpaqueExternalConduction", "unit": "W", "os": "Surface Average Face Conduction Heat Transfer Rate (external opaque aggregate)", "status": "Approximated", "milestone": "C5", "notes": "Surface Inside Face Conduction Heat Transfer Rate aggregated over the zone's external opaque surfaces." }, + { "id": "Result.Space.OccupiedHours", "unit": "h", "os": "occupancy schedule x zone temperature series", "status": "Derived", "milestone": "C5", "formula": "count of distinct hours with Zone People Sensible Heating Rate > 0 (hourly series)" }, + { "id": "Result.Space.MaxMinDryBulbTemperature", "unit": "C", "os": "series max/min + indices", "status": "Derived", "milestone": "C5", "formula": "hourly series max/min with their time indices" }, + { "id": "Result.Space.AirMovementGain", "unit": "W", "os": null, "status": "NA", "milestone": "C0", "notes": "Inter-zone air movement needs AirflowNetwork; not populated." }, + { "id": "Result.Space.BuildingHeatTransfer", "unit": "W", "os": null, "status": "NA", "milestone": "C0", "notes": "TAS aggregate without a direct EnergyPlus variable." }, + { "id": "Result.Space.ApertureFlow", "unit": "kg/s", "os": null, "status": "NA", "milestone": "C0", "notes": "Aperture airflow needs AirflowNetwork." }, + { "id": "Result.Space.Pollutant", "unit": "ppm", "os": null, "status": "NA", "milestone": "C0", "notes": "Contaminant modelling out of scope." }, + { "id": "Result.Surface.Temperatures", "unit": "C", "os": "Surface Inside/Outside Face Temperature", "status": "Native", "milestone": "C5" }, + { "id": "Result.Surface.Conduction", "unit": "W", "os": "Surface Inside/Outside Face Conduction Heat Transfer Rate", "status": "Native", "milestone": "C5" }, + { "id": "Result.Surface.Convection", "unit": "W", "os": "Surface Inside/Outside Face Convection Heat Gain Rate", "status": "Native", "milestone": "C5" }, + { "id": "Result.Surface.LongWave", "unit": "W", "os": "Surface Inside/Outside Face Net Thermal Radiation Heat Gain Rate", "status": "Native", "milestone": "C5" }, + { "id": "Result.Surface.SolarGain", "unit": "W", "os": "Surface Inside/Outside Face absorbed/incident solar", "status": "Approximated", "milestone": "C5", "notes": "inside/outside absorbed/incident solar split is a documented approximation." }, + { "id": "Result.Surface.Condensation", "unit": "g/m2", "os": null, "status": "NA", "milestone": "C0", "notes": "No EnergyPlus condensation-mass model in scope." }, + { "id": "Result.Surface.ApertureOpening", "unit": "%", "os": null, "status": "NA", "milestone": "C0", "notes": "Opening modulation needs AirflowNetwork." }, + { "id": "Result.Zone.Aggregates", "unit": null, "os": "member-space aggregation per SAM zone group", "status": "Derived", "milestone": "C5", "formula": "member-space sums (energy), means (temperature) and maxima (loads) per SAM zone group" }, + { "id": "Result.AdjacencyCluster.UnmetHours", "unit": "h", "os": "building aggregate of zone unmet hours", "status": "Native", "milestone": "C5" }, + { "id": "Result.Identity.SamGuidMapping", "unit": null, "os": "OpenStudioObjectMap source GUID <-> OpenStudio handle/name", "status": "Native", "milestone": "MVP" }, + { "id": "Result.SimulationRuntime", "unit": "s", "os": "runner wall-clock + eplusout.err warning/severe/fatal counts", "status": "Native", "milestone": "C5" } + ] +} diff --git a/tests/resources/openstudio-to-sam-coverage.json b/tests/resources/openstudio-to-sam-coverage.json new file mode 100644 index 0000000..2d0b6e0 --- /dev/null +++ b/tests/resources/openstudio-to-sam-coverage.json @@ -0,0 +1,173 @@ +{ + "version": 1, + "reviewed": "2026-07-21", + "direction": "OpenStudio -> SAM", + "description": "Machine-readable OpenStudio -> SAM reverse-import coverage manifest. One entry per OpenStudio concept the importer meets. Statuses: Native (direct SAM mapping), Derived (deterministically calculated from OpenStudio data), Approximated (documented engineering assumption; a structured diagnostic is emitted), Unsupported (no safe SAM equivalent; a structured diagnostic is emitted when the source object is present), Deferred (detailed-HVAC programme), NotApplicable (no import semantics). docs/SAM_OPENSTUDIO_TO_SAM_COVERAGE.md is generated from this file and must not be parsed by tests. Every 'diagnostic' value must be a constant of SAM.Core.OpenStudio.OpenStudioImportDiagnosticCodes, enforced by reflection in ReverseCoverageTests.", + "statuses": ["Native", "Derived", "Approximated", "Unsupported", "Deferred", "NotApplicable"], + "deferredDomains": [ + "AirLoopHVAC and PlantLoop translation into SAM Systems", + "Zone equipment and control sequences", + "Service water heating and refrigeration", + "AirflowNetwork", + "Daylighting controls", + "EnergyManagementSystem", + "Output requests and reporting configuration" + ], + "entries": [ + { "id": "Model.Building.Name", "status": "Native", "target": "AnalyticalModel.Name", "notes": "The stamped SAM.Name feature takes precedence over the sanitised OpenStudio object name." }, + { "id": "Model.Building.NorthAxis", "status": "Native", "target": "AnalyticalModelParameter.NorthAngle", "formula": "radians = degrees * pi / 180 (exact inverse of the forward conversion)" }, + { "id": "Model.Site", "status": "Native", "target": "Core.Location", "notes": "No Location is created when latitude, longitude and elevation are all exactly zero - the OpenStudio default means the site was never set.", "diagnostic": "SAM-OSI-WEA-001" }, + { "id": "Model.Site.Terrain", "status": "Unsupported", "diagnostic": "SAM-OSI-WEA-001", "notes": "SAM Location carries no terrain class." }, + { "id": "Model.Site.TimeZone", "status": "Unsupported", "diagnostic": "SAM-OSI-WEA-001", "notes": "SAM Location carries no time zone." }, + { "id": "Model.WeatherFile", "status": "Derived", "target": "AnalyticalModelParameter.WeatherData + OpenStudioSourceParameter.WeatherFilePath", "diagnostic": "SAM-OSI-WEA-001", "notes": "When the referenced EPW is found on disk its hourly weather is loaded into SAM WeatherData and embedded (the slot the forward exporter reads back). When the file is absent, or ImportWeatherData is off, only the path is recorded - a reference is never presented as embedded weather." }, + { "id": "Model.SizingPeriod.DesignDay", "status": "Approximated", "target": "AnalyticalModelParameter.Heating/CoolingDesignDays", "diagnostic": "SAM-OSI-WEA-001", "notes": "Imported by name, date and heating/cooling role only: an EnergyPlus design day is parametric while a SAM DesignDay is an hourly weather day." }, + { "id": "Model.RunPeriod", "status": "Unsupported", "diagnostic": "SAM-OSI-SET-001", "notes": "SAM AnalyticalModel carries no run period; it is set by the forward conversion options." }, + { "id": "Model.Timestep", "status": "Unsupported", "diagnostic": "SAM-OSI-SET-001" }, + { "id": "Model.ShadowCalculation", "status": "Unsupported", "diagnostic": "SAM-OSI-SET-001" }, + { "id": "Model.YearDescription", "status": "NotApplicable", "notes": "Calendar configuration of the run, not of the building." }, + + { "id": "OS:Space", "status": "Native", "target": "Space", "notes": "Always 1:1; never collapsed by ThermalZone." }, + { "id": "OS:Space.Transformation", "status": "Native", "notes": "buildingTransformation applied to every surface vertex; SAM-authored OSMs have identity here." }, + { "id": "OS:Space.FloorArea", "status": "Derived", "target": "SpaceParameter.Area", "formula": "shell area of the imported bounding faces; OpenStudio floorArea() only when no closed shell exists" }, + { "id": "OS:Space.Volume", "status": "Derived", "target": "SpaceParameter.Volume", "formula": "shell volume of the imported bounding faces; OpenStudio volume() only when no closed shell exists" }, + { "id": "OS:Space.Location", "status": "Derived", "target": "Space.Location", "formula": "internal point of the closed shell", "diagnostic": "SAM-OSI-ZONE-002" }, + { "id": "OS:BuildingStory", "status": "Native", "target": "SpaceParameter.LevelName" }, + { "id": "OS:ThermalZone", "status": "Native", "target": "OpenStudioSourceParameter.ThermalZoneName", "notes": "Recorded per space; controls are applied from it." }, + { "id": "OS:ThermalZone.MultiSpace", "status": "Native", "diagnostic": "SAM-OSI-ZONE-001", "notes": "Each space stays a separate SAM Space and they share the zone's controls." }, + { "id": "OS:Space.Multiplier", "status": "Unsupported", "diagnostic": "SAM-OSI-ZONE-002", "notes": "SAM has no space multiplier." }, + + { "id": "OS:Surface.Wall.Outdoors", "status": "Native", "target": "PanelType.WallExternal" }, + { "id": "OS:Surface.Wall.Surface", "status": "Native", "target": "PanelType.WallInternal" }, + { "id": "OS:Surface.Wall.Adiabatic", "status": "Native", "target": "PanelType.WallInternal + PanelParameter.Adiabatic" }, + { "id": "OS:Surface.Wall.Ground", "status": "Native", "target": "PanelType.UndergroundWall" }, + { "id": "OS:Surface.Floor.Outdoors", "status": "Native", "target": "PanelType.FloorExposed" }, + { "id": "OS:Surface.Floor.Surface", "status": "Native", "target": "PanelType.FloorInternal" }, + { "id": "OS:Surface.Floor.Adiabatic", "status": "Native", "target": "PanelType.FloorInternal + PanelParameter.Adiabatic" }, + { "id": "OS:Surface.Floor.Ground", "status": "Native", "target": "PanelType.SlabOnGrade" }, + { "id": "OS:Surface.RoofCeiling.Outdoors", "status": "Native", "target": "PanelType.Roof" }, + { "id": "OS:Surface.RoofCeiling.Surface", "status": "Native", "target": "PanelType.Ceiling" }, + { "id": "OS:Surface.RoofCeiling.Adiabatic", "status": "Native", "target": "PanelType.Ceiling + PanelParameter.Adiabatic" }, + { "id": "OS:Surface.RoofCeiling.Ground", "status": "Native", "target": "PanelType.UndergroundCeiling" }, + { "id": "OS:Surface.Foundation", "status": "Native", "target": "ground-contact PanelType", "notes": "The whole Ground/Foundation/preprocessor family is treated as ground contact." }, + { "id": "OS:Surface.OtherSideCoefficients", "status": "Unsupported", "diagnostic": "SAM-OSI-BC-001", "notes": "Falls back to adiabatic; SAM cannot carry an externally specified surface temperature." }, + { "id": "OS:Surface.OtherSideConditionsModel", "status": "Unsupported", "diagnostic": "SAM-OSI-BC-001", "notes": "Falls back to adiabatic." }, + { "id": "OS:Surface.AdjacentSurface", "status": "Native", "notes": "Authoritative: the two surfaces of an interzone partition become ONE SAM Panel related to two Spaces." }, + { "id": "OS:Surface.AdjacencyByGeometry", "status": "Approximated", "diagnostic": "SAM-OSI-ADJ-001", "notes": "Only for a Surface boundary with no adjacency handle; requires coincident internal points, areas within 1 percent and opposed normals." }, + { "id": "OS:Surface.AdjacencyUnresolved", "status": "Approximated", "diagnostic": "SAM-OSI-ADJ-002", "notes": "Demoted to adiabatic, matching the forward direction's single-sided internal panel." }, + { "id": "OS:Surface.Geometry", "status": "Native", "diagnostic": "SAM-OSI-GEO-001", "notes": "Validated for vertex count, planarity, duplicates, self-intersection and minimum area; never repaired." }, + { "id": "OS:Surface.Geometry.VertexCleaning", "status": "Native", "diagnostic": "SAM-OSI-GEO-002", "notes": "Duplicate and collinear vertices are removed while normalising a boundary. Shape, area and normal are unchanged, so this is reported at Information severity and kept distinct from invalid geometry." }, + { "id": "OS:Surface.SunWindExposure", "status": "NotApplicable", "notes": "Derived by EnergyPlus from the boundary condition; SAM re-derives it on export." }, + + { "id": "OS:SubSurface.FixedWindow", "status": "Native", "target": "ApertureType.Window" }, + { "id": "OS:SubSurface.OperableWindow", "status": "Approximated", "target": "ApertureType.Window", "diagnostic": "SAM-OSI-APX-001", "notes": "SAM has no openability flag." }, + { "id": "OS:SubSurface.Skylight", "status": "Native", "target": "ApertureType.Window" }, + { "id": "OS:SubSurface.Door", "status": "Native", "target": "ApertureType.Door" }, + { "id": "OS:SubSurface.GlassDoor", "status": "Native", "target": "ApertureType.Door" }, + { "id": "OS:SubSurface.OverheadDoor", "status": "Approximated", "target": "ApertureType.Door", "diagnostic": "SAM-OSI-APX-001" }, + { "id": "OS:SubSurface.TubularDaylightDome", "status": "Approximated", "target": "ApertureType.Window", "diagnostic": "SAM-OSI-APX-001", "notes": "Imported as the glazed opening; SAM has no light pipe." }, + { "id": "OS:SubSurface.TubularDaylightDiffuser", "status": "Approximated", "target": "ApertureType.Window", "diagnostic": "SAM-OSI-APX-001" }, + { "id": "OS:SubSurface.Unknown", "status": "Unsupported", "diagnostic": "SAM-OSI-SUB-001" }, + { "id": "OS:SubSurface.Multiplier", "status": "Approximated", "diagnostic": "SAM-OSI-APX-001", "notes": "SAM apertures have no multiplier; the geometry is imported once." }, + { "id": "OS:SubSurface.Containment", "status": "Native", "diagnostic": "SAM-OSI-GEO-001", "notes": "Validated by Panel.AddAperture; a subsurface outside its host is reported, not attached." }, + { "id": "OS:WindowPropertyFrameAndDivider", "status": "Unsupported", "diagnostic": "SAM-OSI-CON-001", "notes": "Frame and divider live outside the construction; SAM frame layers are never fabricated from them." }, + { "id": "OS:ShadingControl", "status": "Unsupported", "diagnostic": "SAM-OSI-CON-001" }, + { "id": "OS:DaylightingDeviceShelf", "status": "Unsupported", "diagnostic": "SAM-OSI-SUB-001" }, + + { "id": "OS:ShadingSurface.Site", "status": "Native", "target": "PanelType.Shade" }, + { "id": "OS:ShadingSurface.Building", "status": "Native", "target": "PanelType.Shade" }, + { "id": "OS:ShadingSurface.Space", "status": "Native", "target": "PanelType.Shade", "notes": "Group transformation composed with the owning space's building transformation." }, + { "id": "OS:ShadingSurfaceGroup.Identity", "status": "Native", "target": "OpenStudioSourceParameter.ShadingGroupType/Name" }, + { "id": "OS:ShadingSurfaceGroup.ShadedSurface", "status": "Approximated", "diagnostic": "SAM-OSI-APX-001", "notes": "SAM shade panels are free-standing; the association is metadata only." }, + + { "id": "OS:Material.StandardOpaqueMaterial", "status": "Native", "target": "Core.OpaqueMaterial" }, + { "id": "OS:Material.MasslessOpaqueMaterial", "status": "Approximated", "target": "Core.OpaqueMaterial", "diagnostic": "SAM-OSI-APX-001", "formula": "conductivity = 0.025 m / R; resistance preserved exactly, near-zero thermal mass assigned" }, + { "id": "OS:Material.AirGap", "status": "Derived", "target": "Core.GasMaterial", "formula": "HeatTransferCoefficient = 1 / thermalResistance (exact inverse of the forward R = 1/h)" }, + { "id": "OS:WindowMaterial.Glazing", "status": "Native", "target": "Core.TransparentMaterial", "notes": "EnergyPlus Front/Back map to SAM External/Internal, matching the forward direction." }, + { "id": "OS:WindowMaterial.SimpleGlazingSystem", "status": "Approximated", "target": "Core.TransparentMaterial", "diagnostic": "SAM-OSI-APX-001", "formula": "conductivity = thickness * U; solar transmittance taken from SHGC (an overstatement, since SHGC includes inward-flowing absorbed radiation)" }, + { "id": "OS:WindowMaterial.Gas", "status": "Native", "target": "Core.GasMaterial", "formula": "HeatTransferCoefficient = getThermalConductance(293.15 K)" }, + { "id": "OS:WindowMaterial.GasMixture", "status": "Approximated", "target": "Core.GasMaterial", "diagnostic": "SAM-OSI-MAT-001", "notes": "Conductance preserved; composition lost - SAM carries a single gas type." }, + { "id": "OS:WindowMaterial.Blind", "status": "Unsupported", "diagnostic": "SAM-OSI-MAT-001", "notes": "Name-only placeholder; no properties substituted." }, + { "id": "OS:WindowMaterial.Shade", "status": "Unsupported", "diagnostic": "SAM-OSI-MAT-001" }, + { "id": "OS:WindowMaterial.Screen", "status": "Unsupported", "diagnostic": "SAM-OSI-MAT-001" }, + { "id": "OS:WindowMaterial.GlazingRefractionExtinctionMethod", "status": "Unsupported", "diagnostic": "SAM-OSI-MAT-001" }, + { "id": "OS:MaterialProperty.PhaseChange", "status": "Unsupported", "diagnostic": "SAM-OSI-MAT-001", "notes": "SAM materials have no phase-change model." }, + + { "id": "OS:Construction.Opaque", "status": "Native", "target": "Construction", "notes": "Layer order preserved outside-first." }, + { "id": "OS:Construction.Fenestration", "status": "Native", "target": "ApertureConstruction", "notes": "Pane layers only; frame layers are never fabricated." }, + { "id": "OS:Construction.AirBoundary", "status": "Native", "target": "PanelType.Air", "notes": "A layer-free SAM construction; the air behaviour is carried by the panel type." }, + { "id": "OS:Construction.InternalSource", "status": "Unsupported", "diagnostic": "SAM-OSI-CON-001" }, + { "id": "OS:Construction.CfactorUndergroundWall", "status": "Unsupported", "diagnostic": "SAM-OSI-CON-001" }, + { "id": "OS:Construction.FfactorGroundFloor", "status": "Unsupported", "diagnostic": "SAM-OSI-CON-001" }, + { "id": "OS:Construction.WindowDataFile", "status": "Unsupported", "diagnostic": "SAM-OSI-CON-001" }, + { "id": "OS:Construction.Missing", "status": "Unsupported", "diagnostic": "SAM-OSI-CON-001", "notes": "A surface with no construction gets a named, layer-free placeholder - never a default build-up." }, + { "id": "OS:Construction.UnreferencedPruning", "status": "Native", "notes": "Materials and profiles the imported topology does not reference are removed." }, + + { "id": "OS:People", "status": "Derived", "target": "InternalConditionParameter.AreaPerPerson + Occupancy*GainPerPerson", "formula": "areaPerPerson = 1 / peopleperSpaceFloorArea; sensible = activityLevel * sensibleHeatFraction; latent = activityLevel * (1 - sensibleHeatFraction)", "diagnostic": "SAM-OSI-LOAD-001" }, + { "id": "OS:People.AutocalculatedSensibleFraction", "status": "Approximated", "diagnostic": "SAM-OSI-APX-001", "notes": "No fixed split exists; the whole metabolic rate is imported as sensible." }, + { "id": "OS:People.NumberOfPeopleMethod", "status": "Unsupported", "diagnostic": "SAM-OSI-LOAD-001", "notes": "An absolute count cannot become a density on a shared space type without inventing an area." }, + { "id": "OS:Lights", "status": "Native", "target": "InternalConditionParameter.LightingGainPerArea + LightingProfileName" }, + { "id": "OS:Lights.RadiantVisibleFractions", "status": "Native", "target": "InternalConditionParameter.LightingRadiantProportion / LightingViewCoefficient" }, + { "id": "OS:ElectricEquipment", "status": "Native", "target": "InternalConditionParameter.EquipmentSensibleGainPerArea / EquipmentLatentGainPerArea" }, + { "id": "OS:ElectricEquipment.PartLatent", "status": "Approximated", "diagnostic": "SAM-OSI-APX-001", "notes": "A single part-latent instance is apportioned; the two halves then share one schedule." }, + { "id": "OS:GasEquipment", "status": "Unsupported", "diagnostic": "SAM-OSI-LOAD-001" }, + { "id": "OS:SteamEquipment", "status": "Unsupported", "diagnostic": "SAM-OSI-LOAD-001" }, + { "id": "OS:HotWaterEquipment", "status": "Unsupported", "diagnostic": "SAM-OSI-LOAD-001" }, + { "id": "OS:OtherEquipment", "status": "Unsupported", "diagnostic": "SAM-OSI-LOAD-001" }, + { "id": "OS:Luminaire", "status": "Unsupported", "diagnostic": "SAM-OSI-LOAD-001" }, + { "id": "OS:ElectricEquipment.ITE.AirCooled", "status": "Unsupported", "diagnostic": "SAM-OSI-LOAD-001" }, + { "id": "OS:InternalMass", "status": "Unsupported", "diagnostic": "SAM-OSI-LOAD-001" }, + { "id": "OS:SpaceInfiltration.DesignFlowRate.ACH", "status": "Native", "target": "InternalConditionParameter.InfiltrationAirChangesPerHour" }, + { "id": "OS:SpaceInfiltration.DesignFlowRate.Other", "status": "Unsupported", "diagnostic": "SAM-OSI-LOAD-001", "notes": "Flow-based methods need per-space geometry a shared space type does not have." }, + { "id": "OS:SpaceInfiltration.EffectiveLeakageArea", "status": "Unsupported", "diagnostic": "SAM-OSI-LOAD-001" }, + { "id": "OS:SpaceInfiltration.FlowCoefficient", "status": "Unsupported", "diagnostic": "SAM-OSI-LOAD-001" }, + { "id": "OS:DesignSpecification.OutdoorAir", "status": "Derived", "target": "InternalConditionParameter.SupplyAirFlow*", "formula": "each populated outdoor-air field maps to its SAM counterpart: perPerson -> SupplyAirFlowPerPerson, perFloorArea -> SupplyAirFlowPerArea, airChangesPerHour -> SupplyAirChangesPerHour, flowRate -> SupplyAirFlow" }, + { "id": "OS:SpaceType", "status": "Native", "target": "InternalCondition", "notes": "One deduplicated internal condition per space type." }, + { "id": "OS:Space.SpaceLevelLoads", "status": "Unsupported", "diagnostic": "SAM-OSI-LOAD-002", "notes": "SAM has no per-space load layer on top of an internal condition." }, + + { "id": "OS:Schedule.Constant", "status": "Native", "target": "Profile", "formula": "8760 identical hourly values" }, + { "id": "OS:Schedule.Ruleset", "status": "Derived", "target": "Profile", "formula": "getDaySchedules over the whole year, sampled at the end of each hour; weekday/weekend rules, seasonal ranges and rule priority resolved by OpenStudio" }, + { "id": "OS:Schedule.Day", "status": "Derived", "notes": "Read through the ruleset expansion." }, + { "id": "OS:Schedule.Rule", "status": "Derived", "notes": "Applied by the ruleset expansion; never flattened away." }, + { "id": "OS:Schedule.FixedInterval.Hourly", "status": "Native", "target": "Profile" }, + { "id": "OS:Schedule.FixedInterval.SubHourly", "status": "Approximated", "diagnostic": "SAM-OSI-SCH-001", "notes": "Averaged into hourly means so the daily total is preserved." }, + { "id": "OS:Schedule.Compact", "status": "Unsupported", "diagnostic": "SAM-OSI-SCH-001", "notes": "The load is imported without a profile; no constant is substituted." }, + { "id": "OS:Schedule.File", "status": "Unsupported", "diagnostic": "SAM-OSI-SCH-001" }, + { "id": "OS:Schedule.VariableInterval", "status": "Unsupported", "diagnostic": "SAM-OSI-SCH-001" }, + { "id": "OS:ScheduleTypeLimits", "status": "NotApplicable", "notes": "SAM ProfileType carries the semantic instead." }, + + { "id": "OS:ThermostatSetpoint.DualSetpoint", "status": "Native", "target": "InternalConditionParameter.Heating/CoolingProfileName", "notes": "SAM stores setpoints as profiles whose values are the temperatures, so setback schedules survive." }, + { "id": "OS:ZoneControl.Humidistat", "status": "Native", "target": "InternalConditionParameter.Humidification/DehumidificationProfileName" }, + { "id": "OS:ZoneHVAC.IdealLoadsAirSystem", "status": "Derived", "notes": "Recognised as the conditioned state; SAM's own export targets Ideal Loads." }, + { "id": "OS:AirLoopHVAC", "status": "Deferred", "diagnostic": "SAM-OSI-HVAC-001" }, + { "id": "OS:PlantLoop", "status": "Deferred", "diagnostic": "SAM-OSI-HVAC-001" }, + { "id": "OS:ZoneHVAC.Equipment", "status": "Deferred", "diagnostic": "SAM-OSI-HVAC-001" }, + { "id": "OS:AvailabilityManager", "status": "Deferred", "diagnostic": "SAM-OSI-HVAC-001" }, + { "id": "OS:WaterUseEquipment", "status": "Deferred", "diagnostic": "SAM-OSI-HVAC-001" }, + { "id": "OS:Refrigeration", "status": "Deferred", "diagnostic": "SAM-OSI-HVAC-001" }, + { "id": "OS:AirflowNetwork", "status": "Deferred", "diagnostic": "SAM-OSI-HVAC-001" }, + { "id": "OS:Daylighting.Controls", "status": "Deferred", "diagnostic": "SAM-OSI-HVAC-001" }, + { "id": "OS:EnergyManagementSystem", "status": "Deferred", "diagnostic": "SAM-OSI-HVAC-001" }, + { "id": "OS:Output.Variable", "status": "NotApplicable", "notes": "Reporting configuration, not building data." }, + + { "id": "Identity.SAM.Guid", "status": "Native", "notes": "Full SAM Guid restored from OS:AdditionalProperties.", "diagnostic": "SAM-OSI-ID-001" }, + { "id": "Identity.SAM.Type", "status": "Native", "notes": "Rejects identity metadata belonging to a different SAM object kind.", "diagnostic": "SAM-OSI-ID-001" }, + { "id": "Identity.SAM.Name", "status": "Native", "notes": "The unsanitised SAM name, unavailable from the sanitised object name." }, + { "id": "Identity.NameGuidSuffix", "status": "NotApplicable", "notes": "8 hex characters of a 128-bit Guid: a matching and diagnostic key only, never a restorable identity." }, + { "id": "Identity.ThirdPartyModel", "status": "Native", "notes": "No metadata is the normal third-party case and is never reported as a problem." }, + { "id": "Identity.OpenStudioHandle", "status": "Native", "target": "OpenStudioSourceParameter.SourceHandle" }, + + { "id": "Input.PathInvalid", "status": "Unsupported", "diagnostic": "SAM-OSI-IN-001" }, + { "id": "Input.ExtensionUnsupported", "status": "Unsupported", "diagnostic": "SAM-OSI-IN-002" }, + { "id": "Input.OsmLoadFailure", "status": "Unsupported", "diagnostic": "SAM-OSI-OSM-001", "notes": "Never returns an empty AnalyticalModel." }, + { "id": "Input.OsmVersionTranslation", "status": "Native", "diagnostic": "SAM-OSI-OSM-002", "notes": "Older OSMs are upgraded on load; translator messages are surfaced." }, + { "id": "Osw.Parse", "status": "Native", "diagnostic": "SAM-OSI-OSW-001" }, + { "id": "Osw.SeedMissing", "status": "Unsupported", "diagnostic": "SAM-OSI-OSW-002", "notes": "Blocking when execution is disabled." }, + { "id": "Osw.SeedNotFound", "status": "Unsupported", "diagnostic": "SAM-OSI-OSW-003" }, + { "id": "Osw.SeedOnlyImport", "status": "Approximated", "diagnostic": "SAM-OSI-OSW-004", "notes": "The seed is imported and the unapplied measures are stated." }, + { "id": "Osw.ExecutionFailure", "status": "Unsupported", "diagnostic": "SAM-OSI-OSW-005" }, + { "id": "Osw.FinalOsmNotFound", "status": "Unsupported", "diagnostic": "SAM-OSI-OSW-006" }, + { "id": "Osw.EnergyPlusMeasure", "status": "Unsupported", "diagnostic": "SAM-OSI-OSW-007", "notes": "IDF-only changes cannot be represented in the OSM." }, + { "id": "Osw.WorkflowExecuted", "status": "Native", "diagnostic": "SAM-OSI-OSW-008", "notes": "The workflow ran and its final post-model-measure OSM was located and imported." }, + { "id": "Osw.NoSimulationResults", "status": "NotApplicable", "diagnostic": "SAM-OSI-OSW-009", "notes": "A workflow of model measures with no simulation step produces a model but no EnergyPlus results. An import needs the model, not the results, so the simulation runner's failure verdict is downgraded to information and never invalidates the imported model." } + ] +} diff --git a/tests/resources/weather/README.md b/tests/resources/weather/README.md new file mode 100644 index 0000000..67583ad --- /dev/null +++ b/tests/resources/weather/README.md @@ -0,0 +1,25 @@ +# Pinned weather fixture + +**Location:** Boston Logan Intl AP, MA, USA (WMO 725090) +**Dataset:** TMYx 2004-2018 (`USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2004-2018`) +**Files:** `.epw` (weather), `.ddy` (design days), `.stat` (climate summary) +**Integrity:** see `SHA256SUMS.txt` — tests must fail if a hash does not match. + +## Provenance + +Copied 2026-07-18 from the local Ladybug Tools 1.8 bundle +(`C:\Program Files\ladybug_tools\resources\weather\USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2004-2018\`), +which redistributes the TMYx dataset originally published at + (WMO Region 4, USA, Massachusetts). + +## Licence + +TMYx files from climate.onebuilding.org are free to use with attribution: +"Climatic data provided by climate.onebuilding.org". The files are unmodified. + +## Why Boston + +Chosen over a mild UK climate deliberately: cold winters and warm summers guarantee +both non-zero annual heating and non-zero annual cooling loads for the conditioned +one-zone fixture, which the M6 gate requires (plan section 13). No network download +is involved; the fixture is committed and immutable. diff --git a/tests/resources/weather/SHA256SUMS.txt b/tests/resources/weather/SHA256SUMS.txt new file mode 100644 index 0000000..90040ad --- /dev/null +++ b/tests/resources/weather/SHA256SUMS.txt @@ -0,0 +1,3 @@ +3d0aaf62c4f355cda09ba42d1b02930a7756dae2bc8b6b2b993f2150895623d4 USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2004-2018.ddy +eded5c982c1da37e35930622badf7f0e0a0a82b30fd9410723ea3f1c4b52b80b USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2004-2018.epw +1c9c7240d3a697b6f4979b0eab9baa16b33ff10a95982ec96912d5d59d3e5713 USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2004-2018.stat diff --git a/tests/resources/weather/USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2004-2018.ddy b/tests/resources/weather/USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2004-2018.ddy new file mode 100644 index 0000000..c732b31 --- /dev/null +++ b/tests/resources/weather/USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2004-2018.ddy @@ -0,0 +1,2343 @@ + ! The following Location and Design Day data are produced as possible from the indicated data source. + ! Wind Speeds follow the indicated design conditions rather than traditional values (6.7 m/s heating, 3.35 m/s cooling) + ! No special attempts at re-creating or determining missing data parts (e.g. Wind speed or direction) + ! are done. Therefore, you should look at the data and fill in any incorrect values as you desire. + + ! SizingPeriod:DesignDay and other objects are formatted to meet criteria of EnergyPlus V7.1 and later + + ! Some users have indicated that they would like the actual day of week from the weather file to be + ! used as the start day of week for a RunPeriod even though this is relatively meaningless for + ! TMY data files as future months will not use their start days of week (simulations need to show + ! continuity in day of week presentation). + + ! In an effort to accomodate, the following initial month days are included: + ! Note JAN 1, 2010 is a Friday + ! Note FEB 1, 2013 is a Friday + ! Note MAR 1, 2008 is a Saturday + ! Note APR 1, 2015 is a Wednesday + ! Note MAY 1, 2014 is a Thursday + ! Note JUN 1, 2013 is a Saturday + ! Note JUL 1, 2008 is a Tuesday + ! Note AUG 1, 2015 is a Saturday + ! Note SEP 1, 2011 is a Thursday + ! Note OCT 1, 2010 is a Friday + ! Note NOV 1, 2016 is a Tuesday + ! Note DEC 1, 2012 is a Saturday + + ! Since the RunPeriod object changes in V9.0, the following are RunPeriod objects in comments: + ! Version before EnergyPlus release V9.0 + !RunPeriod, + !Weather Data, !- Name + ! 1, !- Begin Month + ! 1, !- Begin Day of Month + ! 12, !- End Month + ! 31, !- End Day of Month + !Friday, !- Day of Week for Start Day + ! No, !- Use Weather File Holidays and Special Days + ! No, !- Use Weather File Daylight Saving Period + ! Yes, !- Apply Weekend Holiday Rule + ! Yes, !- Use Weather File Rain Indicators + ! Yes; !- Use Weather File Snow Indicators + + ! Version EnergyPlus release V9.0+ + !RunPeriod, + !Weather Data, !- Name + ! 1, !- Begin Month + ! 1, !- Begin Day of Month + ! , !- Begin Year + ! 12, !- End Month + ! 31, !- End Day of Month + ! , !- End Year + !Friday, !- Day of Week for Start Day + ! No, !- Use Weather File Holidays and Special Days + ! No, !- Use Weather File Daylight Saving Period + ! Yes, !- Apply Weekend Holiday Rule + ! Yes, !- Use Weather File Rain Indicators + ! Yes, !- Use Weather File Snow Indicators + ! ; !- Treat Weather as Acual + + Site:Location, + Boston Logan Intl AP_MA_USA Design_Conditions, !- Location Name + 42.36, !- Latitude {N+ S-} + -71.01, !- Longitude {W- E+} + -5.00, !- Time Zone Relative to GMT {GMT+/-} + 3.70; !- Elevation {m} + + ! The following Sizing Period objects for Extreme and Typical conditions are calculated + ! from the extreme (if any) and typical conditions on the weather source data. + ! The actual weeks that will be used will exist on the weather file. + + SizingPeriod:WeatherFileConditionType, + Summer Extreme, + SummerExtreme, + SummerDesignDay, + Yes, !- Use Weather File Daylight Saving Period + Yes; !- Use Weather File Rain and Snow Indicators + SizingPeriod:WeatherFileConditionType, + Summer Typical, + SummerTypical, + Monday, + Yes, !- Use Weather File Daylight Saving Period + Yes; !- Use Weather File Rain and Snow Indicators + SizingPeriod:WeatherFileConditionType, + Winter Extreme, + WinterExtreme, + WinterDesignDay, + Yes, !- Use Weather File Daylight Saving Period + Yes; !- Use Weather File Rain and Snow Indicators + SizingPeriod:WeatherFileConditionType, + Winter Typical, + WinterTypical, + Monday, + Yes, !- Use Weather File Daylight Saving Period + Yes; !- Use Weather File Rain and Snow Indicators + SizingPeriod:WeatherFileConditionType, + Autumn Typical, + AutumnTypical, + Monday, + Yes, !- Use Weather File Daylight Saving Period + Yes; !- Use Weather File Rain and Snow Indicators + SizingPeriod:WeatherFileConditionType, + Spring Typical, + SpringTypical, + Monday, + Yes, !- Use Weather File Daylight Saving Period + Yes; !- Use Weather File Rain and Snow Indicators + + + + ! Site:Precipitation. RoofIrrigation and Schedule:File objects for rainfall + ! Data is built from rainfall data on the source data + Site:Precipitation, + ScheduleAndDesignLevel, !- Precipitation Model Type + 1.317, !- Design Level for Total Annual Preciptation + Rainfall Data from EPW file, !- Precipitation Rates Schedule Name + 1.317; !- Average Total Annual Precipitation + + RoofIrrigation, + Schedule, !- Irridation Model Type + Rainfall Data from EPW file, !- Precipitation Rates Schedule Name + ; !- Irrigation Maximum Saturation Threshold (default used) + + Schedule:File, + Rainfall Data from EPW file, !- Name + , !- Schedule Type Limits Name + USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2004-2018.rain, !- File Name + 1, !- Column Number + 1, !- Rows to Skip at Top + 8760; !- Number of Hours of Data + + ! WMO=725090 Time Zone= GMT-5.0 Code=NAE: (GMT-05:00) Eastern Time (US & Canada) + ! Data Source="2017 ASHRAE Handbook -- Fundamentals - Chapter 14 Climatic Design Information" + + RunPeriodControl:DaylightSavingTime, + 2nd Sunday in March, !- StartDate + 1st Sunday in November; !- EndDate + + ! ======================= Annual Design Conditions SizingPeriod:DesignDay ====================== + ! The following annual design conditions are reproduced from the climate data shown above. + ! Heating - 99%, 99.6%; Cooling - .4%, 1%, 2% for several humidity, etc conditions + ! + ! Boston Logan Intl AP_MA_USA Extreme Annual Wind Speeds, 1%=12m/s, 2.5%=10.7m/s, 5%=9.3m/s + ! Boston Logan Intl AP_MA_USA Extreme Annual Temperatures, Max Drybulb=35.3C Min Drybulb=2.4C + + ! Boston Logan Intl AP_MA_USA ASHRAE Climate Zone=5A + + ! Boston Logan Intl AP_MA_USA Annual Heating Design Conditions Wind Speed=7m/s Wind Dir=290 + ! Coldest Month=JAN + ! Boston Logan Intl AP_MA_USA Annual Heating 99.6%, MaxDB=-13.1C + SizingPeriod:DesignDay, + Boston Logan Intl AP Ann Htg 99.6% Condns DB, !- Name + 1, !- Month + 21, !- Day of Month + WinterDesignDay,!- Day Type + -13.1, !- Maximum Dry-Bulb Temperature {C} + 0.0, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + -13.1, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 7, !- Wind Speed {m/s} design conditions vs. traditional 6.71 m/s (15 mph) + 290, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAEClearSky, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + , !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + , !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + 0.00; !- Clearness {0.0 to 1.1} + + ! Boston Logan Intl AP_MA_USA Annual Heating 99%, MaxDB=-10.3C + SizingPeriod:DesignDay, + Boston Logan Intl AP Ann Htg 99% Condns DB, !- Name + 1, !- Month + 21, !- Day of Month + WinterDesignDay,!- Day Type + -10.3, !- Maximum Dry-Bulb Temperature {C} + 0.0, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + -10.3, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 7, !- Wind Speed {m/s} design conditions vs. traditional 6.71 m/s (15 mph) + 290, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAEClearSky, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + , !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + , !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + 0.00; !- Clearness {0.0 to 1.1} + + ! Boston Logan Intl AP_MA_USA Annual Humidification 99.6% Design Conditions DP=>MCDB, DP=-23.7C + SizingPeriod:DesignDay, + Boston Logan Intl AP Ann Hum_n 99.6% Condns DP=>MCDB, !- Name + 1, !- Month + 21, !- Day of Month + WinterDesignDay,!- Day Type + -11.7, !- Maximum Dry-Bulb Temperature {C} + 0.0, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Dewpoint, !- Humidity Condition Type + -23.7, !- Dewpoint at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 7, !- Wind Speed {m/s} design conditions vs. traditional 6.71 m/s (15 mph) + 290, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAEClearSky, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + , !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + , !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + 0.00; !- Clearness {0.0 to 1.1} + + ! Boston Logan Intl AP_MA_USA Annual Humidification 99% Design Conditions DP=>MCDB, DP=-21.1C + SizingPeriod:DesignDay, + Boston Logan Intl AP Ann Hum_n 99% Condns DP=>MCDB, !- Name + 1, !- Month + 21, !- Day of Month + WinterDesignDay,!- Day Type + -8.6, !- Maximum Dry-Bulb Temperature {C} + 0.0, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Dewpoint, !- Humidity Condition Type + -21.1, !- Dewpoint at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 7, !- Wind Speed {m/s} design conditions vs. traditional 6.71 m/s (15 mph) + 290, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAEClearSky, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + , !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + , !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + 0.00; !- Clearness {0.0 to 1.1} + + ! Boston Logan Intl AP_MA_USA Annual Heating Wind 99.6% Design Conditions WS=>MCDB, WS=14.2m/s + SizingPeriod:DesignDay, + Boston Logan Intl AP Ann Htg Wind 99.6% Condns WS=>MCDB, !- Name + 1, !- Month + 21, !- Day of Month + WinterDesignDay,!- Day Type + 3.2, !- Maximum Dry-Bulb Temperature {C} + 0.0, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 3.2, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 14.2, !- Wind Speed {m/s} design conditions vs. traditional 6.71 m/s (15 mph) + 290, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAEClearSky, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + , !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + , !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + 0.00; !- Clearness {0.0 to 1.1} + + ! Boston Logan Intl AP_MA_USA Annual Heating Wind 99% Design Conditions WS=>MCDB, WS=12.6m/s + SizingPeriod:DesignDay, + Boston Logan Intl AP Ann Htg Wind 99% Condns WS=>MCDB, !- Name + 1, !- Month + 21, !- Day of Month + WinterDesignDay,!- Day Type + 0, !- Maximum Dry-Bulb Temperature {C} + 0.0, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 0, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 12.6, !- Wind Speed {m/s} design conditions vs. traditional 6.71 m/s (15 mph) + 290, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAEClearSky, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + , !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + , !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + 0.00; !- Clearness {0.0 to 1.1} + + ! Boston Logan Intl AP Annual Cooling Design Conditions Wind Speed=6.3m/s Wind Dir=240 + ! Hottest Month=JUL + ! Boston Logan Intl AP_MA_USA Annual Cooling (DB=>MWB) .4%, MaxDB=32.6C MWB=22.6C + SizingPeriod:DesignDay, + Boston Logan Intl AP Ann Clg .4% Condns DB=>MWB, !- Name + 7, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 32.6, !- Maximum Dry-Bulb Temperature {C} + 8.2, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 22.6, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 6.3, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.472, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.185; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA Annual Cooling (DB=>MWB) 1%, MaxDB=30.9C MWB=22C + SizingPeriod:DesignDay, + Boston Logan Intl AP Ann Clg 1% Condns DB=>MWB, !- Name + 7, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 30.9, !- Maximum Dry-Bulb Temperature {C} + 8.2, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 22, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 6.3, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.472, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.185; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA Annual Cooling (DB=>MWB) 2%, MaxDB=29.1C MWB=21.1C + SizingPeriod:DesignDay, + Boston Logan Intl AP Ann Clg 2% Condns DB=>MWB, !- Name + 7, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 29.1, !- Maximum Dry-Bulb Temperature {C} + 8.2, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 21.1, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 6.3, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.472, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.185; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA Annual Cooling (WB=>MDB) .4%, MDB=29.8C WB=24.3C + SizingPeriod:DesignDay, + Boston Logan Intl AP Ann Clg .4% Condns WB=>MDB, !- Name + 7, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 29.8, !- Maximum Dry-Bulb Temperature {C} + 8.2, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 24.3, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 6.3, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.472, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.185; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA Annual Cooling (WB=>MDB) 1%, MDB=28.3C WB=23.4C + SizingPeriod:DesignDay, + Boston Logan Intl AP Ann Clg 1% Condns WB=>MDB, !- Name + 7, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 28.3, !- Maximum Dry-Bulb Temperature {C} + 8.2, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 23.4, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 6.3, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.472, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.185; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA Annual Cooling (WB=>MDB) 2%, MDB=27.1C WB=22.6C + SizingPeriod:DesignDay, + Boston Logan Intl AP Ann Clg 2% Condns WB=>MDB, !- Name + 7, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 27.1, !- Maximum Dry-Bulb Temperature {C} + 8.2, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 22.6, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 6.3, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.472, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.185; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA Annual Cooling (DP=>MDB) .4%, MDB=26.9C DP=22.6C HR=0.0173 + SizingPeriod:DesignDay, + Boston Logan Intl AP Ann Clg .4% Condns DP=>MDB, !- Name + 7, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 26.9, !- Maximum Dry-Bulb Temperature {C} + 8.2, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Dewpoint, !- Humidity Condition Type + 22.6, !- Dewpoint at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 6.3, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.472, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.185; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA Annual Cooling (DP=>MDB) 1%, MDB=25.9C DP=21.8C HR=0.0165 + SizingPeriod:DesignDay, + Boston Logan Intl AP Ann Clg 1% Condns DP=>MDB, !- Name + 7, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 25.9, !- Maximum Dry-Bulb Temperature {C} + 8.2, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Dewpoint, !- Humidity Condition Type + 21.8, !- Dewpoint at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 6.3, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.472, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.185; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA Annual Cooling (DP=>MDB) 2%, MDB=25.3C DP=21.1C HR=0.0157 + SizingPeriod:DesignDay, + Boston Logan Intl AP Ann Clg 2% Condns DP=>MDB, !- Name + 7, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 25.3, !- Maximum Dry-Bulb Temperature {C} + 8.2, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Dewpoint, !- Humidity Condition Type + 21.1, !- Dewpoint at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 6.3, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.472, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.185; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA Annual Cooling (Enthalpy=>MDB) .4%, MDB=30.1C Enthalpy=73100.0J/kg + SizingPeriod:DesignDay, + Boston Logan Intl AP Ann Clg .4% Condns Enth=>MDB, !- Name + 7, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 30.1, !- Maximum Dry-Bulb Temperature {C} + 8.2, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Enthalpy, !- Humidity Condition Type + , !- Wetbulb or Dewpoint at Maximum Dry-Bulb + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + 73100.0, !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 6.3, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.472, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.185; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA Annual Cooling (Enthalpy=>MDB) 1%, MDB=28.3C Enthalpy=69500.0J/kg + SizingPeriod:DesignDay, + Boston Logan Intl AP Ann Clg 1% Condns Enth=>MDB, !- Name + 7, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 28.3, !- Maximum Dry-Bulb Temperature {C} + 8.2, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Enthalpy, !- Humidity Condition Type + , !- Wetbulb or Dewpoint at Maximum Dry-Bulb + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + 69500.0, !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 6.3, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.472, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.185; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA Annual Cooling (Enthalpy=>MDB) 2%, MDB=27.1C Enthalpy=66500.0J/kg + SizingPeriod:DesignDay, + Boston Logan Intl AP Ann Clg 2% Condns Enth=>MDB, !- Name + 7, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 27.1, !- Maximum Dry-Bulb Temperature {C} + 8.2, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Enthalpy, !- Humidity Condition Type + , !- Wetbulb or Dewpoint at Maximum Dry-Bulb + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + 66500.0, !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 6.3, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.472, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.185; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! ======================= Monthly Design Conditions SizingPeriod:DesignDay ====================== + ! The following monthly design conditions are reproduced from the climate data shown above. + ! Each 12 months are shown for: 2% Drybulb, 2% Wetbulb, 5% Drybulb, .4% Drybulb, .4% Wetbulb + ! + ! Boston Logan Intl AP_MA_USA January (DB=>MCWB) .4%, MaxDB=16C MWB=13.2C taub=0.293 taud=2.505 + SizingPeriod:DesignDay, + Boston Logan Intl AP January .4% Condns DB=>MCWB, !- Name + 1, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 16, !- Maximum Dry-Bulb Temperature {C} + 7.2, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 13.2, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5.5, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.293, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.505; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA February (DB=>MCWB) .4%, MaxDB=15.1C MWB=11.6C taub=0.302 taud=2.493 + SizingPeriod:DesignDay, + Boston Logan Intl AP February .4% Condns DB=>MCWB, !- Name + 2, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 15.1, !- Maximum Dry-Bulb Temperature {C} + 7.4, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 11.6, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5.6, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.302, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.493; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA March (DB=>MCWB) .4%, MaxDB=22.5C MWB=14.1C taub=0.325 taud=2.487 + SizingPeriod:DesignDay, + Boston Logan Intl AP March .4% Condns DB=>MCWB, !- Name + 3, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 22.5, !- Maximum Dry-Bulb Temperature {C} + 7.5, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 14.1, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5.7, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.325, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.487; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA April (DB=>MCWB) .4%, MaxDB=28.5C MWB=16.8C taub=0.37 taud=2.392 + SizingPeriod:DesignDay, + Boston Logan Intl AP April .4% Condns DB=>MCWB, !- Name + 4, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 28.5, !- Maximum Dry-Bulb Temperature {C} + 8.1, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 16.8, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5.5, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.37, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.392; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA May (DB=>MCWB) .4%, MaxDB=31.2C MWB=20.1C taub=0.406 taud=2.329 + SizingPeriod:DesignDay, + Boston Logan Intl AP May .4% Condns DB=>MCWB, !- Name + 5, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 31.2, !- Maximum Dry-Bulb Temperature {C} + 8.2, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 20.1, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 4.9, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.406, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.329; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA June (DB=>MCWB) .4%, MaxDB=33.6C MWB=23C taub=0.452 taud=2.234 + SizingPeriod:DesignDay, + Boston Logan Intl AP June .4% Condns DB=>MCWB, !- Name + 6, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 33.6, !- Maximum Dry-Bulb Temperature {C} + 8.5, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 23, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 4.7, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.452, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.234; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA July (DB=>MCWB) .4%, MaxDB=35.3C MWB=24.5C taub=0.472 taud=2.185 + SizingPeriod:DesignDay, + Boston Logan Intl AP July .4% Condns DB=>MCWB, !- Name + 7, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 35.3, !- Maximum Dry-Bulb Temperature {C} + 8.2, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 24.5, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 4.5, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.472, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.185; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA August (DB=>MCWB) .4%, MaxDB=34C MWB=23.5C taub=0.434 taud=2.278 + SizingPeriod:DesignDay, + Boston Logan Intl AP August .4% Condns DB=>MCWB, !- Name + 8, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 34, !- Maximum Dry-Bulb Temperature {C} + 7.7, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 23.5, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 4.4, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.434, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.278; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA September (DB=>MCWB) .4%, MaxDB=31.3C MWB=22.4C taub=0.376 taud=2.423 + SizingPeriod:DesignDay, + Boston Logan Intl AP September .4% Condns DB=>MCWB, !- Name + 9, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 31.3, !- Maximum Dry-Bulb Temperature {C} + 7.7, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 22.4, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 4.6, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.376, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.423; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA October (DB=>MCWB) .4%, MaxDB=26.8C MWB=18.6C taub=0.335 taud=2.543 + SizingPeriod:DesignDay, + Boston Logan Intl AP October .4% Condns DB=>MCWB, !- Name + 10, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 26.8, !- Maximum Dry-Bulb Temperature {C} + 7.7, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 18.6, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.335, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.543; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA November (DB=>MCWB) .4%, MaxDB=21.2C MWB=15.5C taub=0.311 taud=2.571 + SizingPeriod:DesignDay, + Boston Logan Intl AP November .4% Condns DB=>MCWB, !- Name + 11, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 21.2, !- Maximum Dry-Bulb Temperature {C} + 7, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 15.5, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5.1, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.311, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.571; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA December (DB=>MCWB) .4%, MaxDB=17.4C MWB=14.1C taub=0.295 taud=2.568 + SizingPeriod:DesignDay, + Boston Logan Intl AP December .4% Condns DB=>MCWB, !- Name + 12, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 17.4, !- Maximum Dry-Bulb Temperature {C} + 6.8, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 14.1, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5.5, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.295, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.568; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA January (DB=>MCWB) 2%, MaxDB=12.1C MWB=9.9C taub=0.293 taud=2.505 + SizingPeriod:DesignDay, + Boston Logan Intl AP January 2% Condns DB=>MCWB, !- Name + 1, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 12.1, !- Maximum Dry-Bulb Temperature {C} + 7.2, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 9.9, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5.5, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.293, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.505; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA February (DB=>MCWB) 2%, MaxDB=11.4C MWB=7.8C taub=0.302 taud=2.493 + SizingPeriod:DesignDay, + Boston Logan Intl AP February 2% Condns DB=>MCWB, !- Name + 2, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 11.4, !- Maximum Dry-Bulb Temperature {C} + 7.4, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 7.8, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5.6, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.302, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.493; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA March (DB=>MCWB) 2%, MaxDB=16.2C MWB=10.8C taub=0.325 taud=2.487 + SizingPeriod:DesignDay, + Boston Logan Intl AP March 2% Condns DB=>MCWB, !- Name + 3, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 16.2, !- Maximum Dry-Bulb Temperature {C} + 7.5, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 10.8, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5.7, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.325, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.487; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA April (DB=>MCWB) 2%, MaxDB=22.4C MWB=13.9C taub=0.37 taud=2.392 + SizingPeriod:DesignDay, + Boston Logan Intl AP April 2% Condns DB=>MCWB, !- Name + 4, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 22.4, !- Maximum Dry-Bulb Temperature {C} + 8.1, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 13.9, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5.5, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.37, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.392; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA May (DB=>MCWB) 2%, MaxDB=27.2C MWB=18.1C taub=0.406 taud=2.329 + SizingPeriod:DesignDay, + Boston Logan Intl AP May 2% Condns DB=>MCWB, !- Name + 5, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 27.2, !- Maximum Dry-Bulb Temperature {C} + 8.2, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 18.1, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 4.9, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.406, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.329; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA June (DB=>MCWB) 2%, MaxDB=31.3C MWB=21.7C taub=0.452 taud=2.234 + SizingPeriod:DesignDay, + Boston Logan Intl AP June 2% Condns DB=>MCWB, !- Name + 6, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 31.3, !- Maximum Dry-Bulb Temperature {C} + 8.5, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 21.7, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 4.7, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.452, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.234; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA July (DB=>MCWB) 2%, MaxDB=32.7C MWB=22.9C taub=0.472 taud=2.185 + SizingPeriod:DesignDay, + Boston Logan Intl AP July 2% Condns DB=>MCWB, !- Name + 7, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 32.7, !- Maximum Dry-Bulb Temperature {C} + 8.2, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 22.9, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 4.5, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.472, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.185; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA August (DB=>MCWB) 2%, MaxDB=31.6C MWB=22.6C taub=0.434 taud=2.278 + SizingPeriod:DesignDay, + Boston Logan Intl AP August 2% Condns DB=>MCWB, !- Name + 8, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 31.6, !- Maximum Dry-Bulb Temperature {C} + 7.7, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 22.6, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 4.4, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.434, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.278; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA September (DB=>MCWB) 2%, MaxDB=28.3C MWB=21C taub=0.376 taud=2.423 + SizingPeriod:DesignDay, + Boston Logan Intl AP September 2% Condns DB=>MCWB, !- Name + 9, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 28.3, !- Maximum Dry-Bulb Temperature {C} + 7.7, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 21, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 4.6, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.376, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.423; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA October (DB=>MCWB) 2%, MaxDB=23C MWB=17.4C taub=0.335 taud=2.543 + SizingPeriod:DesignDay, + Boston Logan Intl AP October 2% Condns DB=>MCWB, !- Name + 10, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 23, !- Maximum Dry-Bulb Temperature {C} + 7.7, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 17.4, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.335, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.543; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA November (DB=>MCWB) 2%, MaxDB=18.2C MWB=14.3C taub=0.311 taud=2.571 + SizingPeriod:DesignDay, + Boston Logan Intl AP November 2% Condns DB=>MCWB, !- Name + 11, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 18.2, !- Maximum Dry-Bulb Temperature {C} + 7, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 14.3, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5.1, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.311, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.571; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA December (DB=>MCWB) 2%, MaxDB=13.8C MWB=11.4C taub=0.295 taud=2.568 + SizingPeriod:DesignDay, + Boston Logan Intl AP December 2% Condns DB=>MCWB, !- Name + 12, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 13.8, !- Maximum Dry-Bulb Temperature {C} + 6.8, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 11.4, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5.5, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.295, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.568; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA January (WB=>MCDB) .4%, DB=15.2C WB=14C taub=0.293 taud=2.505 + SizingPeriod:DesignDay, + Boston Logan Intl AP January .4% Condns WB=>MCDB, !- Name + 1, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 15.2, !- Maximum Dry-Bulb Temperature {C} + 7.2, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 14, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5.5, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.293, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.505; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA February (WB=>MCDB) .4%, DB=13.8C WB=12.4C taub=0.302 taud=2.493 + SizingPeriod:DesignDay, + Boston Logan Intl AP February .4% Condns WB=>MCDB, !- Name + 2, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 13.8, !- Maximum Dry-Bulb Temperature {C} + 7.4, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 12.4, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5.6, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.302, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.493; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA March (WB=>MCDB) .4%, DB=20.7C WB=15.6C taub=0.325 taud=2.487 + SizingPeriod:DesignDay, + Boston Logan Intl AP March .4% Condns WB=>MCDB, !- Name + 3, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 20.7, !- Maximum Dry-Bulb Temperature {C} + 7.5, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 15.6, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5.7, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.325, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.487; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA April (WB=>MCDB) .4%, DB=25.8C WB=18.2C taub=0.37 taud=2.392 + SizingPeriod:DesignDay, + Boston Logan Intl AP April .4% Condns WB=>MCDB, !- Name + 4, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 25.8, !- Maximum Dry-Bulb Temperature {C} + 8.1, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 18.2, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5.5, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.37, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.392; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA May (WB=>MCDB) .4%, DB=29C WB=21.5C taub=0.406 taud=2.329 + SizingPeriod:DesignDay, + Boston Logan Intl AP May .4% Condns WB=>MCDB, !- Name + 5, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 29, !- Maximum Dry-Bulb Temperature {C} + 8.2, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 21.5, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 4.9, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.406, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.329; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA June (WB=>MCDB) .4%, DB=31.2C WB=24.6C taub=0.452 taud=2.234 + SizingPeriod:DesignDay, + Boston Logan Intl AP June .4% Condns WB=>MCDB, !- Name + 6, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 31.2, !- Maximum Dry-Bulb Temperature {C} + 8.5, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 24.6, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 4.7, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.452, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.234; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA July (WB=>MCDB) .4%, DB=32.4C WB=25.6C taub=0.472 taud=2.185 + SizingPeriod:DesignDay, + Boston Logan Intl AP July .4% Condns WB=>MCDB, !- Name + 7, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 32.4, !- Maximum Dry-Bulb Temperature {C} + 8.2, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 25.6, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 4.5, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.472, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.185; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA August (WB=>MCDB) .4%, DB=31.4C WB=25.2C taub=0.434 taud=2.278 + SizingPeriod:DesignDay, + Boston Logan Intl AP August .4% Condns WB=>MCDB, !- Name + 8, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 31.4, !- Maximum Dry-Bulb Temperature {C} + 7.7, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 25.2, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 4.4, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.434, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.278; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA September (WB=>MCDB) .4%, DB=28.4C WB=23.9C taub=0.376 taud=2.423 + SizingPeriod:DesignDay, + Boston Logan Intl AP September .4% Condns WB=>MCDB, !- Name + 9, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 28.4, !- Maximum Dry-Bulb Temperature {C} + 7.7, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 23.9, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 4.6, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.376, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.423; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA October (WB=>MCDB) .4%, DB=23.1C WB=20.6C taub=0.335 taud=2.543 + SizingPeriod:DesignDay, + Boston Logan Intl AP October .4% Condns WB=>MCDB, !- Name + 10, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 23.1, !- Maximum Dry-Bulb Temperature {C} + 7.7, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 20.6, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.335, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.543; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA November (WB=>MCDB) .4%, DB=19.8C WB=17.3C taub=0.311 taud=2.571 + SizingPeriod:DesignDay, + Boston Logan Intl AP November .4% Condns WB=>MCDB, !- Name + 11, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 19.8, !- Maximum Dry-Bulb Temperature {C} + 7, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 17.3, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5.1, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.311, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.571; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA December (WB=>MCDB) .4%, DB=16.4C WB=14.8C taub=0.295 taud=2.568 + SizingPeriod:DesignDay, + Boston Logan Intl AP December .4% Condns WB=>MCDB, !- Name + 12, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 16.4, !- Maximum Dry-Bulb Temperature {C} + 6.8, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 14.8, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5.5, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.295, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.568; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA January (WB=>MCDB) 2%, MaxDB=11.7C MWB=10.4C taub=0.293 taud=2.505 + SizingPeriod:DesignDay, + Boston Logan Intl AP January 2% Condns WB=>MCDB, !- Name + 1, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 11.7, !- Maximum Dry-Bulb Temperature {C} + 7.2, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 10.4, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5.5, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.293, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.505; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA February (WB=>MCDB) 2%, MaxDB=11.1C MWB=8.7C taub=0.302 taud=2.493 + SizingPeriod:DesignDay, + Boston Logan Intl AP February 2% Condns WB=>MCDB, !- Name + 2, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 11.1, !- Maximum Dry-Bulb Temperature {C} + 7.4, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 8.7, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5.6, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.302, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.493; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA March (WB=>MCDB) 2%, MaxDB=15.3C MWB=12.1C taub=0.325 taud=2.487 + SizingPeriod:DesignDay, + Boston Logan Intl AP March 2% Condns WB=>MCDB, !- Name + 3, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 15.3, !- Maximum Dry-Bulb Temperature {C} + 7.5, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 12.1, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5.7, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.325, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.487; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA April (WB=>MCDB) 2%, MaxDB=20.9C MWB=15.5C taub=0.37 taud=2.392 + SizingPeriod:DesignDay, + Boston Logan Intl AP April 2% Condns WB=>MCDB, !- Name + 4, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 20.9, !- Maximum Dry-Bulb Temperature {C} + 8.1, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 15.5, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5.5, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.37, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.392; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA May (WB=>MCDB) 2%, MaxDB=24.9C MWB=19.5C taub=0.406 taud=2.329 + SizingPeriod:DesignDay, + Boston Logan Intl AP May 2% Condns WB=>MCDB, !- Name + 5, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 24.9, !- Maximum Dry-Bulb Temperature {C} + 8.2, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 19.5, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 4.9, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.406, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.329; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA June (WB=>MCDB) 2%, MaxDB=29.1C MWB=23.2C taub=0.452 taud=2.234 + SizingPeriod:DesignDay, + Boston Logan Intl AP June 2% Condns WB=>MCDB, !- Name + 6, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 29.1, !- Maximum Dry-Bulb Temperature {C} + 8.5, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 23.2, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 4.7, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.452, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.234; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA July (WB=>MCDB) 2%, MaxDB=30.4C MWB=24.5C taub=0.472 taud=2.185 + SizingPeriod:DesignDay, + Boston Logan Intl AP July 2% Condns WB=>MCDB, !- Name + 7, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 30.4, !- Maximum Dry-Bulb Temperature {C} + 8.2, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 24.5, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 4.5, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.472, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.185; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA August (WB=>MCDB) 2%, MaxDB=28.7C MWB=24C taub=0.434 taud=2.278 + SizingPeriod:DesignDay, + Boston Logan Intl AP August 2% Condns WB=>MCDB, !- Name + 8, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 28.7, !- Maximum Dry-Bulb Temperature {C} + 7.7, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 24, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 4.4, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.434, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.278; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA September (WB=>MCDB) 2%, MaxDB=26.1C MWB=22.4C taub=0.376 taud=2.423 + SizingPeriod:DesignDay, + Boston Logan Intl AP September 2% Condns WB=>MCDB, !- Name + 9, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 26.1, !- Maximum Dry-Bulb Temperature {C} + 7.7, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 22.4, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 4.6, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.376, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.423; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA October (WB=>MCDB) 2%, MaxDB=21.6C MWB=18.7C taub=0.335 taud=2.543 + SizingPeriod:DesignDay, + Boston Logan Intl AP October 2% Condns WB=>MCDB, !- Name + 10, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 21.6, !- Maximum Dry-Bulb Temperature {C} + 7.7, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 18.7, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.335, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.543; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA November (WB=>MCDB) 2%, MaxDB=17.8C MWB=15.3C taub=0.311 taud=2.571 + SizingPeriod:DesignDay, + Boston Logan Intl AP November 2% Condns WB=>MCDB, !- Name + 11, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 17.8, !- Maximum Dry-Bulb Temperature {C} + 7, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 15.3, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5.1, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.311, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.571; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA December (WB=>MCDB) 2%, MaxDB=13.7C MWB=11.9C taub=0.295 taud=2.568 + SizingPeriod:DesignDay, + Boston Logan Intl AP December 2% Condns WB=>MCDB, !- Name + 12, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 13.7, !- Maximum Dry-Bulb Temperature {C} + 6.8, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 11.9, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5.5, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.295, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.568; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA January (DB=>MCWB) 5%, MaxDB=8.9C MWB=6.5C taub=0.293 taud=2.505 + SizingPeriod:DesignDay, + Boston Logan Intl AP January 5% Condns DB=>MCWB, !- Name + 1, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 8.9, !- Maximum Dry-Bulb Temperature {C} + 10, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 6.5, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + 9.2, !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5.5, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.293, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.505; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA February (DB=>MCWB) 5%, MaxDB=8.6C MWB=5.2C taub=0.302 taud=2.493 + SizingPeriod:DesignDay, + Boston Logan Intl AP February 5% Condns DB=>MCWB, !- Name + 2, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 8.6, !- Maximum Dry-Bulb Temperature {C} + 10, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 5.2, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + 8, !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5.6, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.302, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.493; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA March (DB=>MCWB) 5%, MaxDB=12.9C MWB=8.3C taub=0.325 taud=2.487 + SizingPeriod:DesignDay, + Boston Logan Intl AP March 5% Condns DB=>MCWB, !- Name + 3, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 12.9, !- Maximum Dry-Bulb Temperature {C} + 12.1, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 8.3, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + 8.5, !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5.7, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.325, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.487; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA April (DB=>MCWB) 5%, MaxDB=18.8C MWB=12.2C taub=0.37 taud=2.392 + SizingPeriod:DesignDay, + Boston Logan Intl AP April 5% Condns DB=>MCWB, !- Name + 4, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 18.8, !- Maximum Dry-Bulb Temperature {C} + 13.8, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 12.2, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + 7.8, !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5.5, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.37, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.392; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA May (DB=>MCWB) 5%, MaxDB=24.1C MWB=16.4C taub=0.406 taud=2.329 + SizingPeriod:DesignDay, + Boston Logan Intl AP May 5% Condns DB=>MCWB, !- Name + 5, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 24.1, !- Maximum Dry-Bulb Temperature {C} + 13.2, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 16.4, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + 6.6, !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 4.9, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.406, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.329; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA June (DB=>MCWB) 5%, MaxDB=29C MWB=20.7C taub=0.452 taud=2.234 + SizingPeriod:DesignDay, + Boston Logan Intl AP June 5% Condns DB=>MCWB, !- Name + 6, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 29, !- Maximum Dry-Bulb Temperature {C} + 11.9, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 20.7, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + 5.7, !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 4.7, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.452, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.234; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA July (DB=>MCWB) 5%, MaxDB=31C MWB=22.3C taub=0.472 taud=2.185 + SizingPeriod:DesignDay, + Boston Logan Intl AP July 5% Condns DB=>MCWB, !- Name + 7, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 31, !- Maximum Dry-Bulb Temperature {C} + 10.8, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 22.3, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + 4.5, !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 4.5, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.472, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.185; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA August (DB=>MCWB) 5%, MaxDB=29.5C MWB=21.8C taub=0.434 taud=2.278 + SizingPeriod:DesignDay, + Boston Logan Intl AP August 5% Condns DB=>MCWB, !- Name + 8, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 29.5, !- Maximum Dry-Bulb Temperature {C} + 10.4, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 21.8, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + 4.5, !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 4.4, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.434, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.278; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA September (DB=>MCWB) 5%, MaxDB=26.1C MWB=20.1C taub=0.376 taud=2.423 + SizingPeriod:DesignDay, + Boston Logan Intl AP September 5% Condns DB=>MCWB, !- Name + 9, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 26.1, !- Maximum Dry-Bulb Temperature {C} + 10.2, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 20.1, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + 5.4, !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 4.6, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.376, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.423; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA October (DB=>MCWB) 5%, MaxDB=20.7C MWB=16.1C taub=0.335 taud=2.543 + SizingPeriod:DesignDay, + Boston Logan Intl AP October 5% Condns DB=>MCWB, !- Name + 10, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 20.7, !- Maximum Dry-Bulb Temperature {C} + 10.4, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 16.1, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + 6.5, !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.335, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.543; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA November (DB=>MCWB) 5%, MaxDB=16C MWB=12.6C taub=0.311 taud=2.571 + SizingPeriod:DesignDay, + Boston Logan Intl AP November 5% Condns DB=>MCWB, !- Name + 11, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 16, !- Maximum Dry-Bulb Temperature {C} + 9.8, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 12.6, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + 7.7, !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5.1, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.311, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.571; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + ! Boston Logan Intl AP_MA_USA December (DB=>MCWB) 5%, MaxDB=11.3C MWB=8.6C taub=0.295 taud=2.568 + SizingPeriod:DesignDay, + Boston Logan Intl AP December 5% Condns DB=>MCWB, !- Name + 12, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 11.3, !- Maximum Dry-Bulb Temperature {C} + 9.5, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 8.6, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + 8.6, !- Daily Wet-Bulb Temperature Range {deltaC} + 101281., !- Barometric Pressure {Pa} + 5.5, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 240, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.295, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.568; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + diff --git a/tests/resources/weather/USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2004-2018.epw b/tests/resources/weather/USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2004-2018.epw new file mode 100644 index 0000000..955ca2f --- /dev/null +++ b/tests/resources/weather/USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2004-2018.epw @@ -0,0 +1,8768 @@ +LOCATION,Boston Logan Intl AP,MA,USA,ISD-TMYx,725090,42.36100,-71.01000,-5.0,3.7 +DESIGN CONDITIONS,1,2017 ASHRAE Handbook -- Fundamentals - Chapter 14 Climatic Design Information,,Heating,1,-13.1,-10.3,-23.7,0.4,-11.7,-21.1,0.6,-8.6,14.2,3.2,12.6,0,7,290,Cooling,7,8.2,32.6,22.6,30.9,22,29.1,21.1,24.3,29.8,23.4,28.3,22.6,27.1,6.3,240,22.6,17.3,26.9,21.8,16.5,25.9,21.1,15.7,25.3,73.1,30.1,69.5,28.3,66.5,27.1,27,Extremes,12,10.7,9.3,-16,35.3,2.4,1.8,-17.7,36.7,-19.1,37.7,-20.4,38.8,-22.2,40.1,-17.1 +TYPICAL/EXTREME PERIODS,6,Summer - Week Nearest Max Temperature For Period,Extreme,7/13,7/19,Summer - Week Nearest Average Temperature For Period,Typical,8/ 3,8/ 9,Winter - Week Nearest Min Temperature For Period,Extreme,1/27,2/ 2,Winter - Week Nearest Average Temperature For Period,Typical,1/13,1/19,Autumn - Week Nearest Average Temperature For Period,Typical,10/ 6,10/12,Spring - Week Nearest Average Temperature For Period,Typical,4/19,4/25 +GROUND TEMPERATURES,3,.5,,,,1.05,0.04,1.83,4.63,11.94,17.59,21.40,22.56,20.59,16.20,10.34,4.90,2,,,,4.76,2.96,3.33,4.81,9.71,14.14,17.68,19.58,19.17,16.69,12.65,8.37,4,,,,7.83,5.99,5.58,6.14,8.91,11.89,14.63,16.53,16.98,15.90,13.53,10.63 +HOLIDAYS/DAYLIGHT SAVINGS,No,0,0,0 +COMMENTS 1,"NCEI ISD - #years=[15] Period of Record=2004-2018; Jan=2010; Feb=2013; Mar=2008; Apr=2015; May=2014; Jun=2013; Jul=2008; Aug=2015; Sep=2011; Oct=2010; Nov=2016; Dec=2012" +COMMENTS 2,"Downloaded from Climate.Onebuilding.org -- Ground temps represent undisturbed earth temperatures - calculated from this weather data." +DATA PERIODS,1,1,Data,Sunday,1/ 1,12/31 +2010,1,1,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-2.0,-4.0,85,101278,0,0,274,0,0,0,0,0,0,0,320,3.6,10,10,9656.0,1676,9,999999999,7,0.0850,0,88,0.866,0.0,0.0 +2010,1,1,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-2.2,-4.4,83,101483,0,0,273,0,0,0,0,0,0,0,330,2.6,10,10,9000.0,1676,9,999999999,6,0.0850,0,88,0.866,0.0,0.0 +2010,1,1,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-2.8,-4.4,87,101463,0,0,271,0,0,0,0,0,0,0,300,3.6,10,10,6437.0,1524,0,999099999,6,0.0850,0,88,0.866,0.0,0.0 +2010,1,1,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-2.8,-4.4,87,101413,0,0,271,0,0,0,0,0,0,0,310,3.1,10,10,4828.0,518,0,999099999,6,0.0850,0,88,0.866,0.0,0.0 +2010,1,1,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-2.8,-4.4,87,101413,0,0,271,0,0,0,0,0,0,0,310,3.1,10,10,4800.0,518,0,999099999,6,0.0850,0,88,0.866,0.0,0.0 +2010,1,1,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-2.8,-5.0,83,101323,0,0,248,0,0,0,0,0,0,0,320,3.1,5,5,9656.0,77777,0,999099999,6,0.0850,0,88,0.866,0.0,0.0 +2010,1,1,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-2.8,-5.0,83,101313,0,0,270,0,0,0,0,0,0,0,310,3.1,10,10,9656.0,1219,0,999099999,6,0.0850,0,88,0.866,0.0,0.0 +2010,1,1,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-2.8,-5.0,83,101313,42,252,270,4,0,4,387,0,389,154,310,3.1,10,10,9000.0,1219,0,999099999,6,0.0850,0,88,0.866,0.0,0.0 +2010,1,1,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-2.2,-3.9,87,101273,252,1415,274,40,4,39,4617,56,4511,1485,310,2.6,10,10,9656.0,2896,0,999099999,7,0.0850,0,88,0.866,0.0,0.0 +2010,1,1,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-3.3,83,101243,419,1415,279,89,18,85,10157,886,9732,3287,300,2.6,10,10,9656.0,1036,0,999099999,7,0.0850,0,88,0.866,0.0,0.0 +2010,1,1,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-1.1,-3.3,83,101243,533,1415,279,133,31,124,15126,1987,14158,4857,300,2.6,10,10,9656.0,1036,0,999099999,7,0.0850,0,88,0.866,0.0,0.0 +2010,1,1,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-3.0,78,101278,584,1415,284,164,28,152,18550,1987,17268,5888,330,3.6,10,10,9656.0,640,0,999099999,7,0.0850,0,88,0.866,0.0,0.0 +2010,1,1,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-3.3,73,100983,570,1415,286,198,63,172,22109,4732,19296,6290,350,2.6,10,10,9656.0,610,0,999099999,7,0.0850,0,88,0.866,0.0,0.0 +2010,1,1,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.6,-3.3,73,100983,492,1415,278,189,80,159,20868,5718,17638,5448,350,2.6,9,9,9656.0,610,0,999099999,7,0.0850,0,88,0.866,0.0,0.0 +2010,1,1,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.0,-3.0,72,101278,355,1415,280,110,16,103,12138,807,11411,3452,310,3.1,9,9,9656.0,701,0,999099999,7,0.0850,0,88,0.866,0.0,0.0 +2010,1,1,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-2.8,73,100894,168,1415,288,60,2,60,6442,25,6467,1671,310,3.6,10,10,9656.0,1097,0,999099999,8,0.0850,0,88,0.866,0.0,0.0 +2010,1,1,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.1,-2.8,73,100894,0,1066,288,0,0,0,0,0,0,0,310,3.6,10,10,9656.0,1097,0,999099999,8,0.0850,0,88,0.866,0.0,0.0 +2010,1,1,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.0,-2.0,79,100824,0,0,289,0,0,0,0,0,0,0,330,4.1,10,10,9656.0,396,0,999099999,8,0.0850,0,88,0.866,0.0,0.0 +2010,1,1,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.0,-2.0,79,101278,0,0,289,0,0,0,0,0,0,0,330,3.6,10,10,9656.0,244,0,919099999,8,0.0850,0,88,0.866,0.0,0.0 +2010,1,1,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.1,-1.7,80,100774,0,0,290,0,0,0,0,0,0,0,330,4.6,10,10,9656.0,244,0,919099999,8,0.0850,0,88,0.866,0.0,0.0 +2010,1,1,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-1.7,83,100584,0,0,287,0,0,0,0,0,0,0,340,4.1,10,10,9656.0,244,0,919099999,8,0.0850,0,88,0.866,0.0,0.0 +2010,1,1,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-1.7,83,100524,0,0,287,0,0,0,0,0,0,0,340,4.6,10,10,9656.0,244,0,919099999,8,0.0850,0,88,0.866,0.0,0.0 +2010,1,1,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.6,-1.7,83,100524,0,0,287,0,0,0,0,0,0,0,340,4.6,10,10,9656.0,244,0,919099999,8,0.0850,0,88,0.866,0.0,0.0 +2010,1,1,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-1.1,-2.8,87,100323,0,0,279,0,0,0,0,0,0,0,350,6.7,10,10,3219.0,366,0,919099999,8,0.0850,0,88,0.866,0.0,0.0 +2010,1,2,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-1.0,-3.0,85,101278,0,0,279,0,0,0,0,0,0,0,340,6.2,10,10,2414.0,366,0,919099999,7,0.0840,0,88,0.866,0.0,0.0 +2010,1,2,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-1.7,-3.3,87,100273,0,0,276,0,0,0,0,0,0,0,350,6.2,10,10,3200.0,366,0,919099999,7,0.0840,0,88,0.866,0.0,0.0 +2010,1,2,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-2.0,-4.0,85,101278,0,0,274,0,0,0,0,0,0,0,350,6.2,10,10,3219.0,427,0,919099999,7,0.0840,0,88,0.866,0.0,0.0 +2010,1,2,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-3.0,-4.0,92,101278,0,0,270,0,0,0,0,0,0,0,350,6.2,10,10,3219.0,488,0,919099999,7,0.0840,0,88,0.866,0.0,0.0 +2010,1,2,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-2.8,-4.4,87,100213,0,0,271,0,0,0,0,0,0,0,340,5.7,10,10,3200.0,488,0,919099999,6,0.0840,0,88,0.866,0.0,0.0 +2010,1,2,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-3.0,-5.0,84,101278,0,0,269,0,0,0,0,0,0,0,340,5.1,10,10,2816.0,610,0,919099999,6,0.0840,0,88,0.866,0.0,0.0 +2010,1,2,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-3.0,-5.0,84,101278,0,0,269,0,0,0,0,0,0,0,340,5.1,10,10,2816.0,640,0,919099999,6,0.0840,0,88,0.866,0.0,0.0 +2010,1,2,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-3.3,-5.0,87,100073,42,250,268,3,0,3,290,0,292,118,340,5.1,10,10,2000.0,640,0,919099999,6,0.0840,0,88,0.866,0.0,0.0 +2010,1,2,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-3.0,-6.0,77,101278,252,1415,268,12,0,12,1181,0,1189,516,350,6.2,10,10,2414.0,305,0,919099999,6,0.0840,0,88,0.866,0.0,0.0 +2010,1,2,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-3.0,-5.0,84,101278,420,1415,269,40,0,40,3990,0,4020,1748,350,5.1,10,10,1609.0,396,0,919099999,6,0.0840,0,88,0.866,0.0,0.0 +2010,1,2,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-2.8,-5.0,83,99983,534,1415,263,93,6,91,10847,342,10647,3833,350,6.2,9,9,1200.0,396,0,919099999,6,0.0840,0,88,0.866,0.0,0.0 +2010,1,2,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-3.0,-4.0,92,101278,586,1415,270,95,0,95,9602,0,9680,4121,340,5.1,10,10,1207.0,396,0,919099999,7,0.0840,0,88,0.866,0.0,0.0 +2010,1,2,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-2.0,-4.0,85,101278,573,1415,274,170,72,141,19303,4951,16077,5528,340,6.7,10,10,3219.0,457,0,919099999,7,0.0840,0,88,0.866,0.0,0.0 +2010,1,2,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-1.7,-4.4,80,99694,495,1415,275,138,25,129,15515,1612,14562,4803,340,6.7,10,10,3200.0,457,0,919099999,6,0.0840,0,88,0.866,0.0,0.0 +2010,1,2,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-2.0,-4.0,85,101278,358,1415,274,125,41,112,13713,2208,12338,3641,350,5.1,10,10,2414.0,671,0,919099999,7,0.0840,0,88,0.866,0.0,0.0 +2010,1,2,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-2.0,-4.0,85,101278,172,1415,267,53,0,53,5178,0,5214,1589,340,5.1,9,9,1207.0,396,0,919099999,7,0.0840,0,88,0.866,0.0,0.0 +2010,1,2,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-1.7,-3.9,83,99574,0,1086,276,0,0,0,0,0,0,0,330,3.6,10,10,1200.0,396,0,919099999,7,0.0840,0,88,0.866,0.0,0.0 +2010,1,2,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-3.0,-5.0,84,101278,0,0,269,0,0,0,0,0,0,0,320,9.8,10,10,2816.0,762,0,919099999,6,0.0840,0,88,0.866,0.0,0.0 +2010,1,2,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-3.9,-6.7,79,99393,0,0,264,0,0,0,0,0,0,0,320,8.8,10,10,3219.0,762,0,919099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,2,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-3.9,-6.7,79,99393,0,0,264,0,0,0,0,0,0,0,320,8.7,10,10,3200.0,762,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,2,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-4.0,-7.0,77,101277,0,0,263,0,0,0,0,0,0,0,310,10.3,10,10,4828.0,792,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,2,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-4.0,-8.0,71,101277,0,0,262,0,0,0,0,0,0,0,320,10.8,10,10,4828.0,671,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,2,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-4.4,-8.3,71,99053,0,0,261,0,0,0,0,0,0,0,300,11.8,10,10,2800.0,671,0,999099999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,2,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-6.0,-8.0,84,101277,0,0,255,0,0,0,0,0,0,0,300,10.3,10,10,1207.0,305,0,999099999,5,0.0840,0,88,0.866,1.5,0.0 +2010,1,3,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-6.0,-9.0,77,101277,0,0,247,0,0,0,0,0,0,0,290,9.8,9,9,2816.0,579,0,999099999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,3,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-7.2,-9.4,82,98763,0,0,242,0,0,0,0,0,0,0,290,10.3,9,9,1200.0,579,0,999099999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,3,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-8.0,-10.0,84,101277,0,0,239,0,0,0,0,0,0,0,290,12.4,9,9,1609.0,244,0,999099999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,3,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-8.3,-10.6,82,98553,0,0,237,0,0,0,0,0,0,0,290,10.8,9,9,1207.0,274,0,999099999,3,0.0840,0,88,0.866,0.0,0.0 +2010,1,3,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-8.3,-10.6,82,98553,0,0,244,0,0,0,0,0,0,0,290,10.8,10,10,1200.0,274,0,999099999,3,0.0840,0,88,0.866,0.0,0.0 +2010,1,3,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-8.0,-11.0,77,101277,0,0,244,0,0,0,0,0,0,0,290,11.3,10,10,1207.0,274,0,999099999,3,0.0840,0,88,0.866,0.0,0.0 +2010,1,3,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-8.0,-11.0,77,101277,0,0,244,0,0,0,0,0,0,0,290,10.8,10,10,1609.0,335,0,999099999,3,0.0840,0,88,0.866,0.0,0.0 +2010,1,3,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-8.3,-11.1,78,98523,42,249,243,3,0,3,290,0,292,118,290,9.3,10,10,1600.0,335,0,999099999,3,0.0840,0,88,0.866,0.0,0.0 +2010,1,3,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-8.0,-11.0,77,101277,253,1415,244,48,47,39,5548,722,4517,1486,290,10.3,10,10,1609.0,1158,0,999099999,3,0.0840,0,88,0.866,0.0,0.0 +2010,1,3,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-8.0,-11.0,77,101277,421,1415,244,49,6,48,5858,241,5749,2057,300,9.3,10,10,1207.0,274,0,999099999,3,0.0840,0,88,0.866,0.0,0.0 +2010,1,3,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-7.2,-9.4,82,98643,535,1415,249,89,6,87,10427,342,10224,3699,300,9.3,10,10,1200.0,274,0,999099999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,3,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-6.0,-8.0,84,101277,588,1415,255,86,1,85,10202,58,10113,3760,290,8.8,10,10,2012.0,792,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,3,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.0,-8.0,65,101278,575,1415,266,194,65,167,21754,4876,18813,6206,310,8.8,10,10,2012.0,1829,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,3,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.2,-7.8,62,98594,498,1415,262,209,161,147,23276,11200,16444,5241,310,7.7,9,9,2012.0,1829,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,3,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.0,-7.0,60,101278,361,1415,275,133,122,85,14948,5578,9586,3074,320,10.3,10,10,2012.0,823,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,3,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-6.7,68,98884,175,1415,271,78,55,68,8320,1052,7283,1799,320,9.8,10,10,2012.0,792,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,3,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.2,-6.7,68,98884,0,1108,271,0,0,0,0,0,0,0,320,9.8,10,10,2012.0,792,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,3,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-2.0,-6.0,71,101278,0,0,272,0,0,0,0,0,0,0,310,7.7,10,10,4828.0,792,0,999099999,6,0.0840,0,88,0.866,0.0,0.0 +2010,1,3,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-2.0,-6.0,71,101278,0,0,272,0,0,0,0,0,0,0,310,8.8,10,10,3219.0,853,0,999099999,6,0.0840,0,88,0.866,0.0,0.0 +2010,1,3,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-1.7,-5.6,72,99124,0,0,274,0,0,0,0,0,0,0,320,8.7,10,10,4800.0,853,0,999099999,6,0.0840,0,88,0.866,0.0,0.0 +2010,1,3,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-2.0,-6.0,71,101278,0,0,272,0,0,0,0,0,0,0,310,7.2,10,10,2414.0,671,0,999099999,6,0.0840,0,88,0.866,0.0,0.0 +2010,1,3,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-2.0,-5.0,78,101278,0,0,273,0,0,0,0,0,0,0,310,7.7,10,10,3219.0,762,0,999099999,6,0.0840,0,88,0.866,0.0,0.0 +2010,1,3,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-1.1,-5.0,72,99294,0,0,277,0,0,0,0,0,0,0,310,8.2,10,10,4800.0,762,0,999099999,6,0.0840,0,88,0.866,0.0,0.0 +2010,1,3,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-5.6,66,99374,0,0,278,0,0,0,0,0,0,0,300,7.2,10,10,4800.0,1402,0,999099999,6,0.0840,0,88,0.866,0.0,0.0 +2010,1,4,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-5.6,66,99414,0,0,278,0,0,0,0,0,0,0,300,7.7,10,10,4800.0,1341,0,999099999,6,0.0840,0,88,0.866,0.0,0.0 +2010,1,4,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-0.6,-5.6,66,99414,0,0,278,0,0,0,0,0,0,0,300,7.7,10,10,4800.0,1341,0,999099999,6,0.0840,0,88,0.866,0.0,0.0 +2010,1,4,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-5.0,66,99524,0,0,274,0,0,0,0,0,0,0,300,7.2,9,9,4800.0,2286,0,999099999,6,0.0840,0,88,0.866,0.0,0.0 +2010,1,4,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-6.1,66,99584,0,0,249,0,0,0,0,0,0,0,300,6.7,3,3,4800.0,77777,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,4,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-6.1,66,99584,0,0,249,0,0,0,0,0,0,0,300,6.7,3,3,4800.0,77777,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,4,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-6.7,68,99654,0,0,235,0,0,0,0,0,0,0,290,6.7,0,0,4800.0,77777,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,4,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-7.2,65,99674,0,0,244,0,0,0,0,0,0,0,300,8.8,3,3,4800.0,77777,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,4,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-7.2,65,99674,42,249,248,11,127,7,1287,0,820,255,300,8.7,5,5,4800.0,77777,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,4,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-7.8,65,99793,253,1415,245,103,456,31,12118,5128,3653,1227,300,8.2,5,5,4800.0,77777,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,4,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-7.2,60,99844,422,1415,252,233,716,53,27634,29417,6299,2243,310,7.7,5,5,4800.0,77777,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,4,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-7.2,60,99844,537,1415,275,264,485,112,30320,30219,12910,4522,310,7.7,10,10,4800.0,77777,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,4,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-7.2,54,99834,590,1415,272,280,344,151,31750,24660,17197,5893,300,7.7,9,9,4800.0,1829,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,4,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-7.8,49,99834,577,1415,273,260,203,176,29045,15605,19754,6430,300,8.2,9,9,4800.0,1829,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,4,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.6,-7.8,49,99834,501,1415,273,207,116,162,22885,8494,17994,5569,300,8.2,9,9,4800.0,1829,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,4,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-7.2,50,99924,365,1415,276,138,52,120,15089,2989,13178,3822,290,6.2,9,9,4800.0,1676,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,4,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-7.2,52,99964,178,1415,274,117,327,68,12504,6397,7297,1824,300,6.2,9,9,4800.0,1676,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,4,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.6,-7.2,52,99964,0,1130,274,0,0,0,0,0,0,0,300,6.2,9,9,4800.0,1676,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,4,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-6.1,60,100034,0,0,280,0,0,0,0,0,0,0,330,5.7,10,10,4800.0,1219,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,4,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-6.1,66,100114,0,0,276,0,0,0,0,0,0,0,300,5.7,10,10,4800.0,2134,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,4,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-1.1,-6.1,66,100114,0,0,276,0,0,0,0,0,0,0,300,5.7,10,10,4800.0,2134,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,4,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-7.8,59,100163,0,0,272,0,0,0,0,0,0,0,300,6.2,10,10,4800.0,2134,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,4,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-7.8,62,100163,0,0,270,0,0,0,0,0,0,0,300,4.6,10,10,4800.0,1829,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,4,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.2,-7.8,62,100163,0,0,270,0,0,0,0,0,0,0,300,4.6,10,10,4800.0,1829,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,4,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-8.3,59,100143,0,0,269,0,0,0,0,0,0,0,310,5.7,10,10,4800.0,1981,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,5,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.0,-8.0,65,101278,0,0,266,0,0,0,0,0,0,0,310,4.1,10,10,4800.0,732,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,5,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.8,-8.3,62,100123,0,0,267,0,0,0,0,0,0,0,310,4.6,10,10,4800.0,732,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,5,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-7.8,62,100163,0,0,270,0,0,0,0,0,0,0,300,4.6,10,10,4800.0,853,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,5,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-8.3,59,100143,0,0,269,0,0,0,0,0,0,0,300,4.6,10,10,4800.0,853,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,5,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.2,-8.3,59,100143,0,0,269,0,0,0,0,0,0,0,300,4.6,10,10,4800.0,853,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,5,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-8.3,59,100163,0,0,269,0,0,0,0,0,0,0,310,4.1,10,10,4800.0,1524,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,5,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-8.3,59,100173,0,0,269,0,0,0,0,0,0,0,300,5.1,10,10,4800.0,1524,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,5,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.2,-8.3,59,100173,42,250,269,1,0,1,97,0,97,41,300,5.1,10,10,4800.0,1524,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,5,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-8.3,59,100233,254,1415,269,11,0,11,1083,0,1091,475,290,4.6,10,10,4800.0,1676,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,5,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-8.3,59,100223,423,1415,269,52,0,52,5191,0,5231,2208,310,4.1,10,10,4800.0,1676,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,5,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.2,-8.3,59,100223,538,1415,269,154,64,130,17486,4260,14820,5052,310,4.1,10,10,4800.0,1676,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,5,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-7.8,57,100104,592,1415,274,208,95,169,23384,7170,19087,6367,290,5.1,10,10,4800.0,1676,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,5,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-7.8,57,100034,580,1415,274,246,159,180,27446,12356,20179,6537,280,4.6,10,10,4800.0,1676,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,5,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-1.1,-7.8,57,100034,504,1415,274,209,115,164,23099,8479,18211,5630,280,4.6,10,10,4800.0,1676,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,5,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-7.8,54,100014,368,1415,269,194,239,123,21192,14032,13495,3895,280,4.6,9,9,4800.0,1524,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,5,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-7.8,49,100014,182,1415,273,136,377,69,14544,7791,7409,1859,260,2.6,9,9,4800.0,1676,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,5,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.6,-7.8,49,100014,0,1153,273,0,0,0,0,0,0,0,260,2.6,9,9,4800.0,1676,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,5,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-7.2,52,100004,0,0,274,0,0,0,0,0,0,0,310,3.6,9,9,4800.0,1524,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,5,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-6.7,57,100044,0,0,272,0,0,0,0,0,0,0,310,4.6,9,9,4800.0,1463,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,5,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.0,-6.7,57,100044,0,0,272,0,0,0,0,0,0,0,310,4.6,9,9,4800.0,1463,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,5,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-6.1,63,100064,0,0,278,0,0,0,0,0,0,0,320,6.2,10,10,4800.0,1433,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,5,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-6.7,62,100074,0,0,275,0,0,0,0,0,0,0,310,4.1,10,10,4800.0,1097,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,5,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-1.1,-6.7,62,100074,0,0,275,0,0,0,0,0,0,0,310,4.1,10,10,4800.0,1097,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,5,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-7.8,62,100073,0,0,270,0,0,0,0,0,0,0,310,5.7,10,10,4800.0,975,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,6,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.0,-8.0,60,101278,0,0,270,0,0,0,0,0,0,0,320,5.7,10,10,4800.0,884,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,6,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.2,-7.8,62,100063,0,0,270,0,0,0,0,0,0,0,320,5.1,10,10,4800.0,884,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,6,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-8.3,62,100093,0,0,267,0,0,0,0,0,0,0,310,4.1,10,10,4800.0,884,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,6,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-8.3,62,100093,0,0,267,0,0,0,0,0,0,0,300,6.2,10,10,4800.0,884,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,6,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.8,-8.3,62,100093,0,0,231,0,0,0,0,0,0,0,300,6.2,0,0,4800.0,884,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,6,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.9,-9.4,62,100093,0,0,236,0,0,0,0,0,0,0,290,5.1,3,3,4800.0,77777,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,6,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-4.4,-9.4,65,100113,0,0,235,0,0,0,0,0,0,0,280,5.1,3,3,4800.0,77777,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,6,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-4.4,-9.4,65,100113,43,252,235,11,128,7,1289,0,821,255,280,5.1,3,3,4800.0,77777,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,6,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.9,-9.4,62,100163,255,1415,240,103,450,30,12158,5091,3546,1195,280,6.7,5,5,4800.0,77777,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,6,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-9.4,57,100183,424,1415,244,232,709,52,27581,29338,6195,2210,290,6.2,5,5,4800.0,77777,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,6,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-9.4,57,100183,540,1415,244,350,827,66,41936,43448,7927,2937,290,6.2,5,5,4800.0,77777,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,6,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-8.9,49,100034,594,1415,252,425,874,73,51080,49130,8796,3312,310,7.2,5,5,4800.0,77777,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,6,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-8.9,47,99974,583,1415,255,375,638,110,43562,40472,12823,4629,310,6.2,5,5,4800.0,77777,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,6,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-8.9,47,99974,507,1415,255,379,758,89,44049,42581,10377,3687,310,6.2,5,5,4800.0,77777,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,6,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-8.9,45,99994,371,1415,257,278,599,80,31500,27097,9094,2981,290,7.2,5,5,4800.0,77777,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,6,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-8.9,47,100024,186,1415,255,153,391,58,16638,5640,6330,1738,310,7.7,5,5,4800.0,77777,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,6,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-8.9,47,100024,0,1176,255,0,0,0,0,0,0,0,310,7.7,5,5,4800.0,77777,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,6,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-9.4,54,100103,0,0,242,0,0,0,0,0,0,0,290,7.2,3,3,4800.0,77777,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,6,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-10.0,51,100133,0,0,232,0,0,0,0,0,0,0,300,5.7,0,0,4800.0,77777,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,6,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-10.0,51,100133,0,0,242,0,0,0,0,0,0,0,300,5.7,3,3,4800.0,77777,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,6,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-9.4,57,100153,0,0,258,0,0,0,0,0,0,0,290,6.7,9,9,4800.0,2286,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,6,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-9.4,54,100193,0,0,261,0,0,0,0,0,0,0,290,4.1,9,9,4800.0,1981,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,6,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.2,-9.4,54,100193,0,0,261,0,0,0,0,0,0,0,290,4.1,9,9,4800.0,1981,0,999099999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,6,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-8.9,56,100213,0,0,247,0,0,0,0,0,0,0,320,5.7,5,5,4800.0,77777,0,999099999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,7,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-8.9,56,100233,0,0,247,0,0,0,0,0,0,0,310,4.6,5,5,4800.0,77777,0,999099999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,7,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-8.9,56,100233,0,0,261,0,0,0,0,0,0,0,310,4.6,9,9,4800.0,77777,0,999099999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,7,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-8.9,59,100313,0,0,241,0,0,0,0,0,0,0,300,5.7,3,3,4800.0,77777,0,999099999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,7,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-8.9,59,100333,0,0,231,0,0,0,0,0,0,0,300,7.2,0,0,4800.0,77777,0,999099999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,7,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-8.9,59,100333,0,0,244,0,0,0,0,0,0,0,300,7.2,5,5,4800.0,77777,0,999099999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,7,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-8.9,59,100443,0,0,241,0,0,0,0,0,0,0,300,4.6,3,3,4800.0,77777,0,999099999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,7,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-8.9,59,100503,0,0,244,0,0,0,0,0,0,0,300,6.7,5,5,4800.0,77777,0,999099999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,7,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-8.9,59,100503,43,255,244,11,126,7,1289,0,821,255,300,6.7,5,5,4800.0,77777,0,999099999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,7,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-8.3,57,100623,256,1415,249,102,446,30,12042,5049,3547,1196,300,6.7,5,5,4800.0,77777,0,999099999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,7,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-7.8,52,100643,426,1415,256,231,705,52,27466,29080,6196,2213,310,6.2,5,5,4800.0,77777,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,7,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-7.8,52,100643,542,1415,256,351,825,66,42063,43209,7928,2940,310,6.2,5,5,4800.0,77777,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,7,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-7.2,46,100594,597,1415,261,426,877,72,51266,48949,8687,3277,300,6.2,3,3,4800.0,77777,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,7,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-6.7,45,100534,586,1415,265,446,890,73,53499,49422,8779,3296,280,6.2,3,3,4800.0,77777,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,7,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-6.7,45,100534,510,1415,265,408,869,70,48337,44732,8315,3030,280,6.2,3,3,4800.0,77777,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,7,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-7.8,38,100564,375,1415,268,317,808,61,36738,31758,7088,2427,300,6.7,3,3,4800.0,77777,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,7,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-7.2,41,100604,189,1415,267,187,668,45,20802,4523,5020,1502,280,5.7,3,3,4800.0,77777,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,7,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-7.2,41,100604,0,1201,271,0,0,0,0,0,0,0,280,5.7,5,5,4800.0,77777,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,7,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-7.8,44,100724,0,0,264,0,0,0,0,0,0,0,290,5.1,5,5,4800.0,77777,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,7,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-8.3,44,100764,0,0,262,0,0,0,0,0,0,0,290,5.1,5,5,4800.0,77777,0,999099999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,7,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-8.3,44,100764,0,0,258,0,0,0,0,0,0,0,290,5.1,3,3,4800.0,77777,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,7,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-7.2,54,100773,0,0,252,0,0,0,0,0,0,0,270,6.2,3,3,4800.0,77777,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,7,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-7.2,57,100773,0,0,250,0,0,0,0,0,0,0,270,4.6,3,3,4800.0,77777,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,7,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-7.2,57,100773,0,0,250,0,0,0,0,0,0,0,270,4.6,3,3,4800.0,77777,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,7,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-7.2,63,100783,0,0,246,0,0,0,0,0,0,0,280,3.6,3,3,4800.0,77777,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,8,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-7.8,62,100783,0,0,244,0,0,0,0,0,0,0,290,3.1,3,3,4800.0,77777,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,8,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-7.8,62,100783,0,0,270,0,0,0,0,0,0,0,290,3.1,10,10,4800.0,77777,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,8,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-8.3,62,100793,0,0,267,0,0,0,0,0,0,0,330,2.1,10,10,4800.0,4877,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,8,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-4.0,-8.0,71,101277,0,0,262,0,0,0,0,0,0,0,10,1.5,10,10,4800.0,884,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,8,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-3.9,-8.3,68,100713,0,0,263,0,0,0,0,0,0,0,40,1.5,10,10,4800.0,884,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,8,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-8.3,65,100703,0,0,265,0,0,0,0,0,0,0,360,1.5,10,10,4800.0,823,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,8,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-8.3,65,100713,0,0,265,0,0,0,0,0,0,0,350,2.1,10,10,4800.0,762,9,999999999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,8,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-3.3,-8.3,65,100713,44,258,265,4,0,4,387,0,389,154,350,2.1,10,10,4800.0,762,0,999099999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,8,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-4.0,-9.0,65,101277,257,1415,261,33,0,33,3250,0,3273,1299,360,1.5,10,10,2816.0,488,0,999099999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,8,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-4.0,-7.0,77,101277,427,1415,263,119,123,81,13670,6073,9334,3194,330,3.1,10,10,3219.0,1097,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,8,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-4.4,-7.2,79,100603,544,1415,262,172,107,132,19528,7164,15047,5136,360,2.6,10,10,3200.0,1097,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,8,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-4.0,-8.0,71,101277,599,1415,255,279,289,160,31556,21306,18178,6188,330,2.6,9,9,3200.0,701,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,8,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.0,-7.0,71,101278,589,1415,260,249,178,173,27920,13553,19489,6443,312,3.1,9,9,3200.0,2438,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,8,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.8,-8.3,62,100343,514,1415,267,213,176,140,23908,12023,15781,5179,290,4.1,10,10,3200.0,2438,0,999099999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,8,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-8.9,59,100293,379,1415,266,141,77,110,15599,4258,12218,3728,350,4.1,10,10,3200.0,1676,0,999099999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,8,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-3.0,-8.0,65,101278,193,1415,266,75,21,71,8046,485,7647,1959,320,4.1,10,10,9656.0,1494,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,8,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-3.3,-8.3,65,100323,0,1226,265,0,0,0,0,0,0,0,330,4.1,10,10,9656.0,1494,0,999099999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,8,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-4.4,-8.3,71,100443,0,0,261,0,0,0,0,0,0,0,320,4.6,10,10,9656.0,1494,0,999099999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,8,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-4.4,-7.8,75,100503,0,0,261,0,0,0,0,0,0,0,330,5.1,10,10,4828.0,1006,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,8,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-4.4,-7.8,75,100503,0,0,261,0,0,0,0,0,0,0,330,5.1,10,10,4800.0,1006,0,999099999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,8,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-5.0,-8.9,71,100563,0,0,258,0,0,0,0,0,0,0,330,6.2,10,10,8047.0,1676,0,999099999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,8,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-6.0,-9.0,77,101277,0,0,254,0,0,0,0,0,0,0,330,7.2,10,10,8047.0,1676,0,999099999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,8,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-5.6,-8.9,75,100632,0,0,234,0,0,0,0,0,0,0,320,6.2,5,5,8047.0,1676,0,999099999,4,0.0840,0,88,0.866,0.0,0.0 +2010,1,8,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.6,-10.6,65,100732,0,0,254,0,0,0,0,0,0,0,320,6.2,10,10,8047.0,2896,0,999099999,3,0.0840,0,88,0.866,0.0,0.0 +2010,1,9,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-10.6,61,100753,0,0,256,0,0,0,0,0,0,0,310,5.7,10,10,8047.0,2743,0,999099999,3,0.0840,0,88,0.866,0.0,0.0 +2010,1,9,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-5.0,-10.6,61,100753,0,0,256,0,0,0,0,0,0,0,310,5.7,10,10,8047.0,2743,0,999099999,3,0.0840,0,88,0.866,0.0,0.0 +2010,1,9,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-11.1,59,100892,0,0,248,0,0,0,0,0,0,0,320,7.2,9,9,8047.0,2743,0,999099999,3,0.0840,0,88,0.866,0.0,0.0 +2010,1,9,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.6,-11.7,59,100942,0,0,219,0,0,0,0,0,0,0,310,6.7,0,0,8047.0,77777,0,999099999,3,0.0840,0,88,0.866,0.0,0.0 +2010,1,9,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.6,-11.7,59,100942,0,0,219,0,0,0,0,0,0,0,310,6.7,0,0,8047.0,77777,0,999099999,3,0.0840,0,88,0.866,0.0,0.0 +2010,1,9,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-6.1,-12.2,58,101062,0,0,217,0,0,0,0,0,0,0,330,4.1,0,0,8047.0,77777,0,999099999,3,0.0840,0,88,0.866,0.0,0.0 +2010,1,9,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-6.1,-12.2,58,101152,0,0,217,0,0,0,0,0,0,0,320,6.2,0,0,8047.0,77777,0,999099999,3,0.0840,0,88,0.866,0.0,0.0 +2010,1,9,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-6.1,-12.2,58,101152,45,263,226,12,134,7,1409,0,822,256,320,6.2,3,3,8047.0,77777,0,999099999,3,0.0840,0,88,0.866,0.0,0.0 +2010,1,9,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-6.1,-12.8,55,101312,258,1415,226,107,466,31,12618,5996,3661,1233,320,6.2,3,3,8047.0,77777,0,999099999,3,0.0840,0,88,0.866,0.0,0.0 +2010,1,9,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.6,-13.9,48,101392,429,1415,226,243,738,53,28896,31492,6316,2255,320,7.2,3,3,8047.0,77777,0,999099999,3,0.0840,0,88,0.866,0.0,0.0 +2010,1,9,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.6,-13.9,48,101392,547,1415,226,367,859,68,43954,46281,8164,3026,320,7.2,3,3,8047.0,77777,0,999099999,3,0.0840,0,88,0.866,0.0,0.0 +2010,1,9,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.9,-15.6,35,101372,602,1415,231,446,911,75,53616,52603,9040,3406,320,5.1,3,3,8047.0,77777,0,999099999,2,0.0840,0,88,0.866,0.0,0.0 +2010,1,9,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-15.6,34,101353,592,1415,233,467,924,76,55975,53222,9133,3426,340,6.7,3,3,8047.0,77777,0,999099999,2,0.0840,0,88,0.866,0.0,0.0 +2010,1,9,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-15.6,34,101353,517,1415,233,428,903,73,50675,48556,8666,3155,340,6.7,3,3,8047.0,77777,0,999099999,2,0.0840,0,88,0.866,0.0,0.0 +2010,1,9,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-16.7,30,101423,383,1415,232,335,845,64,38797,35579,7432,2541,330,7.7,3,3,8047.0,77777,0,999099999,2,0.0840,0,88,0.866,0.0,0.0 +2010,1,9,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.9,-17.2,31,101472,197,1415,229,201,712,47,22388,7568,5250,1573,320,9.3,3,3,8047.0,77777,0,999099999,2,0.0840,0,88,0.866,0.0,0.0 +2010,1,9,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.9,-17.2,31,101472,0,1251,220,0,0,0,0,0,0,0,320,9.3,0,0,8047.0,77777,0,999099999,2,0.0840,0,88,0.866,0.0,0.0 +2010,1,9,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.6,-17.8,33,101632,0,0,214,0,0,0,0,0,0,0,320,6.2,0,0,8047.0,77777,0,999099999,2,0.0840,0,88,0.866,0.0,0.0 +2010,1,9,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-6.1,-17.8,35,101672,0,0,212,0,0,0,0,0,0,0,320,8.2,0,0,8047.0,77777,0,999099999,2,0.0840,0,88,0.866,0.0,0.0 +2010,1,9,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-6.1,-17.8,35,101672,0,0,212,0,0,0,0,0,0,0,320,8.2,0,0,8047.0,77777,9,999999999,2,0.0840,0,88,0.866,0.0,0.0 +2010,1,9,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-7.8,-18.9,36,101812,0,0,206,0,0,0,0,0,0,0,330,7.7,0,0,8047.0,77777,9,999999999,2,0.0840,0,88,0.866,0.0,0.0 +2010,1,9,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-8.9,-18.9,40,101891,0,0,202,0,0,0,0,0,0,0,330,6.2,0,0,8047.0,77777,9,999999999,2,0.0840,0,88,0.866,0.0,0.0 +2010,1,9,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-8.9,-18.9,40,101891,0,0,202,0,0,0,0,0,0,0,330,6.2,0,0,8047.0,77777,9,999999999,2,0.0840,0,88,0.866,0.0,0.0 +2010,1,9,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-10.6,-21.1,38,101991,0,0,195,0,0,0,0,0,0,0,330,5.7,0,0,8047.0,77777,9,999999999,1,0.0840,0,88,0.866,0.0,0.0 +2010,1,10,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-10.6,-20.6,40,101961,0,0,196,0,0,0,0,0,0,0,320,7.2,0,0,8047.0,77777,9,999999999,1,0.0840,0,88,0.866,0.0,0.0 +2010,1,10,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-10.6,-20.6,40,101961,0,0,196,0,0,0,0,0,0,0,320,7.2,0,0,8047.0,77777,9,999999999,1,0.0840,0,88,0.866,0.0,0.0 +2010,1,10,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-11.1,-20.6,41,101991,0,0,194,0,0,0,0,0,0,0,320,4.6,0,0,8047.0,77777,9,999999999,1,0.0840,0,88,0.866,0.0,0.0 +2010,1,10,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-11.7,-20.0,46,101991,0,0,193,0,0,0,0,0,0,0,330,5.1,0,0,8047.0,77777,9,999999999,1,0.0840,0,88,0.866,0.0,0.0 +2010,1,10,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-11.7,-20.0,46,101991,0,0,193,0,0,0,0,0,0,0,330,5.1,0,0,8047.0,77777,9,999999999,1,0.0840,0,88,0.866,0.0,0.0 +2010,1,10,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-11.1,-20.0,44,102051,0,0,195,0,0,0,0,0,0,0,330,4.6,0,0,8047.0,77777,9,999999999,1,0.0840,0,88,0.866,0.0,0.0 +2010,1,10,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-11.1,-20.0,44,102091,0,0,203,0,0,0,0,0,0,0,330,5.1,3,3,8047.0,77777,9,999999999,1,0.0840,0,88,0.866,0.0,0.0 +2010,1,10,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-11.1,-20.0,44,102091,46,269,206,12,140,7,1411,0,824,257,330,5.1,5,5,8047.0,77777,9,999999999,1,0.0840,0,88,0.866,0.0,0.0 +2010,1,10,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-10.6,-20.0,42,102161,259,1414,208,109,471,31,12868,6508,3665,1235,330,5.1,5,5,8047.0,77777,9,999999999,1,0.0840,0,88,0.866,0.0,0.0 +2010,1,10,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-8.9,-20.0,36,102201,431,1414,213,243,737,53,28924,31980,6322,2258,320,5.1,5,5,8047.0,77777,9,999999999,1,0.0840,0,88,0.866,0.0,0.0 +2010,1,10,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-8.9,-20.0,36,102201,549,1414,213,366,852,68,43877,46474,8172,3031,320,5.1,5,5,8047.0,77777,9,999999999,1,0.0840,0,88,0.866,0.0,0.0 +2010,1,10,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.6,-20.0,27,102032,605,1414,224,444,902,75,53423,52512,9048,3412,310,4.6,5,5,8047.0,77777,9,999999999,1,0.0840,0,88,0.866,0.0,0.0 +2010,1,10,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.9,-20.0,23,101942,596,1414,230,465,916,76,55791,53214,9142,3433,330,5.7,5,5,8047.0,77777,9,999999999,1,0.0840,0,88,0.866,0.0,0.0 +2010,1,10,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.9,-20.0,23,101942,521,1414,230,428,894,74,50679,48783,8786,3200,330,5.7,5,5,8047.0,77777,9,999999999,1,0.0840,0,88,0.866,0.0,0.0 +2010,1,10,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-22.2,17,101882,387,1414,232,285,612,79,32505,29084,9038,3006,340,3.6,5,5,8047.0,77777,9,999999999,1,0.0840,0,88,0.866,0.0,0.0 +2010,1,10,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-21.7,18,101872,202,1414,246,156,428,61,17041,8437,6687,1867,310,5.1,9,9,8047.0,4572,9,999999999,1,0.0840,0,88,0.866,0.0,0.0 +2010,1,10,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.8,-21.7,18,101872,0,1277,246,0,0,0,0,0,0,0,310,5.1,9,9,8047.0,4572,9,999999999,1,0.0840,0,88,0.866,0.0,0.0 +2010,1,10,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.9,-20.6,22,101952,0,0,230,0,0,0,0,0,0,0,290,4.1,5,5,8047.0,77777,9,999999999,1,0.0840,0,88,0.866,0.0,0.0 +2010,1,10,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-20.6,24,101952,0,0,239,0,0,0,0,0,0,0,300,5.7,9,9,8047.0,4267,9,999999999,1,0.0840,0,88,0.866,0.0,0.0 +2010,1,10,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-5.0,-20.6,24,101952,0,0,222,0,0,0,0,0,0,0,300,5.7,3,3,8047.0,4267,9,999999999,1,0.0840,0,88,0.866,0.0,0.0 +2010,1,10,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-6.1,-17.8,35,101962,0,0,212,0,0,0,0,0,0,0,280,4.6,0,0,8047.0,77777,9,999999999,2,0.0840,0,88,0.866,0.0,0.0 +2010,1,10,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-6.1,-16.7,39,101922,0,0,213,0,0,0,0,0,0,0,280,4.6,0,0,8047.0,77777,9,999999999,2,0.0840,0,88,0.866,0.0,0.0 +2010,1,10,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-6.1,-16.7,39,101922,0,0,213,0,0,0,0,0,0,0,280,4.6,0,0,8047.0,77777,9,999999999,2,0.0840,0,88,0.866,0.0,0.0 +2010,1,10,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-6.7,-15.6,45,101852,0,0,212,0,0,0,0,0,0,0,270,6.2,0,0,8047.0,77777,9,999999999,2,0.0840,0,88,0.866,0.0,0.0 +2010,1,11,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-6.7,-14.4,50,101822,0,0,213,0,0,0,0,0,0,0,280,5.1,0,0,8047.0,77777,9,999999999,2,0.0830,0,88,0.866,0.0,0.0 +2010,1,11,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-6.7,-14.4,50,101822,0,0,213,0,0,0,0,0,0,0,280,5.1,0,0,8047.0,77777,9,999999999,2,0.0830,0,88,0.866,0.0,0.0 +2010,1,11,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-6.7,-13.3,56,101802,0,0,214,0,0,0,0,0,0,0,290,4.1,0,0,8047.0,77777,9,999999999,3,0.0830,0,88,0.866,0.0,0.0 +2010,1,11,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-6.7,-12.8,58,101762,0,0,214,0,0,0,0,0,0,0,280,3.1,0,0,8047.0,77777,9,999999999,3,0.0830,0,88,0.866,0.0,0.0 +2010,1,11,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-6.7,-12.8,58,101762,0,0,214,0,0,0,0,0,0,0,280,3.1,0,0,8047.0,77777,9,999999999,3,0.0830,0,88,0.866,0.0,0.0 +2010,1,11,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-7.8,-12.8,64,101762,0,0,211,0,0,0,0,0,0,0,230,3.6,0,0,8047.0,77777,9,999999999,3,0.0830,0,88,0.866,0.0,0.0 +2010,1,11,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-6.7,-11.7,64,101772,0,0,215,0,0,0,0,0,0,0,260,4.1,0,0,8047.0,77777,9,999999999,3,0.0830,0,88,0.866,0.0,0.0 +2010,1,11,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-6.7,-11.7,64,101772,47,275,215,11,86,8,1281,0,932,289,260,4.1,0,0,8047.0,77777,9,999999999,3,0.0830,0,88,0.866,0.0,0.0 +2010,1,11,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.9,-10.0,59,101752,261,1414,226,103,386,39,11939,6431,4530,1501,260,4.1,0,0,8047.0,77777,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,11,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-10.0,54,101742,433,1414,240,234,627,70,27246,29603,8173,2859,280,4.6,3,3,8047.0,77777,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,11,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-10.0,54,101742,552,1414,240,356,758,88,41822,43943,10369,3778,280,4.6,3,3,8047.0,77777,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,11,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-8.9,47,101563,608,1414,255,433,819,96,51097,50168,11365,4220,270,5.1,5,5,8047.0,77777,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,11,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-8.9,43,101493,599,1414,259,455,835,97,53554,51113,11454,4231,270,5.1,5,5,8047.0,77777,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,11,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-8.9,43,101493,525,1414,259,417,813,93,48493,47060,10850,3875,270,5.1,5,5,8047.0,77777,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,11,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-8.9,40,101433,391,1414,263,326,741,82,37066,35118,9354,3104,260,5.1,5,5,8047.0,77777,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,11,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-8.9,43,101433,206,1414,259,194,583,62,21178,11373,6792,1904,280,5.1,5,5,8047.0,77777,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,11,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-8.9,43,101433,0,1304,259,0,0,0,0,0,0,0,280,5.1,5,5,8047.0,77777,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,11,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-8.9,47,101503,0,0,270,0,0,0,0,0,0,0,280,5.1,9,9,8047.0,7620,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,11,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-8.9,49,101523,0,0,267,0,0,0,0,0,0,0,290,5.7,9,9,8047.0,7620,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,11,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-0.6,-8.9,49,101523,0,0,267,0,0,0,0,0,0,0,290,5.7,9,9,8047.0,7620,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,11,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-8.9,51,101553,0,0,265,0,0,0,0,0,0,0,280,7.2,9,9,8047.0,7620,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,11,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-8.9,51,101533,0,0,265,0,0,0,0,0,0,0,290,5.7,9,9,8047.0,4267,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,11,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-1.1,-8.9,51,101533,0,0,273,0,0,0,0,0,0,0,290,5.7,10,10,8047.0,4267,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,11,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-8.9,54,101483,0,0,271,0,0,0,0,0,0,0,280,4.6,10,10,8047.0,2743,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,12,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-8.9,54,101463,0,0,271,0,0,0,0,0,0,0,280,5.7,10,10,8047.0,2896,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,12,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-1.7,-8.9,54,101463,0,0,271,0,0,0,0,0,0,0,280,5.7,10,10,8047.0,2896,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,12,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-8.9,56,101473,0,0,261,0,0,0,0,0,0,0,290,4.1,9,9,8047.0,4267,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,12,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-8.9,56,101443,0,0,261,0,0,0,0,0,0,0,290,5.1,9,9,8047.0,4267,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,12,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.2,-8.9,56,101443,0,0,269,0,0,0,0,0,0,0,290,5.1,10,10,8047.0,4267,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,12,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-8.3,59,101413,0,0,269,0,0,0,0,0,0,0,290,4.6,10,10,8047.0,3048,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,12,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-7.8,62,101413,0,0,270,0,0,0,0,0,0,0,280,5.1,10,10,8047.0,2591,9,999999999,5,0.0830,0,88,0.866,0.0,0.0 +2010,1,12,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.2,-7.8,62,101413,48,282,262,7,0,7,677,0,682,258,280,5.1,9,9,8047.0,2591,9,999999999,5,0.0830,0,88,0.866,0.0,0.0 +2010,1,12,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-7.2,65,101403,263,1414,263,50,40,44,5742,750,5064,1658,290,6.2,9,9,8047.0,7620,9,999999999,5,0.0830,0,88,0.866,0.0,0.0 +2010,1,12,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-7.2,60,101413,435,1414,267,134,189,89,15310,9857,10202,3460,320,5.7,9,9,8047.0,2896,9,999999999,5,0.0830,0,88,0.866,0.0,0.0 +2010,1,12,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-1.1,-7.2,60,101413,554,1414,275,188,186,136,21340,12655,15501,5298,320,5.7,10,10,8047.0,2896,9,999999999,5,0.0830,0,88,0.866,0.0,0.0 +2010,1,12,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-7.8,54,101263,611,1414,276,227,120,176,25540,9229,19895,6670,330,5.7,10,10,8047.0,2743,9,999999999,5,0.0830,0,88,0.866,0.0,0.0 +2010,1,12,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-8.9,47,101163,603,1414,255,321,397,150,36528,28543,17142,5938,320,5.1,5,5,8047.0,77777,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,12,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-8.9,47,101163,529,1414,270,379,683,110,43530,42283,12680,4431,320,5.1,9,9,8047.0,77777,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,12,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-8.9,47,101083,395,1414,270,290,561,94,32648,28802,10620,3442,310,4.6,9,9,8047.0,1250,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,12,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-10.0,47,101123,210,1414,264,188,569,59,20651,10582,6503,1871,330,8.8,9,9,8047.0,1311,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,12,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-1.1,-10.0,47,101123,0,1331,246,0,0,0,0,0,0,0,330,8.7,3,3,8047.0,1311,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,12,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.9,-13.3,44,101312,0,0,233,0,0,0,0,0,0,0,330,8.2,3,3,8047.0,77777,9,999999999,3,0.0830,0,88,0.866,0.0,0.0 +2010,1,12,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-15.0,41,101372,0,0,227,0,0,0,0,0,0,0,340,6.2,3,3,8047.0,77777,9,999999999,2,0.0830,0,88,0.866,0.0,0.0 +2010,1,12,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-15.0,41,101372,0,0,227,0,0,0,0,0,0,0,340,6.2,3,3,8047.0,77777,9,999999999,2,0.0830,0,88,0.866,0.0,0.0 +2010,1,12,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-7.2,-16.1,45,101492,0,0,210,0,0,0,0,0,0,0,340,8.2,0,0,8047.0,77777,9,999999999,2,0.0830,0,88,0.866,0.0,0.0 +2010,1,12,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-7.8,-16.1,47,101562,0,0,208,0,0,0,0,0,0,0,310,5.1,0,0,8047.0,77777,9,999999999,2,0.0830,0,88,0.866,0.0,0.0 +2010,1,12,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-7.8,-16.1,47,101562,0,0,208,0,0,0,0,0,0,0,310,5.1,0,0,8047.0,77777,9,999999999,2,0.0830,0,88,0.866,0.0,0.0 +2010,1,12,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-8.9,-16.7,49,101671,0,0,204,0,0,0,0,0,0,0,320,5.7,0,0,8047.0,77777,9,999999999,2,0.0830,0,88,0.866,0.0,0.0 +2010,1,13,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-9.4,-17.2,49,101661,0,0,202,0,0,0,0,0,0,0,320,5.1,0,0,8047.0,77777,9,999999999,2,0.0830,0,88,0.866,0.0,0.0 +2010,1,13,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-9.4,-17.2,49,101661,0,0,202,0,0,0,0,0,0,0,320,5.1,0,0,8047.0,77777,9,999999999,2,0.0830,0,88,0.866,0.0,0.0 +2010,1,13,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-9.4,-17.8,46,101681,0,0,202,0,0,0,0,0,0,0,310,5.7,0,0,8047.0,77777,9,999999999,2,0.0830,0,88,0.866,0.0,0.0 +2010,1,13,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-9.4,-18.3,44,101641,0,0,201,0,0,0,0,0,0,0,310,5.7,0,0,8047.0,77777,9,999999999,2,0.0830,0,88,0.866,0.0,0.0 +2010,1,13,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-9.4,-18.3,44,101641,0,0,201,0,0,0,0,0,0,0,310,5.7,0,0,8047.0,77777,9,999999999,2,0.0830,0,88,0.866,0.0,0.0 +2010,1,13,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-9.4,-18.9,42,101701,0,0,225,0,0,0,0,0,0,0,300,7.2,9,9,8047.0,4572,9,999999999,2,0.0830,0,88,0.866,0.0,0.0 +2010,1,13,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-9.4,-18.9,42,101731,0,0,225,0,0,0,0,0,0,0,300,5.1,9,9,8047.0,7620,9,999999999,2,0.0830,0,88,0.866,0.0,0.0 +2010,1,13,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-9.4,-18.9,42,101731,50,291,213,13,0,13,1260,0,1268,430,300,5.1,5,5,8047.0,7620,9,999999999,2,0.0830,0,88,0.866,0.0,0.0 +2010,1,13,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-7.8,-20.0,33,101862,265,1414,217,112,469,33,13183,7352,3891,1310,310,5.1,5,5,8047.0,77777,9,999999999,1,0.0830,0,88,0.866,0.0,0.0 +2010,1,13,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.6,-21.7,23,101912,438,1414,219,247,732,55,29369,32666,6554,2343,320,8.2,3,3,8047.0,77777,9,999999999,1,0.0830,0,88,0.866,0.0,0.0 +2010,1,13,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.6,-21.7,23,101912,557,1414,219,370,844,70,44339,46822,8409,3124,320,8.2,3,3,8047.0,77777,9,999999999,1,0.0830,0,88,0.866,0.0,0.0 +2010,1,13,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-22.2,17,101792,615,1414,232,446,886,78,53612,52518,9401,3551,320,5.1,5,5,8047.0,77777,9,999999999,1,0.0830,0,88,0.866,0.0,0.0 +2010,1,13,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-21.7,17,101733,606,1414,236,414,712,107,48486,46093,12574,4607,320,6.2,5,5,8047.0,77777,9,999999999,1,0.0830,0,88,0.866,0.0,0.0 +2010,1,13,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-21.7,17,101733,533,1414,250,365,641,103,42230,39616,11958,4228,320,6.2,9,9,8047.0,77777,9,999999999,1,0.0830,0,88,0.866,0.0,0.0 +2010,1,13,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-11.7,48,101802,399,1414,254,250,421,106,27914,23416,11881,3754,300,7.2,9,9,8047.0,6096,9,999999999,3,0.0830,0,88,0.866,0.0,0.0 +2010,1,13,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-4.4,-10.0,61,101842,215,1414,259,109,116,70,11826,2921,7623,2079,280,5.7,10,10,8047.0,1676,0,999099999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,13,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-4.4,-10.0,61,101842,0,1359,259,0,0,0,0,0,0,0,280,5.7,10,10,8047.0,1676,0,999099999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,13,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-12.2,44,101842,0,0,263,0,0,0,0,0,0,0,290,5.1,10,10,8047.0,3353,0,999099999,3,0.0830,0,88,0.866,0.0,0.0 +2010,1,13,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-9.4,57,101872,0,0,266,0,0,0,0,0,0,0,280,7.2,10,10,8047.0,2438,0,999099999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,13,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.8,-9.4,57,101872,0,0,266,0,0,0,0,0,0,0,280,7.2,10,10,8047.0,2438,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,13,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-9.4,57,101922,0,0,266,0,0,0,0,0,0,0,300,5.7,10,10,8047.0,2438,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,13,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-9.4,57,101972,0,0,258,0,0,0,0,0,0,0,300,4.6,9,9,8047.0,1829,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,13,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.8,-9.4,57,101972,0,0,258,0,0,0,0,0,0,0,300,4.6,9,9,8047.0,1829,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,13,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-9.4,59,102022,0,0,242,0,0,0,0,0,0,0,290,4.1,5,5,8047.0,77777,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,14,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-9.4,57,102072,0,0,266,0,0,0,0,0,0,0,310,4.1,10,10,8047.0,1981,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,14,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.8,-9.4,57,102072,0,0,258,0,0,0,0,0,0,0,310,4.1,9,9,8047.0,1981,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,14,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-4.4,-10.0,61,102182,0,0,224,0,0,0,0,0,0,0,330,3.6,0,0,8047.0,77777,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,14,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-4.4,-10.0,61,102202,0,0,234,0,0,0,0,0,0,0,350,2.6,3,3,8047.0,77777,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,14,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-4.4,-10.0,61,102202,0,0,234,0,0,0,0,0,0,0,350,2.6,3,3,8047.0,77777,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,14,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.6,-10.6,65,102302,0,0,220,0,0,0,0,0,0,0,10,2.6,0,0,8047.0,77777,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,14,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.6,-11.1,62,102372,0,0,229,0,0,0,0,0,0,0,300,1.5,3,3,8047.0,77777,9,999999999,3,0.0830,0,88,0.866,0.0,0.0 +2010,1,14,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.6,-11.1,62,102372,51,300,229,13,126,8,1520,0,936,291,300,1.5,3,3,8047.0,77777,9,999999999,3,0.0830,0,88,0.866,0.0,0.0 +2010,1,14,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-10.0,54,102472,267,1414,230,110,447,34,12915,6898,3999,1346,357,0.0,0,0,8047.0,77777,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,14,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-9.4,54,102492,440,1414,246,246,704,59,29078,31441,6990,2493,3,0.0,5,5,8047.0,77777,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,14,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-9.4,54,102492,560,1414,246,370,823,74,44131,45435,8849,3284,184,0.0,5,5,8047.0,77777,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,14,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-7.8,57,102412,618,1414,252,447,870,83,53443,51161,9952,3755,120,1.5,5,5,8047.0,77777,9,999999999,5,0.0830,0,88,0.866,0.0,0.0 +2010,1,14,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-8.3,49,102363,610,1414,255,469,876,87,55790,52076,10380,3891,130,2.1,5,5,8047.0,77777,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,14,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-8.3,49,102363,537,1414,255,433,857,83,50936,48027,9792,3564,130,2.1,5,5,8047.0,77777,9,999999999,4,0.0830,0,88,0.866,0.0,0.0 +2010,1,14,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-5.6,60,102323,404,1414,260,341,790,75,39167,36103,8640,2941,110,4.1,5,5,8047.0,77777,9,999999999,6,0.0830,0,88,0.866,0.0,0.0 +2010,1,14,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-5.6,62,102303,219,1414,258,209,645,58,23064,11983,6422,1888,120,4.1,5,5,8047.0,77777,9,999999999,6,0.0830,0,88,0.866,0.0,0.0 +2010,1,14,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-5.6,62,102303,0,1387,258,0,0,0,0,0,0,0,120,4.1,5,5,8047.0,77777,9,999999999,6,0.0830,0,88,0.866,0.0,0.0 +2010,1,14,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-6.1,60,102263,0,0,257,0,0,0,0,0,0,0,200,3.1,5,5,8047.0,77777,9,999999999,5,0.0830,0,88,0.866,0.0,0.0 +2010,1,14,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-6.7,60,102263,0,0,255,0,0,0,0,0,0,0,190,3.6,5,5,8047.0,77777,9,999999999,5,0.0830,0,88,0.866,0.0,0.0 +2010,1,14,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-6.7,60,102263,0,0,255,0,0,0,0,0,0,0,190,3.6,5,5,8047.0,77777,9,999999999,5,0.0830,0,88,0.866,0.0,0.0 +2010,1,14,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-6.7,65,102202,0,0,236,0,0,0,0,0,0,0,200,5.1,0,0,8047.0,77777,9,999999999,5,0.0830,0,88,0.866,0.0,0.0 +2010,1,14,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-5.6,72,102152,0,0,237,0,0,0,0,0,0,0,200,4.1,0,0,8047.0,77777,9,999999999,6,0.0830,0,88,0.866,0.0,0.0 +2010,1,14,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-5.6,72,102152,0,0,252,0,0,0,0,0,0,0,200,4.1,5,5,8047.0,77777,9,999999999,6,0.0830,0,88,0.866,0.0,0.0 +2010,1,14,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-3.3,83,102023,0,0,271,0,0,0,0,0,0,0,220,4.6,9,9,8047.0,1128,9,999999999,7,0.0830,0,88,0.866,0.0,0.0 +2010,1,15,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-2.2,80,101953,0,0,287,0,0,0,0,0,0,0,220,7.7,10,10,8047.0,1128,9,999999999,8,0.0830,0,88,0.866,0.0,0.0 +2010,1,15,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.6,-2.2,80,101953,0,0,259,0,0,0,0,0,0,0,220,7.7,3,3,8047.0,1128,9,999999999,8,0.0830,0,88,0.866,0.0,0.0 +2010,1,15,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-3.9,72,101843,0,0,259,0,0,0,0,0,0,0,230,6.2,5,5,8047.0,77777,9,999999999,7,0.0830,0,88,0.866,0.0,0.0 +2010,1,15,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-4.4,73,101783,0,0,257,0,0,0,0,0,0,0,230,5.7,5,5,8047.0,77777,9,999999999,6,0.0830,0,88,0.866,0.0,0.0 +2010,1,15,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-4.4,73,101783,0,0,272,0,0,0,0,0,0,0,230,5.7,9,9,8047.0,77777,9,999999999,6,0.0830,0,88,0.866,0.0,0.0 +2010,1,15,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-3.9,72,101653,0,0,275,0,0,0,0,0,0,0,230,4.6,9,9,8047.0,4267,9,999999999,7,0.0830,0,88,0.866,0.0,0.0 +2010,1,15,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-4.4,66,101653,0,0,277,0,0,0,0,0,0,0,230,3.6,9,9,8047.0,7620,9,999999999,6,0.0830,0,88,0.866,0.0,0.0 +2010,1,15,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.6,-4.4,66,101653,53,310,277,8,0,8,774,0,779,293,230,3.6,9,9,8047.0,7620,9,999999999,6,0.0830,0,88,0.866,0.0,0.0 +2010,1,15,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-3.9,62,101663,269,1414,292,72,158,45,8267,3085,5179,1701,240,4.1,10,10,8047.0,1829,9,999999999,7,0.0830,0,88,0.866,0.0,0.0 +2010,1,15,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-4.4,57,101683,443,1414,294,93,74,78,10754,3633,9046,3146,250,5.1,10,10,8047.0,1829,9,999999999,6,0.0830,0,88,0.866,0.0,0.0 +2010,1,15,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,-4.4,57,101683,563,1414,286,167,123,121,19164,7928,13938,4907,250,5.1,9,9,8047.0,1829,9,999999999,6,0.0830,0,88,0.866,0.0,0.0 +2010,1,15,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-3.3,51,101504,622,1414,299,356,561,116,41468,36125,13561,4970,270,3.1,9,9,8047.0,7620,9,999999999,7,0.0830,0,88,0.866,0.0,0.0 +2010,1,15,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,-2.8,48,101444,614,1414,306,394,670,100,46358,40871,11805,4384,280,4.1,9,9,8047.0,7620,9,999999999,7,0.0830,0,88,0.866,0.0,0.0 +2010,1,15,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.2,-2.8,48,101444,542,1414,289,354,601,106,40848,36192,12275,4355,280,4.1,5,5,8047.0,7620,9,999999999,7,0.0830,0,88,0.866,0.0,0.0 +2010,1,15,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-1.7,54,101504,408,1414,314,200,206,117,22166,11835,13021,4046,280,6.2,10,10,8047.0,1219,9,999999999,8,0.0830,0,88,0.866,0.0,0.0 +2010,1,15,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-1.7,56,101574,224,1414,311,105,58,88,11199,1970,9427,2356,280,7.2,10,10,8047.0,1341,9,999999999,8,0.0830,0,88,0.866,0.0,0.0 +2010,1,15,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.1,-1.7,56,101574,0,1416,311,0,0,0,0,0,0,0,280,7.2,10,10,8047.0,1341,9,999999999,8,0.0830,0,88,0.866,0.0,0.0 +2010,1,15,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-1.1,61,101724,0,0,310,0,0,0,0,0,0,0,280,4.6,10,10,8047.0,1250,9,999999999,9,0.0830,0,88,0.866,0.0,0.0 +2010,1,15,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-1.1,61,101774,0,0,310,0,0,0,0,0,0,0,230,6.7,10,10,8047.0,1402,9,999999999,9,0.0830,0,88,0.866,0.0,0.0 +2010,1,15,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.6,-1.1,61,101774,0,0,310,0,0,0,0,0,0,0,230,6.7,10,10,8047.0,1402,9,999999999,9,0.0830,0,88,0.866,0.0,0.0 +2010,1,15,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-1.1,64,101834,0,0,307,0,0,0,0,0,0,0,280,6.2,10,10,8047.0,1341,9,999999999,9,0.0830,0,88,0.866,0.0,0.0 +2010,1,15,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-1.7,63,101854,0,0,279,0,0,0,0,0,0,0,280,8.2,5,5,8047.0,77777,9,999999999,8,0.0830,0,88,0.866,0.0,0.0 +2010,1,15,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-1.7,63,101854,0,0,263,0,0,0,0,0,0,0,280,8.2,0,0,8047.0,77777,9,999999999,8,0.0830,0,88,0.866,0.0,0.0 +2010,1,15,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-2.2,63,101904,0,0,261,0,0,0,0,0,0,0,270,4.1,0,0,8047.0,77777,9,999999999,8,0.0830,0,88,0.866,0.0,0.0 +2010,1,16,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-2.8,63,101903,0,0,258,0,0,0,0,0,0,0,280,5.7,0,0,8047.0,77777,9,999999999,8,0.0830,0,88,0.866,0.0,0.0 +2010,1,16,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-2.8,63,101903,0,0,258,0,0,0,0,0,0,0,280,5.7,0,0,8047.0,77777,9,999999999,8,0.0830,0,88,0.866,0.0,0.0 +2010,1,16,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-3.3,67,101823,0,0,252,0,0,0,0,0,0,0,240,3.1,0,0,8047.0,77777,9,999999999,7,0.0830,0,88,0.866,0.0,0.0 +2010,1,16,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-3.3,73,101923,0,0,248,0,0,0,0,0,0,0,240,4.6,0,0,8047.0,77777,9,999999999,7,0.0830,0,88,0.866,0.0,0.0 +2010,1,16,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-3.3,73,101923,0,0,262,0,0,0,0,0,0,0,240,4.6,5,5,8047.0,77777,9,999999999,7,0.0830,0,88,0.866,0.0,0.0 +2010,1,16,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-3.3,76,101853,0,0,275,0,0,0,0,0,0,0,240,3.1,9,9,8047.0,3658,9,999999999,7,0.0830,0,88,0.866,0.0,0.0 +2010,1,16,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-2.8,76,101853,0,0,278,0,0,0,0,0,0,0,250,4.1,9,9,8047.0,3658,9,999999999,8,0.0830,0,88,0.866,0.0,0.0 +2010,1,16,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.6,-2.8,76,101853,55,321,263,13,0,13,1257,0,1266,437,250,4.1,5,5,8047.0,3658,9,999999999,8,0.0830,0,88,0.866,0.0,0.0 +2010,1,16,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-2.8,73,101853,272,1414,265,110,418,37,12836,6759,4325,1453,230,5.7,5,5,8047.0,77777,9,999999999,8,0.0830,0,88,0.866,0.0,0.0 +2010,1,16,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-2.2,66,101843,446,1414,270,245,675,63,28816,30199,7428,2647,240,5.1,3,3,8047.0,77777,9,999999999,8,0.0830,0,88,0.866,0.0,0.0 +2010,1,16,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-2.2,66,101843,567,1414,270,369,799,79,43796,44032,9403,3488,240,5.1,3,3,8047.0,77777,9,999999999,8,0.0830,0,88,0.866,0.0,0.0 +2010,1,16,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-2.2,56,101654,626,1414,279,448,853,86,53440,49836,10289,3888,260,5.1,3,3,8047.0,77777,9,999999999,8,0.0830,0,88,0.866,0.0,0.0 +2010,1,16,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,-2.2,50,101544,619,1414,285,472,868,88,56127,50882,10496,3949,250,3.1,3,3,8047.0,77777,9,999999999,8,0.0830,0,88,0.866,0.0,0.0 +2010,1,16,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,-2.2,50,101544,546,1414,285,436,849,84,51282,47012,9909,3622,250,3.1,3,3,8047.0,77777,9,999999999,8,0.0830,0,88,0.866,0.0,0.0 +2010,1,16,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,-3.3,42,101464,413,1414,289,345,783,76,39663,36172,8764,2998,260,5.7,3,3,8047.0,77777,9,999999999,7,0.0830,0,88,0.866,0.0,0.0 +2010,1,16,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,-3.3,42,101554,228,1414,289,212,636,59,23444,12678,6546,1947,260,7.7,3,3,8047.0,77777,9,999999999,7,0.0830,0,88,0.866,0.0,0.0 +2010,1,16,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,-3.3,42,101554,5,1414,289,70,259,23,7097,0,2343,330,260,7.7,3,3,8047.0,77777,9,999999999,7,0.0830,0,88,0.866,0.0,0.0 +2010,1,16,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-3.3,47,101714,0,29,282,0,0,0,0,0,0,0,250,4.6,3,3,8047.0,77777,9,999999999,7,0.0830,0,88,0.866,0.0,0.0 +2010,1,16,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-3.3,49,101784,0,0,280,0,0,0,0,0,0,0,290,5.7,3,3,8047.0,77777,9,999999999,7,0.0830,0,88,0.866,0.0,0.0 +2010,1,16,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-3.3,49,101784,0,0,280,0,0,0,0,0,0,0,290,5.7,3,3,8047.0,77777,9,999999999,7,0.0830,0,88,0.866,0.0,0.0 +2010,1,16,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-4.4,51,101854,0,0,272,0,0,0,0,0,0,0,300,5.1,3,3,8047.0,77777,9,999999999,6,0.0830,0,88,0.866,0.0,0.0 +2010,1,16,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-3.9,57,101913,0,0,268,0,0,0,0,0,0,0,270,4.1,3,3,8047.0,77777,9,999999999,7,0.0830,0,88,0.866,0.0,0.0 +2010,1,16,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-3.9,57,101913,0,0,268,0,0,0,0,0,0,0,270,4.1,3,3,8047.0,77777,9,999999999,7,0.0830,0,88,0.866,0.0,0.0 +2010,1,16,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-3.9,62,101953,0,0,253,0,0,0,0,0,0,0,290,3.6,0,0,8047.0,77777,9,999999999,7,0.0830,0,88,0.866,0.0,0.0 +2010,1,17,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-3.9,62,101953,0,0,268,0,0,0,0,0,0,0,300,2.6,5,5,8047.0,77777,9,999999999,7,0.0830,0,88,0.866,0.0,0.0 +2010,1,17,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-3.9,62,101953,0,0,284,0,0,0,0,0,0,0,300,2.6,9,9,8047.0,77777,9,999999999,7,0.0830,0,88,0.866,0.0,0.0 +2010,1,17,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-3.9,67,101993,0,0,279,0,0,0,0,0,0,0,340,2.1,9,9,8047.0,7620,9,999999999,7,0.0830,0,88,0.866,0.0,0.0 +2010,1,17,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-3.9,69,101983,0,0,277,0,0,0,0,0,0,0,360,2.6,9,9,8047.0,7620,9,999999999,7,0.0830,0,88,0.866,0.0,0.0 +2010,1,17,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.6,-3.9,69,101983,0,0,277,0,0,0,0,0,0,0,360,2.6,9,9,8047.0,7620,9,999999999,7,0.0830,0,88,0.866,0.0,0.0 +2010,1,17,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-3.9,67,102053,0,0,279,0,0,0,0,0,0,0,350,2.1,9,9,8047.0,7620,9,999999999,7,0.0830,0,88,0.866,0.0,0.0 +2010,1,17,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.0,-3.0,67,101279,0,0,292,0,0,0,0,0,0,0,15,0.0,10,10,8047.0,823,9,999999999,7,0.0830,0,88,0.866,0.0,0.0 +2010,1,17,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.1,-2.8,73,102113,57,332,288,8,0,8,774,0,779,295,34,0.0,10,10,8047.0,823,9,999999999,8,0.0830,0,88,0.866,0.0,0.0 +2010,1,17,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.0,-3.0,67,101279,274,1413,284,88,272,36,10300,4411,4221,1423,30,2.6,9,9,8047.0,77777,9,999999999,7,0.0830,0,88,0.866,0.0,0.0 +2010,1,17,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-0.6,75,102183,449,1413,300,183,354,81,21110,17464,9373,3259,86,0.0,10,10,8047.0,6096,9,999999999,9,0.0830,0,88,0.866,0.0,0.0 +2010,1,17,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,-0.6,75,102183,570,1413,300,296,536,100,34505,31753,11696,4252,120,0.0,10,10,8047.0,6096,9,999999999,9,0.0830,0,88,0.866,0.0,0.0 +2010,1,17,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,0.6,76,101954,630,1413,306,349,503,132,40264,33469,15290,5529,80,2.6,10,10,8047.0,914,9,999999999,11,0.0830,0,88,0.866,0.0,0.0 +2010,1,17,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,0.6,76,101884,623,1413,306,294,270,175,33115,20185,19804,6725,100,3.6,10,10,8047.0,975,9,999999999,11,0.0830,0,88,0.866,0.0,0.0 +2010,1,17,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,4.4,0.6,76,101884,551,1413,306,188,78,153,21086,5447,17237,5719,100,3.6,10,10,8047.0,975,9,999999999,11,0.0830,0,88,0.866,0.0,0.0 +2010,1,17,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,0.6,79,101774,418,1413,304,98,31,85,11170,1490,9720,3283,110,4.1,10,10,8047.0,884,9,999999999,11,0.0830,0,88,0.866,0.0,0.0 +2010,1,17,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,0.6,82,101764,233,1413,301,39,0,39,3825,0,3852,1452,110,4.1,10,10,8047.0,823,9,999999999,11,0.0830,0,88,0.866,0.0,0.0 +2010,1,17,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,0.6,82,101764,10,1413,301,14,0,14,1348,0,1356,360,110,4.1,10,10,8047.0,823,9,999999999,11,0.0830,0,88,0.866,0.0,0.0 +2010,1,17,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.0,2.0,87,101279,0,56,306,0,0,0,0,0,0,0,120,5.1,10,10,8047.0,792,9,999999999,12,0.0830,0,88,0.866,0.0,0.0 +2010,1,17,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,1.7,86,101514,0,0,305,0,0,0,0,0,0,0,120,6.2,10,10,8047.0,549,0,919999999,12,0.0830,0,88,0.866,0.0,0.0 +2010,1,17,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.9,1.7,86,101514,0,0,305,0,0,0,0,0,0,0,120,6.2,10,10,8047.0,549,0,919999999,12,0.0830,0,88,0.866,5.0,0.0 +2010,1,17,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.0,2.0,93,101294,0,0,302,0,0,0,0,0,0,0,100,8.2,10,10,9656.0,427,0,919999999,12,0.0830,0,88,0.866,5.0,0.0 +2010,1,17,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.3,1.7,89,101174,0,0,303,0,0,0,0,0,0,0,80,7.2,10,10,8047.0,366,0,919999999,12,0.0830,0,88,0.866,5.0,0.0 +2010,1,17,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,3.3,1.7,89,101174,0,0,303,0,0,0,0,0,0,0,80,7.2,10,10,8000.0,366,0,919999999,12,0.0830,0,88,0.866,5.0,0.0 +2010,1,17,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.2,0.6,89,100894,0,0,297,0,0,0,0,0,0,0,70,11.3,10,10,6437.0,366,0,919099999,11,0.0830,0,88,0.866,5.0,0.0 +2010,1,18,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.0,0.0,93,101278,0,0,291,0,0,0,0,0,0,0,70,10.8,10,10,4023.0,305,0,919099999,10,0.0830,0,88,0.866,1.7,0.0 +2010,1,18,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,0.6,0.0,96,100684,0,0,289,0,0,0,0,0,0,0,60,10.3,10,10,4000.0,305,0,919099999,10,0.0830,0,88,0.866,0.0,0.0 +2010,1,18,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,0.6,0.0,96,100394,0,0,289,0,0,0,0,0,0,0,40,10.8,10,10,3219.0,183,0,919099999,10,0.0830,0,88,0.866,0.0,0.0 +2010,1,18,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.0,0.0,93,101278,0,0,291,0,0,0,0,0,0,0,30,12.9,10,10,3219.0,305,0,919099999,10,0.0830,0,88,0.866,0.0,0.0 +2010,1,18,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,1.1,0.0,92,100224,0,0,291,0,0,0,0,0,0,0,30,12.9,10,10,3200.0,305,0,919099999,10,0.0830,0,88,0.866,0.0,0.0 +2010,1,18,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.0,0.0,93,101278,0,0,291,0,0,0,0,0,0,0,20,12.4,10,10,4828.0,518,0,919099999,10,0.0830,0,88,0.866,0.0,0.0 +2010,1,18,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,0.0,-1.0,92,101278,0,0,286,0,0,0,0,0,0,0,20,13.4,10,10,4828.0,396,0,919099999,9,0.0830,0,88,0.866,0.0,0.0 +2010,1,18,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,0.0,-1.1,91,100194,60,345,286,1,0,1,97,0,97,41,10,13.4,10,10,4800.0,396,0,919099999,9,0.0830,0,88,0.866,0.0,0.0 +2010,1,18,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,0.0,-2.0,85,101278,277,1413,285,15,0,15,1478,0,1488,647,10,12.9,10,10,6437.0,427,0,919099999,8,0.0830,0,88,0.866,0.0,0.0 +2010,1,18,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,0.0,-2.0,85,101278,452,1413,285,67,71,48,8059,2923,5784,2101,10,11.8,10,10,6437.0,1372,0,919099999,8,0.0830,0,88,0.866,0.0,0.0 +2010,1,18,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,0.0,-1.7,87,100494,574,1413,285,162,99,133,18481,6590,15234,5312,10,9.3,10,10,4000.0,1372,0,919099999,8,0.0830,0,88,0.866,0.0,0.0 +2010,1,18,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-1.0,-2.0,92,101278,634,1413,280,91,29,80,10932,1666,9637,3670,10,8.8,10,10,4828.0,488,0,919099999,8,0.0830,0,88,0.866,0.0,0.0 +2010,1,18,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-2.0,85,101278,627,1413,285,93,0,93,9427,0,9505,4161,20,12.9,10,10,4828.0,427,0,919099999,8,0.0830,0,88,0.866,0.0,0.0 +2010,1,18,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,0.0,-2.2,83,100633,555,1413,284,114,8,110,13153,491,12738,4533,360,8.7,10,10,9000.0,427,0,919099999,8,0.0830,0,88,0.866,0.0,0.0 +2010,1,18,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-2.0,85,101278,423,1413,285,139,30,129,15342,1847,14300,4381,10,8.2,10,10,9000.0,488,0,919099999,8,0.0830,0,88,0.866,0.0,0.0 +2010,1,18,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-2.0,85,101278,238,1413,285,52,0,52,5106,0,5143,1818,20,7.2,10,10,9000.0,427,0,919099999,8,0.0830,0,88,0.866,0.0,0.0 +2010,1,18,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.0,-2.2,83,100853,15,1413,284,14,0,14,1349,0,1358,375,20,7.2,10,10,9000.0,427,0,919099999,8,0.0830,0,88,0.866,0.0,0.0 +2010,1,18,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-2.2,88,101113,0,83,282,0,0,0,0,0,0,0,350,5.7,10,10,9000.0,366,0,919099999,8,0.0830,0,88,0.866,0.0,0.0 +2010,1,18,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-2.8,83,101153,0,0,281,0,0,0,0,0,0,0,360,5.1,10,10,9000.0,366,0,919099999,8,0.0830,0,88,0.866,0.0,0.0 +2010,1,18,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-0.6,-2.8,83,101153,0,0,281,0,0,0,0,0,0,0,360,5.1,10,10,9000.0,366,9,999999999,8,0.0830,0,88,0.866,2.0,0.0 +2010,1,18,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.0,-3.0,85,101278,0,0,279,0,0,0,0,0,0,0,360,3.1,10,10,9000.0,427,9,999999999,7,0.0830,0,88,0.866,0.3,0.0 +2010,1,18,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.0,-3.0,85,101278,0,0,279,0,0,0,0,0,0,0,360,3.1,10,10,9000.0,488,9,999999999,7,0.0830,0,88,0.866,0.0,0.0 +2010,1,18,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-0.6,-2.8,83,101343,0,0,281,0,0,0,0,0,0,0,350,3.1,10,10,9000.0,488,9,999999999,8,0.0830,0,88,0.866,0.0,0.0 +2010,1,18,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.0,-3.0,85,101278,0,0,279,0,0,0,0,0,0,0,320,3.1,10,10,9000.0,518,9,999999999,7,0.0830,0,88,0.866,0.0,0.0 +2010,1,19,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.0,-2.0,92,101278,0,0,280,0,0,0,0,0,0,0,22,0.0,10,10,9000.0,1128,0,999099999,8,0.0840,0,88,0.866,0.0,0.0 +2010,1,19,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-0.6,-2.2,88,101373,0,0,282,0,0,0,0,0,0,0,33,0.0,10,10,9000.0,1128,0,999099999,8,0.0840,0,88,0.866,0.0,0.0 +2010,1,19,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-2.2,88,101413,0,0,282,0,0,0,0,0,0,0,340,1.5,10,10,9000.0,457,0,999099999,8,0.0840,0,88,0.866,0.0,0.0 +2010,1,19,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-2.0,85,101278,0,0,285,0,0,0,0,0,0,0,178,0.0,10,10,9000.0,396,0,999099999,8,0.0840,0,88,0.866,0.0,0.0 +2010,1,19,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.0,-1.7,87,101423,0,0,285,0,0,0,0,0,0,0,180,0.0,10,10,9000.0,396,0,999099999,8,0.0840,0,88,0.866,0.0,0.0 +2010,1,19,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-2.2,83,101413,0,0,284,0,0,0,0,0,0,0,10,1.5,10,10,9000.0,610,0,999099999,8,0.0840,0,88,0.866,0.0,0.0 +2010,1,19,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-1.7,87,101413,0,0,285,0,0,0,0,0,0,0,181,0.0,10,10,9000.0,671,0,999099999,8,0.0840,0,88,0.866,0.0,0.0 +2010,1,19,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.0,-1.7,87,101413,62,358,285,5,0,5,484,0,487,194,181,0.0,10,10,9000.0,671,0,999099999,8,0.0840,0,88,0.866,0.0,0.0 +2010,1,19,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,0.0,-2.0,85,101278,280,1413,285,18,0,18,1774,0,1786,769,200,1.5,10,10,1609.0,732,0,999099999,8,0.0840,0,88,0.866,0.0,0.0 +2010,1,19,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,0.0,-1.0,92,101278,456,1413,286,28,0,28,2798,0,2820,1286,200,2.6,10,10,1609.0,396,0,999099999,9,0.0840,0,88,0.866,0.0,0.0 +2010,1,19,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,0.6,-0.6,91,101483,578,1413,289,93,0,93,9386,0,9462,4029,190,2.1,10,10,2800.0,396,0,999099999,9,0.0840,0,88,0.866,0.0,0.0 +2010,1,19,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,0.0,0.0,100,101278,638,1413,287,120,0,120,12167,0,12269,5165,180,0.0,10,10,1207.0,244,0,999099999,10,0.0840,0,88,0.866,0.0,0.0 +2010,1,19,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.0,-1.0,86,101278,632,1413,290,111,0,111,11253,0,11346,4832,120,2.6,10,10,805.0,305,0,999099999,9,0.0840,0,88,0.866,0.0,0.0 +2010,1,19,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,0.6,-0.6,91,101233,560,1413,289,55,0,55,5543,0,5588,2529,120,2.6,10,10,1200.0,305,0,919099999,9,0.0840,0,88,0.866,0.0,0.0 +2010,1,19,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.0,0.0,93,101278,428,1413,291,27,0,27,2691,0,2712,1225,110,3.6,10,10,1609.0,213,0,919099999,10,0.0840,0,88,0.866,0.0,0.0 +2010,1,19,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.0,1.0,100,101278,243,1413,292,15,0,15,1472,0,1483,633,100,2.1,10,10,3219.0,152,0,919099999,11,0.0840,0,88,0.866,0.0,0.0 +2010,1,19,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,1.1,0.6,96,101103,19,1413,292,4,0,4,385,0,388,149,20,1.5,10,10,3200.0,152,0,919099999,11,0.0840,0,88,0.866,0.0,0.0 +2010,1,19,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.0,1.0,93,101279,0,111,296,0,0,0,0,0,0,0,233,0.0,10,10,3200.0,244,0,919099999,11,0.0840,0,88,0.866,0.0,0.0 +2010,1,19,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.0,2.0,100,101279,0,0,297,0,0,0,0,0,0,0,20,1.5,10,10,9656.0,244,0,919099999,12,0.0840,0,88,0.866,0.0,0.0 +2010,1,19,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,1.1,0.0,92,101033,0,0,291,0,0,0,0,0,0,0,350,3.1,10,10,6000.0,244,0,919999999,10,0.0840,0,88,0.866,4.0,0.0 +2010,1,19,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.0,-1.0,86,101278,0,0,290,0,0,0,0,0,0,0,360,3.1,10,10,9656.0,122,0,919099999,9,0.0840,0,88,0.866,3.6,0.0 +2010,1,19,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,0.6,0.0,96,101013,0,0,289,0,0,0,0,0,0,0,350,2.6,10,10,9656.0,122,0,919099999,10,0.0840,0,88,0.866,0.0,0.0 +2010,1,19,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,0.6,0.0,96,101013,0,0,289,0,0,0,0,0,0,0,350,2.6,10,10,9000.0,122,0,919099999,10,0.0840,0,88,0.866,0.0,0.0 +2010,1,19,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.0,-1.0,86,101278,0,0,290,0,0,0,0,0,0,0,330,4.1,10,10,9656.0,122,0,919099999,9,0.0840,0,88,0.866,0.0,0.0 +2010,1,20,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-1.1,91,100983,0,0,286,0,0,0,0,0,0,0,310,3.1,10,10,9656.0,122,0,919099999,9,0.0840,0,88,0.866,0.0,0.0 +2010,1,20,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.0,-1.1,91,100983,0,0,286,0,0,0,0,0,0,0,310,3.1,10,10,9656.0,122,0,919099999,9,0.0840,0,88,0.866,0.0,0.0 +2010,1,20,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-1.1,91,100973,0,0,286,0,0,0,0,0,0,0,300,2.1,10,10,9656.0,305,0,919099999,9,0.0840,0,88,0.866,0.0,0.0 +2010,1,20,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.0,-2.0,79,101278,0,0,289,0,0,0,0,0,0,0,310,3.1,10,10,9656.0,1433,0,919099999,8,0.0840,0,88,0.866,0.0,0.0 +2010,1,20,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.0,-1.7,87,100953,0,0,277,0,0,0,0,0,0,0,310,3.1,9,9,9656.0,1433,0,919099999,8,0.0840,0,88,0.866,0.0,0.0 +2010,1,20,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-2.0,85,101278,0,0,285,0,0,0,0,0,0,0,300,2.6,10,10,9656.0,1067,0,919099999,8,0.0840,0,88,0.866,0.0,0.0 +2010,1,20,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-2.0,85,101278,0,0,277,0,0,0,0,0,0,0,310,2.6,9,9,9656.0,1067,0,919099999,8,0.0840,0,88,0.866,0.0,0.0 +2010,1,20,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.6,-1.1,87,100973,65,373,280,8,0,8,774,0,779,299,320,3.1,9,9,9656.0,1067,0,919099999,9,0.0840,0,88,0.866,0.0,0.0 +2010,1,20,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-1.7,80,101033,283,1413,282,64,52,54,7273,1291,6153,1995,310,2.6,9,9,9656.0,1463,0,919099999,8,0.0840,0,88,0.866,0.0,0.0 +2010,1,20,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-1.7,77,101034,459,1413,284,121,53,107,13688,3023,12149,4061,320,3.6,9,9,9656.0,1524,0,919099999,8,0.0840,0,88,0.866,0.0,0.0 +2010,1,20,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.7,-1.7,77,101034,582,1413,284,159,40,145,18043,2767,16524,5691,320,3.6,9,9,9656.0,1524,0,919099999,8,0.0840,0,88,0.866,0.0,0.0 +2010,1,20,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.0,-2.0,73,101279,642,1413,293,192,40,175,21725,3019,19894,6851,320,3.6,10,10,9656.0,518,0,919099999,8,0.0840,0,88,0.866,0.0,0.0 +2010,1,20,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.0,-2.0,79,101278,637,1413,289,138,16,131,15964,1075,15213,5527,300,4.1,10,10,9656.0,640,0,919099999,8,0.0840,0,88,0.866,0.0,0.0 +2010,1,20,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.7,-2.2,74,100934,565,1413,284,93,7,90,10924,402,10604,3888,320,5.1,9,9,9656.0,640,0,919099999,8,0.0840,0,88,0.866,0.0,0.0 +2010,1,20,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.0,-2.0,73,101279,433,1413,293,150,99,117,16735,5804,13106,4184,320,5.1,10,10,9656.0,945,0,919099999,8,0.0840,0,88,0.866,0.0,0.0 +2010,1,20,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-2.8,65,101044,248,1413,271,171,379,89,18414,13927,9624,2555,330,5.7,5,5,9656.0,77777,0,919099999,8,0.0840,0,88,0.866,0.0,0.0 +2010,1,20,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-2.8,65,101044,24,1413,287,68,169,39,6737,0,3885,258,330,5.7,9,9,9656.0,77777,0,919099999,8,0.0840,0,88,0.866,0.0,0.0 +2010,1,20,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.0,-2.0,73,101279,0,139,293,0,0,0,0,0,0,0,340,7.7,10,10,9656.0,671,0,919099999,8,0.0840,0,88,0.866,0.0,0.0 +2010,1,20,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.0,-2.0,79,101278,0,0,289,0,0,0,0,0,0,0,340,4.6,10,10,9656.0,77777,0,919099999,8,0.0840,0,88,0.866,0.0,0.0 +2010,1,20,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.1,-1.7,80,101323,0,0,282,0,0,0,0,0,0,0,320,4.1,9,9,9656.0,77777,9,999999999,8,0.0840,0,88,0.866,0.0,0.0 +2010,1,20,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-2.8,76,101463,0,0,263,0,0,0,0,0,0,0,320,4.1,5,5,9656.0,77777,9,999999999,8,0.0840,0,88,0.866,0.0,0.0 +2010,1,20,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-3.3,73,101523,0,0,258,0,0,0,0,0,0,0,310,5.1,3,3,9656.0,77777,9,999999999,7,0.0840,0,88,0.866,0.0,0.0 +2010,1,20,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-3.3,73,101523,0,0,258,0,0,0,0,0,0,0,310,5.1,3,3,9656.0,77777,9,999999999,7,0.0840,0,88,0.866,0.0,0.0 +2010,1,20,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-4.4,73,101583,0,0,253,0,0,0,0,0,0,0,320,5.1,3,3,9656.0,77777,9,999999999,6,0.0840,0,88,0.866,0.0,0.0 +2010,1,21,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-5.0,72,101623,0,0,250,0,0,0,0,0,0,0,320,5.1,3,3,9656.0,77777,9,999999999,6,0.0840,0,88,0.866,0.0,0.0 +2010,1,21,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-5.0,72,101623,0,0,250,0,0,0,0,0,0,0,320,5.1,3,3,9656.0,77777,9,999999999,6,0.0840,0,88,0.866,0.0,0.0 +2010,1,21,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-5.6,72,101783,0,0,237,0,0,0,0,0,0,0,320,4.6,0,0,9656.0,77777,9,999999999,6,0.0840,0,88,0.866,0.0,0.0 +2010,1,21,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-5.6,72,101833,0,0,237,0,0,0,0,0,0,0,320,5.1,0,0,9656.0,77777,9,999999999,6,0.0840,0,88,0.866,0.0,0.0 +2010,1,21,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-5.6,72,101833,0,0,237,0,0,0,0,0,0,0,320,5.1,0,0,9656.0,77777,9,999999999,6,0.0840,0,88,0.866,0.0,0.0 +2010,1,21,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-6.1,69,101923,0,0,237,0,0,0,0,0,0,0,300,4.6,0,0,9656.0,77777,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,21,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-6.1,66,101993,0,0,239,0,0,0,0,0,0,0,300,3.6,0,0,9656.0,77777,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,21,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-6.1,66,101993,67,388,249,17,144,10,1980,0,1166,364,300,3.6,3,3,9656.0,77777,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,21,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-6.1,60,102103,286,1412,253,122,462,37,14315,8893,4349,1474,320,5.1,3,3,9656.0,77777,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,21,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-5.6,58,102153,463,1412,258,265,727,62,31354,33770,7353,2644,300,4.6,3,3,9656.0,77777,9,999999999,6,0.0840,0,88,0.866,0.0,0.0 +2010,1,21,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-5.6,58,102153,586,1412,258,393,841,77,46950,47244,9224,3453,300,4.6,3,3,9656.0,77777,9,999999999,6,0.0840,0,88,0.866,0.0,0.0 +2010,1,21,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-6.1,49,102033,647,1412,264,476,889,86,57052,53194,10338,3937,330,3.6,3,3,9656.0,77777,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,21,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-6.1,47,102003,641,1412,266,500,900,88,59763,54072,10549,4003,270,4.6,3,3,9656.0,77777,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,21,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-6.1,47,102003,570,1412,266,465,879,86,54911,50619,10186,3756,270,4.6,3,3,9656.0,77777,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,21,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-6.1,44,101954,438,1412,270,374,821,77,43249,40095,8931,3100,300,5.1,3,3,9656.0,77777,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,21,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-6.1,44,101984,253,1412,270,239,699,60,26670,17105,6716,2062,300,5.1,3,3,9656.0,77777,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,21,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-6.1,44,101984,29,1412,270,91,398,30,9299,0,3080,489,300,5.1,3,3,9656.0,77777,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,21,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-5.6,49,102013,0,167,266,0,0,0,0,0,0,0,320,3.6,3,3,9656.0,77777,9,999999999,6,0.0840,0,88,0.866,0.0,0.0 +2010,1,21,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-5.0,56,102003,0,0,263,0,0,0,0,0,0,0,330,4.1,3,3,9656.0,77777,9,999999999,6,0.0840,0,88,0.866,0.0,0.0 +2010,1,21,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-5.0,56,102003,0,0,252,0,0,0,0,0,0,0,330,4.1,0,0,9656.0,77777,9,999999999,6,0.0840,0,88,0.866,0.0,0.0 +2010,1,21,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-6.7,50,101973,0,0,248,0,0,0,0,0,0,0,300,3.1,0,0,9656.0,77777,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,21,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-6.7,52,101933,0,0,246,0,0,0,0,0,0,0,300,3.1,0,0,9656.0,77777,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,21,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-6.7,52,101933,0,0,276,0,0,0,0,0,0,0,300,3.1,9,9,9656.0,77777,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,21,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-6.7,57,101883,0,0,257,0,0,0,0,0,0,0,290,2.6,5,5,9656.0,77777,9,999999999,5,0.0840,0,88,0.866,0.0,0.0 +2010,1,22,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-6.1,60,101863,0,0,253,0,0,0,0,0,0,0,270,2.6,3,3,9656.0,77777,9,999999999,5,0.0850,0,88,0.866,0.0,0.0 +2010,1,22,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-6.1,60,101863,0,0,243,0,0,0,0,0,0,0,270,2.6,0,0,9656.0,77777,9,999999999,5,0.0850,0,88,0.866,0.0,0.0 +2010,1,22,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-6.7,62,101713,0,0,249,0,0,0,0,0,0,0,300,3.1,3,3,9656.0,77777,9,999999999,5,0.0850,0,88,0.866,0.0,0.0 +2010,1,22,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-6.7,68,101623,0,0,263,0,0,0,0,0,0,0,300,1.5,9,9,9656.0,6096,9,999999999,5,0.0850,0,88,0.866,0.0,0.0 +2010,1,22,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.2,-6.7,68,101623,0,0,245,0,0,0,0,0,0,0,300,1.5,3,3,9656.0,6096,9,999999999,5,0.0850,0,88,0.866,0.0,0.0 +2010,1,22,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-7.2,69,101623,0,0,242,0,0,0,0,0,0,0,333,0.0,3,3,9656.0,77777,9,999999999,5,0.0850,0,88,0.866,0.0,0.0 +2010,1,22,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.9,-7.2,75,101592,0,0,238,0,0,0,0,0,0,0,360,2.1,3,3,9656.0,77777,9,999999999,5,0.0850,0,88,0.866,0.0,0.0 +2010,1,22,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.9,-7.2,75,101592,70,404,256,16,0,16,1551,0,1561,535,360,2.1,9,9,9656.0,77777,9,999999999,5,0.0850,0,88,0.866,0.0,0.0 +2010,1,22,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-7.8,65,101583,289,1412,260,106,388,33,12566,7162,3918,1340,340,3.1,9,9,9656.0,7620,9,999999999,5,0.0850,0,88,0.866,0.0,0.0 +2010,1,22,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-7.2,63,101593,466,1412,265,226,591,60,26839,27484,7142,2578,350,2.6,9,9,9656.0,7620,9,999999999,5,0.0850,0,88,0.866,0.0,0.0 +2010,1,22,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-1.7,-7.2,63,101593,590,1412,265,343,721,69,41367,39656,8342,3147,350,2.6,9,9,9656.0,7620,9,999999999,5,0.0850,0,88,0.866,0.0,0.0 +2010,1,22,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-2.8,68,101433,651,1412,285,413,753,80,49787,43767,9670,3707,30,7.2,9,9,9656.0,7620,9,999999999,8,0.0850,0,88,0.866,0.0,0.0 +2010,1,22,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-3.3,62,101424,646,1412,287,420,688,103,49617,42927,12208,4587,60,7.2,9,9,9656.0,7620,9,999999999,7,0.0850,0,88,0.866,0.0,0.0 +2010,1,22,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,-3.3,62,101424,575,1412,295,391,673,98,45729,40163,11499,4199,60,7.2,10,10,9656.0,7620,9,999999999,7,0.0850,0,88,0.866,0.0,0.0 +2010,1,22,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-3.9,64,101453,443,1412,290,313,614,85,35944,31245,9792,3367,50,8.8,10,10,9656.0,8534,9,999999999,7,0.0850,0,88,0.866,0.0,0.0 +2010,1,22,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.0,-3.0,72,101278,258,1412,288,172,315,80,18766,10582,8762,2489,40,7.2,10,10,9656.0,792,9,999999999,7,0.0850,0,88,0.866,0.0,0.0 +2010,1,22,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.1,-3.3,70,101493,34,1412,288,62,101,39,6221,0,3934,426,30,8.7,10,10,9656.0,792,9,999999999,7,0.0850,0,88,0.866,0.0,0.0 +2010,1,22,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.0,-3.0,72,101278,0,196,288,0,0,0,0,0,0,0,40,6.2,10,10,9656.0,8230,9,999999999,7,0.0850,0,88,0.866,0.0,0.0 +2010,1,22,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-3.9,72,101683,0,0,259,0,0,0,0,0,0,0,360,3.6,5,5,9656.0,77777,9,999999999,7,0.0850,0,88,0.866,0.0,0.0 +2010,1,22,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-3.9,72,101683,0,0,259,0,0,0,0,0,0,0,360,3.6,5,5,9656.0,77777,9,999999999,7,0.0850,0,88,0.866,0.0,0.0 +2010,1,22,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-6.1,66,101783,0,0,249,0,0,0,0,0,0,0,350,3.6,3,3,9656.0,77777,9,999999999,5,0.0850,0,88,0.866,0.0,0.0 +2010,1,22,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-6.7,62,101843,0,0,249,0,0,0,0,0,0,0,340,4.1,3,3,9656.0,77777,9,999999999,5,0.0850,0,88,0.866,0.0,0.0 +2010,1,22,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-6.7,62,101843,0,0,249,0,0,0,0,0,0,0,340,4.1,3,3,9656.0,77777,9,999999999,5,0.0850,0,88,0.866,0.0,0.0 +2010,1,22,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-7.2,63,101943,0,0,246,0,0,0,0,0,0,0,360,5.1,3,3,9656.0,77777,9,999999999,5,0.0850,0,88,0.866,0.0,0.0 +2010,1,23,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-7.8,65,101962,0,0,242,0,0,0,0,0,0,0,360,4.1,3,3,9656.0,77777,9,999999999,5,0.0850,0,88,0.866,0.0,0.0 +2010,1,23,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-7.8,65,101962,0,0,232,0,0,0,0,0,0,0,360,4.1,0,0,9656.0,77777,9,999999999,5,0.0850,0,88,0.866,0.0,0.0 +2010,1,23,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.9,-9.4,62,102082,0,0,227,0,0,0,0,0,0,0,360,4.1,0,0,9656.0,77777,9,999999999,4,0.0850,0,88,0.866,0.0,0.0 +2010,1,23,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-4.4,-10.6,58,102052,0,0,234,0,0,0,0,0,0,0,360,4.1,3,3,9656.0,77777,9,999999999,4,0.0850,0,88,0.866,0.0,0.0 +2010,1,23,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-4.4,-10.6,58,102052,0,0,234,0,0,0,0,0,0,0,360,4.1,3,3,9656.0,77777,9,999999999,4,0.0850,0,88,0.866,0.0,0.0 +2010,1,23,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-11.7,56,102252,0,0,230,0,0,0,0,0,0,0,330,3.6,3,3,9656.0,77777,9,999999999,3,0.0850,0,88,0.866,0.0,0.0 +2010,1,23,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-12.2,53,102352,0,0,220,0,0,0,0,0,0,0,340,3.1,0,0,9656.0,77777,9,999999999,3,0.0850,0,88,0.866,0.0,0.0 +2010,1,23,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-12.2,53,102352,73,421,220,20,184,10,2342,0,1172,368,340,3.1,0,0,9656.0,77777,9,999999999,3,0.0850,0,88,0.866,0.0,0.0 +2010,1,23,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-12.2,46,102462,293,1412,236,131,512,34,15520,10282,4034,1379,360,4.6,3,3,9656.0,77777,9,999999999,3,0.0850,0,88,0.866,0.0,0.0 +2010,1,23,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-12.8,36,102502,470,1412,243,278,780,57,33199,36536,6822,2473,10,4.1,3,3,9656.0,77777,9,999999999,3,0.0850,0,88,0.866,0.0,0.0 +2010,1,23,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-12.8,36,102502,594,1412,243,409,887,71,49297,50026,8579,3235,10,4.1,3,3,9656.0,77777,9,999999999,3,0.0850,0,88,0.866,0.0,0.0 +2010,1,23,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-11.7,37,102373,656,1412,248,492,933,77,59616,55328,9355,3594,60,2.1,3,3,9656.0,77777,9,999999999,3,0.0850,0,88,0.866,0.0,0.0 +2010,1,23,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-11.1,39,102323,651,1412,238,518,945,79,62587,56198,9571,3666,130,2.1,0,0,9656.0,77777,9,999999999,3,0.0850,0,88,0.866,0.0,0.0 +2010,1,23,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-11.1,39,102323,580,1412,238,484,925,78,57750,52823,9332,3481,130,2.1,0,0,9656.0,77777,9,999999999,3,0.0850,0,88,0.866,0.0,0.0 +2010,1,23,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-9.4,43,102233,448,1412,242,393,873,71,45881,42342,8312,2930,130,2.6,0,0,9656.0,77777,9,999999999,4,0.0850,0,88,0.866,0.0,0.0 +2010,1,23,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-8.9,47,102273,264,1412,240,256,761,56,28855,18716,6330,1997,130,2.1,0,0,9656.0,77777,9,999999999,4,0.0850,0,88,0.866,0.0,0.0 +2010,1,23,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-8.9,47,102273,40,1412,251,102,469,30,10554,0,3117,583,130,2.1,3,3,9656.0,77777,9,999999999,4,0.0850,0,88,0.866,0.0,0.0 +2010,1,23,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-8.3,52,102463,0,225,239,0,0,0,0,0,0,0,150,1.5,0,0,9656.0,77777,9,999999999,4,0.0850,0,88,0.866,0.0,0.0 +2010,1,23,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-7.2,60,102522,0,0,238,0,0,0,0,0,0,0,200,1.5,0,0,9656.0,77777,9,999999999,5,0.0850,0,88,0.866,0.0,0.0 +2010,1,23,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-7.2,60,102522,0,0,238,0,0,0,0,0,0,0,200,1.5,0,0,9656.0,77777,9,999999999,5,0.0850,0,88,0.866,0.0,0.0 +2010,1,23,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-9.4,52,102472,0,0,234,0,0,0,0,0,0,0,180,1.5,0,0,9656.0,77777,9,999999999,4,0.0850,0,88,0.866,0.0,0.0 +2010,1,23,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-10.0,51,102432,0,0,232,0,0,0,0,0,0,0,200,1.5,0,0,9656.0,77777,9,999999999,4,0.0850,0,88,0.866,0.0,0.0 +2010,1,23,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-10.0,51,102432,0,0,232,0,0,0,0,0,0,0,200,1.5,0,0,9656.0,77777,9,999999999,4,0.0850,0,88,0.866,0.0,0.0 +2010,1,23,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-11.7,40,102392,0,0,234,0,0,0,0,0,0,0,210,1.5,0,0,9656.0,77777,9,999999999,3,0.0850,0,88,0.866,0.0,0.0 +2010,1,24,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-10.6,48,102382,0,0,245,0,0,0,0,0,0,0,240,2.1,5,5,9656.0,77777,9,999999999,4,0.0860,0,88,0.866,0.0,0.0 +2010,1,24,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-10.6,48,102382,0,0,260,0,0,0,0,0,0,0,240,2.1,9,9,9656.0,77777,9,999999999,4,0.0860,0,88,0.866,0.0,0.0 +2010,1,24,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-8.9,59,102402,0,0,259,0,0,0,0,0,0,0,274,0.0,9,9,9656.0,4572,9,999999999,4,0.0860,0,88,0.866,0.0,0.0 +2010,1,24,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-8.9,59,102352,0,0,259,0,0,0,0,0,0,0,150,1.5,9,9,9656.0,4572,9,999999999,4,0.0860,0,88,0.866,0.0,0.0 +2010,1,24,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.8,-8.9,59,102352,0,0,259,0,0,0,0,0,0,0,150,1.5,9,9,9656.0,4572,9,999999999,4,0.0860,0,88,0.866,0.0,0.0 +2010,1,24,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-9.4,57,102432,0,0,266,0,0,0,0,0,0,0,230,2.6,10,10,9656.0,4267,9,999999999,4,0.0860,0,88,0.866,0.0,0.0 +2010,1,24,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-10.0,51,102472,0,0,260,0,0,0,0,0,0,0,210,3.6,9,9,9656.0,4267,9,999999999,4,0.0860,0,88,0.866,0.0,0.0 +2010,1,24,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.2,-10.0,51,102472,77,438,260,12,18,11,1398,0,1283,402,210,3.6,9,9,9656.0,4267,9,999999999,4,0.0860,0,88,0.866,0.0,0.0 +2010,1,24,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-8.3,54,102402,296,1411,266,91,227,45,10555,5558,5231,1754,230,4.1,9,9,9656.0,4267,9,999999999,4,0.0860,0,88,0.866,0.0,0.0 +2010,1,24,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-7.2,54,102383,474,1411,272,201,382,86,23252,20482,9980,3496,220,3.1,9,9,9656.0,4267,9,999999999,5,0.0860,0,88,0.866,0.0,0.0 +2010,1,24,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.0,-7.2,54,102383,599,1411,272,297,451,127,34222,30204,14690,5244,220,3.1,9,9,9656.0,4267,9,999999999,5,0.0860,0,88,0.866,0.0,0.0 +2010,1,24,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-3.9,59,102223,661,1411,294,314,315,177,35644,24025,20186,7024,210,2.6,10,10,9656.0,2896,9,999999999,7,0.0860,0,88,0.866,0.0,0.0 +2010,1,24,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-3.3,60,102133,656,1411,297,264,196,173,29994,14780,19746,6887,140,2.1,10,10,9656.0,2438,9,999999999,7,0.0860,0,88,0.866,0.0,0.0 +2010,1,24,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,-3.3,60,102133,586,1411,297,256,150,188,28478,11767,21016,6761,140,2.1,10,10,9656.0,2438,9,999999999,7,0.0860,0,88,0.866,0.0,0.0 +2010,1,24,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-1.1,69,102013,454,1411,302,142,29,130,15788,1818,14515,4598,191,0.0,10,10,9656.0,1006,9,999999999,9,0.0860,0,88,0.866,0.0,0.0 +2010,1,24,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-1.1,72,101993,269,1411,300,52,10,48,5937,202,5494,1791,110,2.1,10,10,9656.0,975,9,999999999,9,0.0860,0,88,0.866,0.0,0.0 +2010,1,24,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,-1.1,72,101993,45,1411,300,6,0,6,580,0,583,224,110,2.1,10,10,9656.0,975,9,999999999,9,0.0860,0,88,0.866,0.0,0.0 +2010,1,24,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-0.6,75,101973,0,254,300,0,0,0,0,0,0,0,170,3.1,10,10,9656.0,1128,9,999999999,9,0.0860,0,88,0.866,0.0,0.0 +2010,1,24,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,0.0,82,101913,0,0,299,0,0,0,0,0,0,0,130,2.6,10,10,9656.0,1036,0,919999999,10,0.0860,0,88,0.866,0.0,0.0 +2010,1,24,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,0.0,82,101913,0,0,299,0,0,0,0,0,0,0,130,2.6,10,10,9656.0,1036,9,999999999,10,0.0860,0,88,0.099,0.0,0.0 +2010,1,24,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.0,0.0,81,101279,0,0,299,0,0,0,0,0,0,0,110,3.1,10,10,9656.0,823,9,999999999,10,0.0860,0,88,0.099,0.0,0.0 +2010,1,24,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.0,1.0,87,101279,0,0,301,0,0,0,0,0,0,0,90,3.1,10,10,9656.0,1067,9,999999999,11,0.0860,0,88,0.099,0.0,0.0 +2010,1,24,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,1.1,89,101743,0,0,300,0,0,0,0,0,0,0,70,2.1,10,10,9656.0,1067,9,999999999,11,0.0860,0,88,0.099,0.0,0.0 +2010,1,24,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,1.7,89,101574,0,0,303,0,0,0,0,0,0,0,70,2.1,10,10,9656.0,1829,9,999999999,12,0.0860,0,88,0.099,0.0,0.0 +2010,1,25,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,1.7,92,101484,0,0,300,0,0,0,0,0,0,0,80,2.6,10,10,9656.0,2438,9,999999999,12,0.0860,0,88,0.099,0.0,0.0 +2010,1,25,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,1.7,92,101484,0,0,300,0,0,0,0,0,0,0,80,2.6,10,10,9656.0,2438,9,999999999,12,0.0860,0,88,0.099,0.0,0.0 +2010,1,25,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,1.7,92,101364,0,0,300,0,0,0,0,0,0,0,172,0.0,10,10,9656.0,2743,9,999999999,12,0.0860,0,88,0.099,0.0,0.0 +2010,1,25,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,1.7,92,101254,0,0,300,0,0,0,0,0,0,0,173,0.0,10,10,9656.0,2743,9,999999999,12,0.0860,0,88,0.099,0.0,0.0 +2010,1,25,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,1.7,92,101254,0,0,300,0,0,0,0,0,0,0,168,0.0,10,10,9656.0,2743,9,999999999,12,0.0860,0,88,0.099,0.0,0.0 +2010,1,25,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,6.1,86,101115,0,0,330,0,0,0,0,0,0,0,160,5.7,10,10,9656.0,2134,9,999999999,18,0.0860,0,88,0.099,0.0,0.0 +2010,1,25,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,6.7,90,100995,0,0,331,0,0,0,0,0,0,0,160,5.7,10,10,9656.0,2438,9,999999999,19,0.0860,0,88,0.099,0.0,0.0 +2010,1,25,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.3,6.7,90,100995,80,457,331,1,0,1,97,0,97,42,160,5.7,10,10,9656.0,2438,9,999999999,19,0.0860,0,88,0.099,0.0,0.0 +2010,1,25,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,9.4,7.2,86,100815,300,1411,336,8,0,8,787,0,793,359,160,8.2,10,10,6437.0,1676,9,999999999,20,0.0860,0,88,0.099,0.0,0.0 +2010,1,25,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,7.8,86,100655,479,1411,340,30,0,30,2994,0,3017,1388,160,8.8,10,10,6437.0,1097,0,919999999,21,0.0860,0,88,0.099,0.0,0.0 +2010,1,25,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.0,7.8,86,100655,603,1411,340,68,2,68,8199,101,8219,3130,160,8.7,10,10,6437.0,1097,0,919999999,21,0.0860,0,88,0.099,0.0,0.0 +2010,1,25,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,11.1,8.9,86,100245,666,1411,347,67,2,66,8186,103,8083,3148,160,10.3,10,10,8047.0,640,0,919999999,24,0.0860,0,88,0.099,0.0,0.0 +2010,1,25,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,9.4,89,99976,661,1411,347,28,0,28,2833,0,2857,1408,160,11.3,10,10,8047.0,518,0,919999999,25,0.0860,0,88,0.099,0.0,0.0 +2010,1,25,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.1,9.4,89,99976,591,1411,347,18,0,18,1811,0,1826,894,160,11.3,10,10,8047.0,518,0,919999999,25,0.0860,0,88,0.099,0.0,0.0 +2010,1,25,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,12.0,10.0,88,101280,459,1411,352,12,0,12,1194,0,1203,572,160,12.9,10,10,2816.0,518,0,919999999,27,0.0860,0,88,0.099,0.0,0.0 +2010,1,25,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,12.0,11.0,94,101280,274,1411,353,15,0,15,1469,0,1480,646,170,11.8,10,10,2816.0,549,0,919999999,29,0.0860,0,88,0.099,0.0,0.0 +2010,1,25,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,11.7,10.6,93,99326,50,1411,352,11,0,11,1057,0,1064,378,170,12.9,10,10,2000.0,549,0,919999999,28,0.0860,0,88,0.099,0.0,0.0 +2010,1,25,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,14.0,12.0,88,101280,0,284,365,0,0,0,0,0,0,0,190,13.9,10,10,4828.0,701,0,919999999,32,0.0860,0,88,0.099,0.0,0.0 +2010,1,25,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.0,12.0,94,101280,0,0,360,0,0,0,0,0,0,0,200,11.8,10,10,9656.0,1250,0,919999999,32,0.0860,0,88,0.099,0.0,0.0 +2010,1,25,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,12.8,11.1,89,99146,0,0,358,0,0,0,0,0,0,0,210,7.7,10,10,6000.0,1250,0,919999999,29,0.0860,0,88,0.099,5.0,0.0 +2010,1,25,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.0,11.0,94,101280,0,0,353,0,0,0,0,0,0,0,200,6.2,10,10,6000.0,2286,0,919999999,29,0.0860,0,88,0.099,5.0,0.0 +2010,1,25,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.0,9.0,87,101280,0,0,337,0,0,0,0,0,0,0,210,5.1,9,9,6000.0,77777,0,919999999,24,0.0860,0,88,0.099,5.0,0.0 +2010,1,25,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.1,10.0,93,99146,0,0,348,0,0,0,0,0,0,0,220,6.7,10,10,6000.0,77777,0,919999999,26,0.0860,0,88,0.099,5.0,0.0 +2010,1,25,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.0,9.0,87,101280,0,0,337,0,0,0,0,0,0,0,230,7.2,9,9,6000.0,1433,0,919999999,24,0.0860,0,88,0.099,0.6,0.0 +2010,1,26,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,4.4,73,99336,0,0,304,0,0,0,0,0,0,0,290,5.7,5,5,6000.0,77777,0,919999999,15,0.0860,0,88,0.099,0.0,0.0 +2010,1,26,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,4.4,73,99336,0,0,299,0,0,0,0,0,0,0,290,5.7,3,3,6000.0,77777,0,919999999,15,0.0860,0,88,0.099,0.0,0.0 +2010,1,26,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,2.2,70,99355,0,0,294,0,0,0,0,0,0,0,280,4.6,5,5,6000.0,77777,0,919999999,12,0.0860,0,88,0.099,0.0,0.0 +2010,1,26,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,2.2,73,99485,0,0,318,0,0,0,0,0,0,0,260,4.6,10,10,6000.0,1433,0,919999999,12,0.0860,0,88,0.099,0.0,0.0 +2010,1,26,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.7,2.2,73,99485,0,0,318,0,0,0,0,0,0,0,260,4.6,10,10,6000.0,1433,0,919999999,12,0.0860,0,88,0.099,0.0,0.0 +2010,1,26,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,0.0,70,101279,0,0,308,0,0,0,0,0,0,0,270,6.7,10,10,6000.0,823,0,919999999,10,0.0860,0,88,0.099,0.0,0.0 +2010,1,26,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.0,0.0,75,101279,0,0,304,0,0,0,0,0,0,0,300,5.1,10,10,6000.0,2591,0,919999999,10,0.0860,0,88,0.099,0.0,0.0 +2010,1,26,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,4.4,-0.6,70,99685,83,476,305,7,0,7,678,0,683,272,280,3.1,10,10,6000.0,2591,0,919999999,9,0.0860,0,88,0.099,0.0,0.0 +2010,1,26,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-2.8,55,99875,304,1411,305,71,89,52,8154,2421,5987,1988,270,7.2,10,10,6000.0,4267,0,919999999,7,0.0860,0,88,0.099,0.0,0.0 +2010,1,26,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-3.9,49,99955,483,1411,281,208,388,84,24141,20532,9779,3456,270,8.2,5,5,6000.0,77777,0,919999999,7,0.0860,0,88,0.099,0.0,0.0 +2010,1,26,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-3.9,49,99955,608,1411,281,383,778,77,45946,44028,9262,3501,270,8.2,5,5,6000.0,77777,0,919999999,7,0.0860,0,88,0.099,0.0,0.0 +2010,1,26,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-4.4,43,99925,671,1411,281,462,827,85,55657,49508,10269,3951,270,6.7,3,3,6000.0,77777,0,919999999,6,0.0860,0,88,0.099,0.0,0.0 +2010,1,26,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-4.4,43,99925,667,1411,302,377,435,172,42951,32826,19685,6924,260,7.7,9,9,6000.0,2134,0,919999999,6,0.0860,0,88,0.099,0.0,0.0 +2010,1,26,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.7,-4.4,43,99925,596,1411,302,277,203,183,30962,15764,20553,6738,260,7.7,9,9,6000.0,2134,0,919999999,6,0.0860,0,88,0.099,0.0,0.0 +2010,1,26,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,-5.0,40,100045,464,1411,304,242,240,148,26716,16472,16413,5042,240,7.2,9,9,6000.0,2438,0,919999999,6,0.0860,0,88,0.099,0.0,0.0 +2010,1,26,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-4.4,45,100175,280,1411,300,138,147,104,14851,6790,11241,2975,290,7.7,9,9,6000.0,1981,0,919999999,6,0.0860,0,88,0.099,0.0,0.0 +2010,1,26,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.1,-4.4,45,100175,55,1411,300,59,60,48,5949,0,4865,589,290,7.7,9,9,6000.0,1981,0,919999999,6,0.0860,0,88,0.099,0.0,0.0 +2010,1,26,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-4.4,51,100374,0,313,301,0,0,0,0,0,0,0,270,5.7,10,10,6000.0,2286,0,919999999,6,0.0860,0,88,0.099,0.0,0.0 +2010,1,26,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-4.4,51,100484,0,0,276,0,0,0,0,0,0,0,270,4.1,5,5,6000.0,77777,0,919999999,6,0.0860,0,88,0.099,0.0,0.0 +2010,1,26,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-4.4,51,100484,0,0,276,0,0,0,0,0,0,0,270,4.1,5,5,6000.0,77777,9,999999999,6,0.0860,0,88,0.099,0.0,0.0 +2010,1,26,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-4.4,55,100564,0,0,268,0,0,0,0,0,0,0,240,5.7,3,3,6000.0,77777,9,999999999,6,0.0860,0,88,0.099,0.0,0.0 +2010,1,26,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-4.4,57,100624,0,0,266,0,0,0,0,0,0,0,260,4.1,3,3,6000.0,77777,9,999999999,6,0.0860,0,88,0.099,0.0,0.0 +2010,1,26,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-4.4,57,100624,0,0,255,0,0,0,0,0,0,0,260,4.1,0,0,6000.0,77777,9,999999999,6,0.0860,0,88,0.099,0.0,0.0 +2010,1,26,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-5.6,53,100684,0,0,251,0,0,0,0,0,0,0,260,4.6,0,0,6000.0,77777,9,999999999,6,0.0860,0,88,0.099,0.0,0.0 +2010,1,27,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-5.0,58,100724,0,0,250,0,0,0,0,0,0,0,250,3.6,0,0,6000.0,77777,9,999999999,6,0.0870,0,88,0.099,0.0,0.0 +2010,1,27,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-5.0,58,100724,0,0,250,0,0,0,0,0,0,0,250,3.6,0,0,6000.0,77777,9,999999999,6,0.0870,0,88,0.099,0.0,0.0 +2010,1,27,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-5.6,58,100854,0,0,247,0,0,0,0,0,0,0,270,7.2,0,0,6000.0,77777,9,999999999,6,0.0870,0,88,0.099,0.0,0.0 +2010,1,27,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-6.1,55,100914,0,0,247,0,0,0,0,0,0,0,270,5.1,0,0,6000.0,77777,9,999999999,5,0.0870,0,88,0.099,0.0,0.0 +2010,1,27,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-6.1,55,100914,0,0,247,0,0,0,0,0,0,0,270,5.1,0,0,6000.0,77777,9,999999999,5,0.0870,0,88,0.099,0.0,0.0 +2010,1,27,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-6.1,57,101063,0,0,245,0,0,0,0,0,0,0,270,4.6,0,0,6000.0,77777,9,999999999,5,0.0870,0,88,0.099,0.0,0.0 +2010,1,27,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-6.1,60,101183,0,0,253,0,0,0,0,0,0,0,280,4.1,3,3,6000.0,77777,9,999999999,5,0.0870,0,88,0.099,0.0,0.0 +2010,1,27,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-6.1,60,101183,87,496,253,21,146,12,2448,0,1400,441,280,4.1,3,3,6000.0,77777,9,999999999,5,0.0870,0,88,0.099,0.0,0.0 +2010,1,27,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-6.1,55,101333,308,1410,247,126,441,38,14861,10179,4490,1539,270,5.1,0,0,6000.0,77777,9,999999999,5,0.0870,0,88,0.099,0.0,0.0 +2010,1,27,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-6.1,49,101394,487,1410,253,266,688,62,31658,33169,7396,2691,270,5.7,0,0,6000.0,77777,9,999999999,5,0.0870,0,88,0.099,0.0,0.0 +2010,1,27,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-6.1,49,101394,613,1410,253,393,811,71,47501,45442,8603,3270,270,5.7,0,0,6000.0,77777,9,999999999,5,0.0870,0,88,0.099,0.0,0.0 +2010,1,27,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-6.1,42,101344,676,1410,261,474,862,77,57604,50773,9382,3632,280,6.2,0,0,6000.0,77777,9,999999999,5,0.0870,0,88,0.099,0.0,0.0 +2010,1,27,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-5.6,42,101314,672,1410,275,464,742,109,54869,47813,12934,4888,280,5.1,3,3,6000.0,77777,9,999999999,6,0.0870,0,88,0.099,0.0,0.0 +2010,1,27,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-5.6,42,101314,602,1410,275,313,329,158,35456,23988,17977,6161,280,5.1,3,3,6000.0,77777,9,999999999,6,0.0870,0,88,0.099,0.0,0.0 +2010,1,27,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-6.7,38,101454,470,1410,279,292,431,109,33110,25499,12406,4166,270,6.2,5,5,6000.0,77777,9,999999999,5,0.0870,0,88,0.099,0.0,0.0 +2010,1,27,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-6.7,41,101544,285,1410,290,171,231,87,18727,9239,9564,2764,290,7.2,9,9,6000.0,1676,9,999999999,5,0.0870,0,88,0.099,0.0,0.0 +2010,1,27,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,4.4,-6.7,41,101544,61,1410,290,50,17,46,5091,0,4707,696,290,7.2,9,9,6000.0,1676,9,999999999,5,0.0870,0,88,0.099,0.0,0.0 +2010,1,27,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-8.3,39,101654,0,343,268,0,0,0,0,0,0,0,290,5.1,5,5,6000.0,77777,9,999999999,4,0.0870,0,88,0.099,0.0,0.0 +2010,1,27,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-7.8,42,101733,0,0,290,0,0,0,0,0,0,0,270,4.6,10,10,6000.0,1676,9,999999999,5,0.0870,0,88,0.099,0.0,0.0 +2010,1,27,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,-7.8,42,101733,0,0,262,0,0,0,0,0,0,0,270,4.6,3,3,6000.0,1676,9,999999999,5,0.0870,0,88,0.866,0.0,0.0 +2010,1,27,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-7.2,46,101863,0,0,261,0,0,0,0,0,0,0,270,3.1,3,3,6000.0,77777,9,999999999,5,0.0870,0,88,0.866,0.0,0.0 +2010,1,27,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-7.2,46,101893,0,0,280,0,0,0,0,0,0,0,270,3.1,9,9,6000.0,1676,9,999999999,5,0.0870,0,88,0.866,0.0,0.0 +2010,1,27,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.2,-7.2,46,101893,0,0,280,0,0,0,0,0,0,0,270,3.1,9,9,6000.0,1676,9,999999999,5,0.0870,0,88,0.866,0.0,0.0 +2010,1,27,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-7.2,50,101893,0,0,276,0,0,0,0,0,0,0,250,2.6,9,9,6000.0,4267,9,999999999,5,0.0870,0,88,0.866,0.0,0.0 +2010,1,28,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-6.7,60,101853,0,0,240,0,0,0,0,0,0,0,220,3.1,0,0,6000.0,77777,9,999999999,5,0.0870,0,88,0.866,0.0,0.0 +2010,1,28,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-6.7,60,101853,0,0,240,0,0,0,0,0,0,0,220,3.1,0,0,6000.0,77777,9,999999999,5,0.0870,0,88,0.866,0.0,0.0 +2010,1,28,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-7.2,57,101853,0,0,240,0,0,0,0,0,0,0,240,3.1,0,0,6000.0,77777,9,999999999,5,0.0870,0,88,0.866,0.0,0.0 +2010,1,28,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-7.2,57,101863,0,0,250,0,0,0,0,0,0,0,240,3.1,3,3,6000.0,77777,9,999999999,5,0.0870,0,88,0.866,0.0,0.0 +2010,1,28,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-7.2,57,101863,0,0,240,0,0,0,0,0,0,0,240,3.1,0,0,6000.0,77777,9,999999999,5,0.0870,0,88,0.866,0.0,0.0 +2010,1,28,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-7.2,65,101763,0,0,234,0,0,0,0,0,0,0,210,4.1,0,0,6000.0,77777,9,999999999,5,0.0870,0,88,0.866,0.0,0.0 +2010,1,28,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-7.2,69,101732,0,0,246,0,0,0,0,0,0,0,220,3.1,5,5,6000.0,77777,9,999999999,5,0.0870,0,88,0.866,0.0,0.0 +2010,1,28,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-7.2,69,101732,91,517,246,21,92,15,2412,0,1726,535,220,3.1,5,5,6000.0,77777,9,999999999,5,0.0870,0,88,0.866,0.0,0.0 +2010,1,28,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-7.2,54,101653,312,1410,256,77,136,54,8847,4075,6220,2068,240,5.7,5,5,6000.0,77777,9,999999999,5,0.0870,0,88,0.866,0.0,0.0 +2010,1,28,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-7.2,52,101543,492,1410,259,140,140,111,15936,8487,12682,4317,230,4.1,5,5,6000.0,77777,9,999999999,5,0.0870,0,88,0.866,0.0,0.0 +2010,1,28,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-7.2,52,101543,618,1410,274,281,327,144,32182,23082,16561,5852,230,4.1,9,9,6000.0,77777,9,999999999,5,0.0870,0,88,0.866,0.0,0.0 +2010,1,28,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-5.6,55,101293,681,1410,280,346,380,174,39501,28893,19956,7066,230,7.7,9,9,6000.0,1829,9,999999999,6,0.0870,0,88,0.866,0.0,0.0 +2010,1,28,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-3.3,62,101094,678,1410,287,319,220,212,35801,18103,23914,8027,230,8.2,9,9,6000.0,2286,9,999999999,7,0.0870,0,88,0.866,0.0,0.0 +2010,1,28,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,-3.3,62,101094,608,1410,295,210,75,173,23631,5656,19558,6582,230,8.2,10,10,6000.0,2286,0,999099999,7,0.0870,0,88,0.866,0.0,0.0 +2010,1,28,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.0,-1.0,86,101278,476,1410,290,113,17,105,12854,971,11988,4079,210,4.6,10,10,1207.0,457,0,999099999,9,0.0870,0,88,0.866,0.0,0.0 +2010,1,28,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.0,-1.0,86,101278,291,1410,290,72,1,72,8016,33,8043,2484,200,5.1,10,10,1207.0,213,0,999099999,9,0.0870,0,88,0.866,0.0,0.0 +2010,1,28,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,0.6,-0.6,91,100823,66,1410,265,29,39,27,3106,0,2901,730,220,4.6,5,5,3200.0,213,0,999099999,9,0.0870,0,88,0.866,0.0,0.0 +2010,1,28,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-1.1,87,100714,0,373,264,0,0,0,0,0,0,0,220,3.6,5,5,3200.0,77777,0,999099999,9,0.0870,0,88,0.866,0.0,0.0 +2010,1,28,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.0,-1.0,86,101278,0,0,290,0,0,0,0,0,0,0,250,7.7,10,10,3219.0,1981,0,999099999,9,0.0870,0,88,0.866,0.0,0.0 +2010,1,28,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-0.6,-3.9,76,100843,0,0,272,0,0,0,0,0,0,0,280,7.7,9,9,3219.0,1981,0,999099999,7,0.0870,0,88,0.866,0.5,0.0 +2010,1,28,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-4.4,-13.3,46,101132,0,0,235,0,0,0,0,0,0,0,280,9.8,5,5,3219.0,77777,0,999099999,3,0.0870,0,88,0.866,0.0,0.0 +2010,1,28,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-14.4,43,101232,0,0,232,0,0,0,0,0,0,0,280,9.3,5,5,3219.0,77777,0,999099999,2,0.0870,0,88,0.866,0.0,0.0 +2010,1,28,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-14.4,43,101232,0,0,228,0,0,0,0,0,0,0,280,9.3,3,3,3219.0,77777,0,999099999,2,0.0870,0,88,0.866,0.0,0.0 +2010,1,28,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-6.7,-18.9,33,101302,0,0,218,0,0,0,0,0,0,0,300,12.4,3,3,3219.0,77777,0,999099999,2,0.0870,0,88,0.866,0.0,0.0 +2010,1,29,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-7.2,-20.0,31,101312,0,0,216,0,0,0,0,0,0,0,290,10.3,3,3,3219.0,77777,0,999099999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,29,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-7.2,-20.0,31,101312,0,0,207,0,0,0,0,0,0,0,290,10.3,0,0,3219.0,77777,0,999099999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,29,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-8.9,-21.1,32,101392,0,0,201,0,0,0,0,0,0,0,290,11.8,0,0,3219.0,77777,0,999099999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,29,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-9.4,-21.7,32,101401,0,0,207,0,0,0,0,0,0,0,280,10.8,3,3,3219.0,77777,0,999099999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,29,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-9.4,-21.7,32,101401,0,0,199,0,0,0,0,0,0,0,280,10.8,0,0,3219.0,77777,0,999099999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,29,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-10.0,-21.1,36,101501,0,0,197,0,0,0,0,0,0,0,280,9.8,0,0,3219.0,77777,0,999099999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,29,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-10.6,-21.1,38,101551,0,0,195,0,0,0,0,0,0,0,280,11.8,0,0,3219.0,77777,0,999099999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,29,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-10.6,-21.1,38,101551,95,538,195,27,204,13,3150,0,1518,479,280,11.8,0,0,3219.0,77777,0,999099999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,29,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-10.0,-21.7,34,101621,317,1410,197,147,527,39,17377,13985,4618,1586,280,11.3,0,0,3219.0,77777,0,999099999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,29,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-9.4,-21.7,32,101681,497,1410,199,305,800,63,36389,40692,7534,2746,280,11.3,0,0,3219.0,77777,0,999099999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,29,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-9.4,-21.7,32,101681,623,1410,199,442,900,80,53128,53938,9642,3651,280,11.3,0,0,3219.0,77777,0,999099999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,29,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-7.2,-23.3,23,101522,686,1410,204,530,945,88,63991,59531,10656,4107,300,11.8,0,0,3219.0,77777,0,999099999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,29,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-7.2,-22.8,24,101452,683,1410,213,557,959,89,67152,60494,10761,4141,280,10.8,3,3,3219.0,77777,0,999099999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,29,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-7.2,-22.8,24,101452,613,1410,213,521,924,93,61794,57527,11064,4128,280,10.8,3,3,3219.0,77777,0,999099999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,29,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-6.7,-23.9,20,101532,481,1410,214,426,869,85,49490,48249,9905,3486,290,11.8,3,3,3219.0,77777,0,999099999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,29,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-7.2,-23.3,23,101592,297,1410,216,286,770,66,32222,26541,7459,2359,290,10.3,5,5,3219.0,77777,0,999099999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,29,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-7.2,-23.3,23,101592,72,1410,213,124,518,38,12999,0,4000,842,290,10.3,3,3,3219.0,77777,0,999099999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,29,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-8.3,-23.3,25,101721,0,403,209,0,0,0,0,0,0,0,290,11.3,3,3,3219.0,77777,0,999099999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,29,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-8.9,-23.9,25,101751,0,0,207,0,0,0,0,0,0,0,290,11.3,3,3,3219.0,77777,0,999099999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,29,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-8.9,-23.9,25,101751,0,0,198,0,0,0,0,0,0,0,290,11.3,0,0,3219.0,77777,9,999999999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,29,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-10.0,-24.4,26,101801,0,0,195,0,0,0,0,0,0,0,290,10.3,0,0,3219.0,77777,9,999999999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,29,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-10.6,-24.4,27,101831,0,0,193,0,0,0,0,0,0,0,300,9.8,0,0,3219.0,77777,9,999999999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,29,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-10.6,-24.4,27,101831,0,0,193,0,0,0,0,0,0,0,300,9.8,0,0,3219.0,77777,9,999999999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,29,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-11.7,-23.9,32,101891,0,0,190,0,0,0,0,0,0,0,290,7.7,0,0,3219.0,77777,9,999999999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,30,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-12.8,-24.4,33,101911,0,0,194,0,0,0,0,0,0,0,290,8.8,3,3,3219.0,77777,9,999999999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,30,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-12.8,-24.4,33,101911,0,0,194,0,0,0,0,0,0,0,290,8.7,3,3,3219.0,77777,9,999999999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,30,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-13.9,-24.4,37,101980,0,0,183,0,0,0,0,0,0,0,290,7.2,0,0,3219.0,77777,9,999999999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,30,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-13.9,-25.0,35,101950,0,0,183,0,0,0,0,0,0,0,290,7.7,0,0,3219.0,77777,9,999999999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,30,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-13.9,-25.0,35,101950,0,0,183,0,0,0,0,0,0,0,290,7.7,0,0,3219.0,77777,9,999999999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,30,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-14.4,-24.4,38,102060,0,0,193,0,0,0,0,0,0,0,280,6.2,5,5,3219.0,77777,9,999999999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,30,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-14.4,-24.4,38,102090,0,0,193,0,0,0,0,0,0,0,300,5.7,5,5,3219.0,77777,9,999999999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,30,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-14.4,-24.4,38,102090,99,560,193,27,191,13,3160,0,1523,482,300,5.7,5,5,3219.0,77777,9,999999999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,30,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-12.8,-22.8,39,102130,321,1409,211,110,301,45,12878,8865,5279,1798,320,6.7,9,9,3219.0,7620,9,999999999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,30,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-11.1,-21.7,37,102191,502,1409,217,290,677,71,34320,35926,8424,3052,310,6.7,9,9,3219.0,7620,9,999999999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,30,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-11.1,-21.7,37,102191,628,1409,205,437,865,85,52337,52798,10209,3859,310,6.7,5,5,3219.0,7620,9,999999999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,30,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-8.3,-20.0,34,101991,692,1409,228,472,839,78,57556,51304,9536,3704,330,5.1,9,9,3219.0,7620,9,999999999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,30,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-6.7,-19.4,32,101972,689,1409,241,513,862,89,61900,54270,10770,4154,320,4.1,10,10,3219.0,7620,9,999999999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,30,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-6.7,-19.4,32,101972,619,1409,241,440,764,84,52646,46173,10079,3800,320,4.1,10,10,3219.0,7620,9,999999999,1,0.0880,0,88,0.866,0.0,0.0 +2010,1,30,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.6,-18.3,32,101812,487,1409,246,322,504,114,36580,31533,12999,4381,330,3.6,10,10,3219.0,6706,9,999999999,2,0.0880,0,88,0.866,0.0,0.0 +2010,1,30,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.6,-18.3,32,101872,302,1409,246,175,215,98,19114,10165,10747,3053,350,3.1,10,10,3219.0,6706,9,999999999,2,0.0880,0,88,0.866,0.0,0.0 +2010,1,30,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-5.6,-18.3,32,101872,77,1409,246,64,49,51,6567,84,5258,858,350,3.1,10,10,3219.0,6706,9,999999999,2,0.0880,0,88,0.866,0.0,0.0 +2010,1,30,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.6,-17.8,33,101962,0,434,247,0,0,0,0,0,0,0,320,2.6,10,10,3219.0,6706,9,999999999,2,0.0880,0,88,0.866,0.0,0.0 +2010,1,30,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-6.1,-17.8,35,101902,0,0,238,0,0,0,0,0,0,0,350,3.6,9,9,3219.0,4267,9,999999999,2,0.0880,0,88,0.866,0.0,0.0 +2010,1,30,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-6.1,-17.8,35,101902,0,0,238,0,0,0,0,0,0,0,350,3.6,9,9,3219.0,4267,9,999999999,2,0.0880,0,88,0.099,0.0,0.0 +2010,1,30,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-7.2,-18.3,37,101732,0,0,234,0,0,0,0,0,0,0,340,3.6,9,9,3219.0,4267,9,999999999,2,0.0880,0,88,0.099,0.0,0.0 +2010,1,30,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-7.8,-18.3,38,101662,0,0,232,0,0,0,0,0,0,0,340,4.1,9,9,3219.0,4572,9,999999999,2,0.0880,0,88,0.099,0.0,0.0 +2010,1,30,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-7.8,-18.3,38,101662,0,0,238,0,0,0,0,0,0,0,340,4.1,10,10,3219.0,4572,9,999999999,2,0.0880,0,88,0.099,0.0,0.0 +2010,1,30,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-8.3,-18.3,40,101502,0,0,236,0,0,0,0,0,0,0,340,3.6,10,10,3219.0,7620,9,999999999,2,0.0880,0,88,0.099,0.0,0.0 +2010,1,31,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-8.9,-18.3,42,101451,0,0,234,0,0,0,0,0,0,0,340,5.1,10,10,3219.0,7620,9,999999999,2,0.0890,0,88,0.099,0.0,0.0 +2010,1,31,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-8.9,-18.3,42,101451,0,0,234,0,0,0,0,0,0,0,340,5.1,10,10,3219.0,7620,9,999999999,2,0.0890,0,88,0.099,0.0,0.0 +2010,1,31,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-8.9,-18.9,40,101451,0,0,234,0,0,0,0,0,0,0,330,5.7,10,10,3219.0,7620,9,999999999,2,0.0890,0,88,0.099,0.0,0.0 +2010,1,31,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-9.4,-18.9,42,101461,0,0,232,0,0,0,0,0,0,0,320,5.7,10,10,3219.0,7620,9,999999999,2,0.0890,0,88,0.099,0.0,0.0 +2010,1,31,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-9.4,-18.9,42,101461,0,0,225,0,0,0,0,0,0,0,320,5.7,9,9,3219.0,7620,9,999999999,2,0.0890,0,88,0.099,0.0,0.0 +2010,1,31,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-10.0,-23.3,29,101571,0,0,219,0,0,0,0,0,0,0,330,6.2,9,9,3219.0,7620,9,999999999,1,0.0890,0,88,0.099,0.0,0.0 +2010,1,31,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-10.6,-22.2,34,101621,0,0,206,0,0,0,0,0,0,0,330,5.1,5,5,3219.0,77777,9,999999999,1,0.0890,0,88,0.099,0.0,0.0 +2010,1,31,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-10.6,-22.2,34,101621,103,583,206,27,187,13,3169,0,1527,485,330,5.1,5,5,3219.0,77777,9,999999999,1,0.0890,0,88,0.099,0.0,0.0 +2010,1,31,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-9.4,-22.2,30,101651,326,1409,210,143,496,38,16986,13633,4521,1563,320,5.7,5,5,3219.0,77777,9,999999999,1,0.0890,0,88,0.099,0.0,0.0 +2010,1,31,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-7.8,-20.0,33,101642,506,1409,230,272,643,72,32188,34375,8543,3100,310,5.1,9,9,3219.0,6706,9,999999999,1,0.0890,0,88,0.099,0.0,0.0 +2010,1,31,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-7.8,-20.0,33,101642,633,1409,217,401,744,84,48113,45291,10107,3832,310,5.1,5,5,3219.0,6706,9,999999999,1,0.0890,0,88,0.099,0.0,0.0 +2010,1,31,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.9,-17.8,29,101562,697,1409,232,506,897,79,61696,54953,9658,3757,310,5.7,5,5,3219.0,77777,9,999999999,2,0.0890,0,88,0.099,0.0,0.0 +2010,1,31,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-16.7,30,101463,695,1409,235,531,905,82,64524,55773,9991,3878,320,5.7,5,5,3219.0,77777,9,999999999,2,0.0890,0,88,0.099,0.0,0.0 +2010,1,31,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-16.7,30,101463,625,1409,235,497,883,81,59688,52804,9755,3695,320,5.7,5,5,3219.0,77777,9,999999999,2,0.0890,0,88,0.099,0.0,0.0 +2010,1,31,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-17.2,26,101423,493,1409,239,408,826,76,47925,44164,8952,3212,320,5.7,5,5,3219.0,77777,9,999999999,2,0.0890,0,88,0.099,0.0,0.0 +2010,1,31,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-16.7,27,101473,308,1409,237,274,716,63,31091,24452,7169,2316,310,5.1,3,3,3219.0,77777,9,999999999,2,0.0890,0,88,0.099,0.0,0.0 +2010,1,31,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-16.7,27,101473,83,1409,237,121,470,38,12800,0,4035,922,310,5.1,3,3,3219.0,77777,9,999999999,2,0.0890,0,88,0.099,0.0,0.0 +2010,1,31,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-16.1,31,101533,0,464,224,0,0,0,0,0,0,0,270,5.7,0,0,3219.0,77777,9,999999999,2,0.0890,0,88,0.099,0.0,0.0 +2010,1,31,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-15.3,35,101605,0,0,225,0,0,0,0,0,0,0,260,4.6,0,0,3219.0,77777,9,999999999,2,0.0890,0,88,0.099,0.0,0.0 +2010,1,31,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.6,-15.1,36,101615,0,0,225,0,0,0,0,0,0,0,260,4.7,0,0,3219.0,77777,9,999999999,2,0.0890,0,88,0.099,0.0,0.0 +2010,1,31,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.9,-15.2,37,101617,0,0,231,0,0,0,0,0,0,0,260,5.2,3,3,3219.0,77777,9,999999999,2,0.0890,0,88,0.099,0.0,0.0 +2010,1,31,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.0,-14.0,38,101270,0,0,249,0,0,0,0,0,0,0,265,5.8,9,9,3219.0,3658,9,999999999,2,0.0890,0,88,0.099,0.0,0.0 +2010,1,31,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.0,-12.8,39,100916,0,0,256,0,0,0,0,0,0,0,270,6.1,10,10,3219.0,3658,9,999999999,3,0.0890,0,88,0.099,0.0,0.0 +2010,1,31,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.3,-12.3,38,100588,0,0,254,0,0,0,0,0,0,0,270,6.8,10,10,3219.0,3658,9,999999999,3,0.0890,0,88,0.099,0.0,0.0 +2013,2,1,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-11.8,38,100281,0,0,254,0,0,0,0,0,0,0,272,6.8,5,5,8000.0,77777,9,999999999,3,0.0890,0,88,0.105,0.0,0.0 +2013,2,1,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.8,-12.8,35,100321,0,0,250,0,0,0,0,0,0,0,270,6.9,3,3,8000.0,77777,9,999999999,3,0.0890,0,88,0.105,0.0,0.0 +2013,2,1,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.4,-13.2,36,100388,0,0,243,0,0,0,0,0,0,0,260,7.2,3,3,8000.0,77777,9,999999999,3,0.0890,0,88,0.105,0.0,0.0 +2013,2,1,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-13.1,37,100451,0,0,242,0,0,0,0,0,0,0,257,6.9,3,3,8000.0,77777,9,999999999,3,0.0890,0,88,0.105,0.0,0.0 +2013,2,1,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.9,-12.8,39,100501,0,0,242,0,0,0,0,0,0,0,252,7.1,3,3,8000.0,77777,9,999999999,3,0.0890,0,88,0.105,0.0,0.0 +2013,2,1,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.9,-12.2,41,100611,0,0,240,0,0,0,0,0,0,0,247,8.0,3,3,8000.0,77777,9,999999999,3,0.0890,0,88,0.105,0.0,0.0 +2013,2,1,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-12.8,40,100573,0,0,239,0,0,0,0,0,0,0,250,7.2,3,3,8000.0,77777,9,999999999,3,0.0890,0,88,0.105,0.0,0.0 +2013,2,1,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-12.8,40,100573,107,607,239,29,195,13,3411,0,1530,488,250,7.2,3,3,8000.0,77777,9,999999999,3,0.0890,0,88,0.105,0.0,0.0 +2013,2,1,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-11.7,40,100813,330,1408,248,146,505,36,17424,13362,4303,1496,250,10.3,5,5,8000.0,77777,9,999999999,3,0.0890,0,88,0.105,0.0,0.0 +2013,2,1,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-13.3,35,100823,512,1408,246,279,671,68,33182,35010,8108,2963,270,9.3,5,5,8000.0,77777,9,999999999,3,0.0890,0,88,0.105,0.0,0.0 +2013,2,1,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-13.3,35,100823,639,1408,246,410,775,78,49496,45934,9441,3604,270,9.3,5,5,8000.0,77777,9,999999999,3,0.0890,0,88,0.105,0.0,0.0 +2013,2,1,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-15.6,26,100813,703,1408,248,512,908,75,53745,88781,11053,1561,280,9.3,5,5,8000.0,77777,9,999999999,2,0.0890,0,88,0.105,0.0,0.0 +2013,2,1,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-15.6,24,100684,700,1408,250,501,781,110,59589,51886,13128,5011,310,8.2,5,5,8000.0,77777,9,999999999,2,0.0890,0,88,0.105,0.0,0.0 +2013,2,1,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-15.6,24,100684,631,1408,250,271,255,145,31135,18369,16728,5948,310,8.2,5,5,8000.0,77777,9,999999999,2,0.0890,0,88,0.105,0.0,0.0 +2013,2,1,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-16.1,26,100823,499,1408,245,293,341,146,32708,24030,16369,5241,300,7.7,5,5,8000.0,77777,9,999999999,2,0.0890,0,88,0.105,0.0,0.0 +2013,2,1,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-15.0,30,100913,314,1408,245,173,187,113,18739,10003,12293,3354,300,7.2,5,5,8000.0,77777,9,999999999,2,0.0890,0,88,0.105,0.0,0.0 +2013,2,1,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-15.0,30,100913,88,1408,259,67,76,56,6881,489,5779,959,300,7.2,9,9,8000.0,77777,9,999999999,2,0.0890,0,88,0.105,0.0,0.0 +2013,2,1,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-15.0,31,101223,0,495,257,0,0,0,0,0,0,0,290,7.2,9,9,8000.0,2286,9,999999999,2,0.0890,0,88,0.105,0.0,0.0 +2013,2,1,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-16.1,29,101413,0,0,240,0,0,0,0,0,0,0,320,8.8,5,5,8000.0,77777,9,999999999,2,0.0890,0,88,0.105,0.0,0.0 +2013,2,1,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-16.1,29,101413,0,0,236,0,0,0,0,0,0,0,320,8.7,3,3,8000.0,77777,9,999999999,2,0.0890,0,88,0.107,0.0,0.0 +2013,2,1,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-15.0,36,101612,0,0,233,0,0,0,0,0,0,0,290,6.2,3,3,8000.0,77777,9,999999999,2,0.0890,0,88,0.107,0.0,0.0 +2013,2,1,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.9,-16.1,34,101682,0,0,230,0,0,0,0,0,0,0,290,8.8,3,3,8000.0,77777,9,999999999,2,0.0890,0,88,0.107,0.0,0.0 +2013,2,1,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.9,-16.1,34,101682,0,0,230,0,0,0,0,0,0,0,290,8.7,3,3,8000.0,77777,9,999999999,2,0.0890,0,88,0.107,0.0,0.0 +2013,2,1,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-16.7,35,101802,0,0,226,0,0,0,0,0,0,0,280,7.2,3,3,8000.0,77777,9,999999999,2,0.0890,0,88,0.107,0.0,0.0 +2013,2,2,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-16.1,37,101852,0,0,226,0,0,0,0,0,0,0,280,9.3,3,3,8000.0,77777,9,999999999,2,0.0890,0,88,0.107,0.0,0.0 +2013,2,2,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-16.1,37,101852,0,0,226,0,0,0,0,0,0,0,280,9.3,3,3,8000.0,77777,9,999999999,2,0.0890,0,88,0.107,0.0,0.0 +2013,2,2,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.6,-15.6,41,102002,0,0,225,0,0,0,0,0,0,0,300,6.7,3,3,8000.0,77777,9,999999999,2,0.0890,0,88,0.107,0.0,0.0 +2013,2,2,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-6.1,-16.1,41,102052,0,0,223,0,0,0,0,0,0,0,290,5.1,3,3,8000.0,77777,9,999999999,2,0.0890,0,88,0.107,0.0,0.0 +2013,2,2,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-6.1,-16.1,41,102052,0,0,223,0,0,0,0,0,0,0,290,5.1,3,3,8000.0,77777,9,999999999,2,0.0890,0,88,0.107,0.0,0.0 +2013,2,2,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-6.7,-16.7,41,102212,0,0,220,0,0,0,0,0,0,0,290,5.7,3,3,8000.0,77777,9,999999999,2,0.0890,0,88,0.107,0.0,0.0 +2013,2,2,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-7.2,-16.7,42,102271,0,0,219,0,0,0,0,0,0,0,290,5.1,3,3,8000.0,77777,9,999999999,2,0.0890,0,88,0.107,0.0,0.0 +2013,2,2,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-7.2,-16.7,42,102271,112,631,222,31,215,13,3658,0,1535,492,290,5.1,5,5,8000.0,77777,9,999999999,2,0.0890,0,88,0.107,0.0,0.0 +2013,2,2,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-6.1,-17.8,35,102382,335,1408,225,150,518,36,17938,14391,4311,1502,270,5.7,5,5,8000.0,77777,9,999999999,2,0.0890,0,88,0.107,0.0,0.0 +2013,2,2,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.6,-17.2,35,102362,517,1408,227,304,778,58,36653,39322,7008,2589,250,4.1,5,5,8000.0,77777,9,999999999,2,0.0890,0,88,0.107,0.0,0.0 +2013,2,2,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.6,-17.2,35,102362,644,1408,227,434,875,67,45648,84710,10014,1430,250,4.1,5,5,8000.0,77777,9,999999999,2,0.0890,0,88,0.107,0.0,0.0 +2013,2,2,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-16.1,29,102212,709,1408,240,449,673,129,52833,46976,15237,5744,240,3.6,5,5,8000.0,77777,9,999999999,2,0.0890,0,88,0.107,0.0,0.0 +2013,2,2,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-15.6,31,102092,706,1408,240,506,794,105,60464,52131,12588,4835,190,5.7,5,5,8000.0,77777,9,999999999,2,0.0890,0,88,0.107,0.0,0.0 +2013,2,2,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-15.6,31,102092,637,1408,254,396,485,161,45171,36423,18446,6448,190,5.7,9,9,8000.0,77777,9,999999999,2,0.0890,0,88,0.107,0.0,0.0 +2013,2,2,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-13.9,34,101893,505,1408,265,349,543,117,39714,34474,13365,4545,200,6.2,10,10,8000.0,5182,9,999999999,3,0.0890,0,88,0.107,0.0,0.0 +2013,2,2,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-13.3,36,101833,320,1408,266,152,126,102,16636,6245,11209,3231,180,6.7,10,10,8000.0,3353,9,999999999,3,0.0890,0,88,0.107,0.0,0.0 +2013,2,2,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-1.7,-13.3,36,101833,94,1408,266,54,20,48,5646,0,5040,1046,180,6.7,10,10,8000.0,3353,9,999999999,3,0.0890,0,88,0.107,0.0,0.0 +2013,2,2,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-13.9,36,101803,0,525,263,0,0,0,0,0,0,0,220,5.7,10,10,8000.0,4572,9,999999999,3,0.0890,0,88,0.107,0.0,0.0 +2013,2,2,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-13.3,38,101813,0,0,264,0,0,0,0,0,0,0,230,7.2,10,10,8000.0,4572,9,999999999,3,0.0890,0,88,0.107,0.0,0.0 +2013,2,2,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.2,-13.3,38,101813,0,0,264,0,0,0,0,0,0,0,230,7.2,10,10,8000.0,4572,9,999999999,3,0.0890,0,88,0.107,0.0,0.0 +2013,2,2,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-12.2,42,101763,0,0,265,0,0,0,0,0,0,0,230,5.7,10,10,8000.0,4572,9,999999999,3,0.0890,0,88,0.107,0.0,0.0 +2013,2,2,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-12.2,44,101762,0,0,263,0,0,0,0,0,0,0,230,5.7,10,10,8000.0,3962,9,999999999,3,0.0890,0,88,0.107,0.0,0.0 +2013,2,2,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.8,-12.2,44,101762,0,0,263,0,0,0,0,0,0,0,230,5.7,10,10,8000.0,3962,9,999999999,3,0.0890,0,88,0.107,0.0,0.0 +2013,2,2,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-12.2,44,101732,0,0,263,0,0,0,0,0,0,0,240,6.7,10,10,8000.0,2134,9,999999999,3,0.0890,0,88,0.107,0.0,0.0 +2013,2,3,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-11.1,51,101722,0,0,262,0,0,0,0,0,0,0,270,4.1,10,10,8000.0,1524,0,999099999,3,0.0900,0,88,0.107,0.0,0.0 +2013,2,3,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-3.3,-11.1,51,101722,0,0,262,0,0,0,0,0,0,0,270,4.1,10,10,8000.0,1524,0,999099999,3,0.0900,0,88,0.107,0.0,0.0 +2013,2,3,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-4.4,-8.9,68,101542,0,0,260,0,0,0,0,0,0,0,330,4.1,10,10,6437.0,1067,0,999099999,4,0.0900,0,88,0.107,0.0,0.0 +2013,2,3,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-4.4,-8.9,68,101542,0,0,260,0,0,0,0,0,0,0,330,2.1,10,10,6437.0,1524,0,999099999,4,0.0900,0,88,0.107,0.0,0.0 +2013,2,3,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-4.4,-8.9,68,101542,0,0,260,0,0,0,0,0,0,0,330,2.1,10,10,6437.0,1524,0,999099999,4,0.0900,0,88,0.107,0.0,0.0 +2013,2,3,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-8.3,75,101492,0,0,258,0,0,0,0,0,0,0,350,2.1,10,10,6437.0,1219,0,999099999,4,0.0900,0,88,0.107,0.0,0.0 +2013,2,3,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-5.0,-8.0,77,101277,0,0,251,0,0,0,0,0,0,0,340,3.1,9,9,4023.0,975,0,999099999,5,0.0900,0,88,0.107,0.0,0.0 +2013,2,3,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-5.0,-7.8,79,101402,117,656,259,10,0,10,973,0,980,391,350,2.6,10,10,4800.0,975,0,999099999,5,0.0900,0,88,0.107,0.0,0.0 +2013,2,3,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-4.4,-7.8,75,101422,340,1408,261,53,0,53,5256,0,5295,2098,340,3.1,10,10,4800.0,914,0,999099999,5,0.0900,0,88,0.107,0.0,0.0 +2013,2,3,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-4.0,-8.0,71,101277,522,1408,262,107,8,104,12331,482,12027,4229,340,3.1,10,10,8047.0,732,0,999099999,5,0.0900,0,88,0.107,0.0,0.0 +2013,2,3,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-4.4,-7.8,75,101352,650,1408,261,129,1,129,15001,68,15059,5523,320,3.1,10,10,2800.0,732,0,999099999,5,0.0900,0,88,0.107,0.0,0.0 +2013,2,3,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-3.0,-7.0,71,101278,715,1408,267,128,1,128,15071,68,15128,5729,320,3.6,10,10,4828.0,884,0,999099999,5,0.0900,0,88,0.107,0.0,0.0 +2013,2,3,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-3.0,-7.0,71,101278,712,1408,267,80,0,80,8175,0,8245,3828,320,5.1,10,10,4023.0,884,0,999099999,5,0.0900,0,88,0.107,0.0,0.0 +2013,2,3,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-3.3,-6.7,75,100993,643,1408,266,80,0,80,8129,0,8197,3693,330,5.1,10,10,4000.0,884,0,999099999,5,0.0900,0,88,0.107,0.0,0.0 +2013,2,3,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-3.0,-7.0,71,101278,511,1408,267,138,23,129,15588,1507,14630,4899,320,5.1,10,10,4023.0,792,0,999099999,5,0.0900,0,88,0.107,0.0,0.0 +2013,2,3,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-3.0,-7.0,71,101278,325,1408,267,86,0,86,8516,0,8579,2951,340,4.1,10,10,8047.0,853,0,999099999,5,0.0900,0,88,0.107,0.0,0.0 +2013,2,3,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-3.3,-6.7,75,100843,99,1408,266,71,201,47,7463,0,4961,1090,330,3.1,10,10,4000.0,853,0,999099999,5,0.0900,0,88,0.107,0.0,0.0 +2013,2,3,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-3.9,-6.7,79,100763,0,556,264,0,0,0,0,0,0,0,340,4.6,10,10,6437.0,914,0,999099999,5,0.0900,0,88,0.107,0.0,0.0 +2013,2,3,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.9,-7.2,75,100803,0,0,264,0,0,0,0,0,0,0,340,4.1,10,10,6437.0,914,0,999099999,5,0.0900,0,88,0.107,0.0,0.0 +2013,2,3,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-3.9,-7.2,75,100803,0,0,264,0,0,0,0,0,0,0,340,4.1,10,10,6437.0,914,0,999099999,5,0.0900,0,88,0.866,0.8,0.0 +2013,2,3,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.9,-7.8,71,100723,0,0,263,0,0,0,0,0,0,0,340,3.6,10,10,6437.0,1036,0,999099999,5,0.0900,0,88,0.866,0.0,0.0 +2013,2,3,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-3.9,-7.2,75,100683,0,0,264,0,0,0,0,0,0,0,330,5.7,10,10,8047.0,1219,0,999099999,5,0.0900,0,88,0.866,0.0,0.0 +2013,2,3,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-3.9,-7.2,75,100683,0,0,264,0,0,0,0,0,0,0,330,5.7,10,10,8000.0,1219,0,999099999,5,0.0900,0,88,0.866,0.0,0.0 +2013,2,3,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.9,-7.8,71,100633,0,0,263,0,0,0,0,0,0,0,310,3.6,10,10,8000.0,2134,0,999099999,5,0.0900,0,88,0.866,0.0,0.0 +2013,2,4,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.9,-7.2,75,100623,0,0,264,0,0,0,0,0,0,0,290,3.1,10,10,8000.0,2134,0,999099999,5,0.0900,0,88,0.866,0.0,0.0 +2013,2,4,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-3.9,-7.2,75,100623,0,0,264,0,0,0,0,0,0,0,290,3.1,10,10,8000.0,2134,0,999099999,5,0.0900,0,88,0.866,0.0,0.0 +2013,2,4,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.9,-7.8,71,100583,0,0,263,0,0,0,0,0,0,0,300,5.1,10,10,8000.0,3658,0,999099999,5,0.0900,0,88,0.866,0.0,0.0 +2013,2,4,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-10.0,65,100603,0,0,236,0,0,0,0,0,0,0,290,4.1,5,5,8000.0,77777,0,999099999,4,0.0900,0,88,0.866,0.0,0.0 +2013,2,4,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-10.0,65,100603,0,0,257,0,0,0,0,0,0,0,290,4.1,10,10,8000.0,77777,0,999099999,4,0.0900,0,88,0.866,0.0,0.0 +2013,2,4,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-10.6,61,100663,0,0,231,0,0,0,0,0,0,0,270,6.2,3,3,8000.0,77777,0,999099999,3,0.0900,0,88,0.866,0.0,0.0 +2013,2,4,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-10.6,61,100723,0,0,235,0,0,0,0,0,0,0,280,8.8,5,5,8000.0,77777,0,999099999,3,0.0900,0,88,0.866,0.0,0.0 +2013,2,4,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-10.6,61,100723,121,682,231,34,196,17,3949,0,1977,628,280,8.7,3,3,8000.0,77777,0,999099999,3,0.0900,0,88,0.866,0.0,0.0 +2013,2,4,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.9,-11.1,53,100813,345,1407,235,161,503,46,18936,16021,5421,1873,280,7.7,3,3,8000.0,77777,0,999099999,3,0.0900,0,88,0.866,0.0,0.0 +2013,2,4,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-12.2,44,100823,527,1407,238,324,767,74,38414,41612,8797,3220,280,10.8,3,3,8000.0,77777,0,999099999,3,0.0900,0,88,0.866,0.0,0.0 +2013,2,4,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-12.2,44,100823,655,1407,238,461,867,91,55174,53724,10924,4159,280,10.8,3,3,8000.0,77777,0,999099999,3,0.0900,0,88,0.866,0.0,0.0 +2013,2,4,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-13.9,34,100793,720,1407,244,472,732,115,56145,49276,13727,5264,290,8.8,5,5,8000.0,77777,0,999099999,2,0.0900,0,88,0.866,0.0,0.0 +2013,2,4,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-15.0,30,100743,718,1407,245,470,669,126,55496,46329,14933,5669,280,11.3,5,5,8000.0,77777,0,999099999,2,0.0900,0,88,0.866,0.0,0.0 +2013,2,4,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-15.0,30,100743,649,1407,245,383,424,172,43560,32693,19651,6825,280,11.3,5,5,8000.0,77777,0,999099999,2,0.0900,0,88,0.866,0.0,0.0 +2013,2,4,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-14.4,34,100833,517,1407,256,247,241,131,27931,16188,14874,4983,260,10.3,9,9,8000.0,1829,0,999099999,2,0.0900,0,88,0.866,0.0,0.0 +2013,2,4,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-15.6,29,100843,331,1407,242,209,397,103,22948,20242,11355,3322,260,10.3,5,5,8000.0,77777,0,999099999,2,0.0900,0,88,0.866,0.0,0.0 +2013,2,4,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-15.6,29,100843,105,1407,242,90,335,50,9460,0,5278,1147,260,10.3,5,5,8000.0,77777,0,999099999,2,0.0900,0,88,0.866,0.0,0.0 +2013,2,4,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-15.0,34,100993,0,587,239,0,0,0,0,0,0,0,270,6.7,5,5,8000.0,77777,0,999099999,2,0.0900,0,88,0.866,0.0,0.0 +2013,2,4,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-15.0,36,101093,0,0,233,0,0,0,0,0,0,0,270,7.2,3,3,8000.0,77777,0,999099999,2,0.0900,0,88,0.866,0.0,0.0 +2013,2,4,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-15.0,36,101093,0,0,224,0,0,0,0,0,0,0,270,7.2,0,0,8000.0,77777,9,999999999,2,0.0900,0,88,0.866,0.0,0.0 +2013,2,4,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-4.4,-14.4,41,101222,0,0,221,0,0,0,0,0,0,0,280,5.7,0,0,8000.0,77777,9,999999999,2,0.0900,0,88,0.866,0.0,0.0 +2013,2,4,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-4.4,-15.0,39,101272,0,0,220,0,0,0,0,0,0,0,280,7.2,0,0,8000.0,77777,9,999999999,2,0.0900,0,88,0.866,0.0,0.0 +2013,2,4,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-4.4,-15.0,39,101272,0,0,220,0,0,0,0,0,0,0,280,7.2,0,0,8000.0,77777,9,999999999,2,0.0900,0,88,0.866,0.0,0.0 +2013,2,4,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.6,-14.4,46,101342,0,0,226,0,0,0,0,0,0,0,270,6.7,3,3,8000.0,77777,9,999999999,2,0.0900,0,88,0.866,0.0,0.0 +2013,2,5,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.6,-14.4,46,101382,0,0,250,0,0,0,0,0,0,0,270,7.2,10,10,8000.0,3048,9,999999999,2,0.0910,0,88,0.866,0.0,0.0 +2013,2,5,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-5.6,-14.4,46,101382,0,0,250,0,0,0,0,0,0,0,270,7.2,10,10,8000.0,3048,9,999999999,2,0.0910,0,88,0.866,0.0,0.0 +2013,2,5,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-14.4,43,101412,0,0,252,0,0,0,0,0,0,0,270,3.6,10,10,8000.0,3353,9,999999999,2,0.0910,0,88,0.866,0.0,0.0 +2013,2,5,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-14.4,43,101452,0,0,252,0,0,0,0,0,0,0,280,6.2,10,10,8000.0,3048,9,999999999,2,0.0910,0,88,0.866,0.0,0.0 +2013,2,5,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-5.0,-14.4,43,101452,0,0,252,0,0,0,0,0,0,0,280,6.2,10,10,8000.0,3048,9,999999999,2,0.0910,0,88,0.866,0.0,0.0 +2013,2,5,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-14.4,43,101472,0,0,252,0,0,0,0,0,0,0,280,3.1,10,10,8000.0,3048,9,999999999,2,0.0910,0,88,0.866,0.0,0.0 +2013,2,5,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-4.4,-13.9,43,101512,0,0,255,0,0,0,0,0,0,0,270,2.6,10,10,8000.0,2896,9,999999999,3,0.0910,0,88,0.866,0.0,0.0 +2013,2,5,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-4.4,-13.9,43,101512,126,708,255,12,0,12,1170,0,1178,467,270,2.6,10,10,8000.0,2896,9,999999999,3,0.0910,0,88,0.866,0.0,0.0 +2013,2,5,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.9,-14.4,40,101612,351,1407,256,60,2,59,6934,75,6835,2312,290,4.1,10,10,8000.0,2134,9,999999999,2,0.0910,0,88,0.866,0.0,0.0 +2013,2,5,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.9,-14.4,40,101642,533,1407,256,114,8,111,13112,505,12813,4489,349,2.1,10,10,8000.0,1829,9,999999999,2,0.0910,0,88,0.866,0.0,0.0 +2013,2,5,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-3.9,-14.4,40,101642,661,1407,256,255,162,179,28979,12684,20437,7094,348,1.8,10,10,8000.0,1829,9,999999999,2,0.0910,0,88,0.866,0.0,0.0 +2013,2,5,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-14.4,36,101573,726,1407,261,338,247,212,38357,20610,24179,8411,360,1.5,10,10,8000.0,1829,9,999999999,2,0.0910,0,88,0.866,0.0,0.0 +2013,2,5,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-13.9,38,101533,724,1407,261,384,332,210,43591,27584,23958,8343,150,2.6,10,10,8000.0,1829,9,999999999,3,0.0910,0,88,0.866,0.0,0.0 +2013,2,5,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.8,-13.9,38,101533,655,1407,261,378,378,190,42694,30344,21563,7337,150,2.6,10,10,8000.0,1829,9,999999999,3,0.0910,0,88,0.866,0.0,0.0 +2013,2,5,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-11.7,46,101483,523,1407,263,292,281,171,32344,21397,19031,5936,130,3.1,10,10,8000.0,1524,9,999999999,3,0.0910,0,88,0.866,0.0,0.0 +2013,2,5,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-10.6,51,101413,337,1407,265,177,149,121,19200,8510,13183,3647,120,4.6,10,10,8000.0,1524,9,999999999,3,0.0910,0,88,0.866,0.0,0.0 +2013,2,5,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.8,-10.6,51,101413,111,1407,265,77,50,62,7971,564,6448,1200,120,4.6,10,10,8000.0,1524,9,999999999,3,0.0910,0,88,0.866,0.0,0.0 +2013,2,5,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-8.9,59,101403,0,617,266,0,0,0,0,0,0,0,150,4.1,10,10,8000.0,1402,9,999999999,4,0.0910,0,88,0.866,0.0,0.0 +2013,2,5,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-8.3,62,101443,0,0,267,0,0,0,0,0,0,0,160,2.6,10,10,8000.0,1219,9,999999999,4,0.0910,0,88,0.866,0.0,0.0 +2013,2,5,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.8,-8.3,62,101443,0,0,267,0,0,0,0,0,0,0,160,2.6,10,10,8000.0,1219,0,999099999,4,0.0910,0,88,0.866,0.0,0.0 +2013,2,5,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-4.0,-7.0,77,101277,0,0,263,0,0,0,0,0,0,0,190,1.5,10,10,4828.0,823,0,999099999,5,0.0910,0,88,0.866,0.0,0.0 +2013,2,5,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-3.0,-6.0,77,101278,0,0,268,0,0,0,0,0,0,0,141,0.0,10,10,3219.0,640,0,999099999,6,0.0910,0,88,0.866,0.0,0.0 +2013,2,5,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-2.8,-5.6,79,101423,0,0,270,0,0,0,0,0,0,0,148,0.0,10,10,4800.0,640,0,999099999,6,0.0910,0,88,0.866,0.0,0.0 +2013,2,5,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-2.8,-4.4,87,101333,0,0,271,0,0,0,0,0,0,0,20,1.5,10,10,4828.0,518,0,999099999,6,0.0910,0,88,0.866,1.0,0.0 +2013,2,6,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-2.8,-4.4,87,101323,0,0,271,0,0,0,0,0,0,0,350,2.6,10,10,4828.0,457,0,999099999,6,0.0910,0,88,0.866,0.0,0.0 +2013,2,6,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-2.8,-4.4,87,101323,0,0,271,0,0,0,0,0,0,0,350,2.6,10,10,4800.0,457,0,999099999,6,0.0910,0,88,0.866,0.0,0.0 +2013,2,6,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-3.0,-4.0,92,101278,0,0,270,0,0,0,0,0,0,0,310,2.6,10,10,3219.0,853,0,999099999,7,0.0910,0,88,0.866,0.0,0.0 +2013,2,6,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-3.0,-4.0,92,101278,0,0,270,0,0,0,0,0,0,0,320,2.1,10,10,3219.0,1250,0,999099999,7,0.0910,0,88,0.866,0.0,0.0 +2013,2,6,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-3.3,-5.0,87,101293,0,0,268,0,0,0,0,0,0,0,340,1.5,10,10,6000.0,1250,0,999099999,6,0.0910,0,88,0.866,0.0,0.0 +2013,2,6,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-4.4,87,101383,0,0,271,0,0,0,0,0,0,0,310,2.1,10,10,6000.0,1829,0,999099999,6,0.0910,0,88,0.866,0.0,0.0 +2013,2,6,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-5.0,83,101453,0,0,270,0,0,0,0,0,0,0,310,2.1,10,10,6000.0,1676,0,999099999,6,0.0910,0,88,0.866,0.0,0.0 +2013,2,6,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.8,-5.0,83,101453,131,735,263,33,109,22,3775,0,2521,789,310,2.1,9,9,6000.0,1676,0,999099999,6,0.0910,0,88,0.866,0.0,0.0 +2013,2,6,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-3.9,79,101543,356,1406,270,154,376,65,17661,14357,7475,2510,310,1.5,9,9,6000.0,2286,0,999099999,7,0.0910,0,88,0.866,0.0,0.0 +2013,2,6,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-3.9,72,101553,539,1406,275,315,633,100,36523,37435,11634,4160,270,3.1,9,9,6000.0,2438,0,999099999,7,0.0910,0,88,0.866,0.0,0.0 +2013,2,6,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.0,-3.9,72,101553,667,1406,259,435,732,114,51215,47528,13470,5062,270,3.1,5,5,6000.0,2438,0,999099999,7,0.0910,0,88,0.866,0.0,0.0 +2013,2,6,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-5.6,53,101513,732,1406,266,524,784,127,61921,53414,15064,5756,268,3.1,5,5,6000.0,77777,0,999099999,6,0.0910,0,88,0.866,0.0,0.0 +2013,2,6,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-6.1,47,101464,730,1406,270,530,770,127,62612,52527,15060,5749,280,6.2,5,5,6000.0,77777,0,999099999,5,0.0910,0,88,0.866,0.0,0.0 +2013,2,6,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-6.1,47,101464,661,1406,286,477,656,148,54977,46880,17129,6190,280,6.2,9,9,6000.0,77777,0,999099999,5,0.0910,0,88,0.866,0.0,0.0 +2013,2,6,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-7.8,42,101593,529,1406,282,375,566,130,42515,37546,14798,5020,270,8.8,9,9,6000.0,1524,0,999099999,5,0.0910,0,88,0.866,0.0,0.0 +2013,2,6,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-8.3,42,101643,343,1406,264,290,625,92,32234,29404,10264,3168,270,10.3,5,5,6000.0,77777,0,999099999,4,0.0910,0,88,0.866,0.0,0.0 +2013,2,6,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-8.3,42,101643,116,1406,260,147,445,57,15387,2814,5992,1265,270,10.3,3,3,6000.0,77777,0,999099999,4,0.0910,0,88,0.866,0.0,0.0 +2013,2,6,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-9.4,40,101873,0,648,257,0,0,0,0,0,0,0,290,5.7,3,3,6000.0,77777,0,999099999,4,0.0910,0,88,0.866,0.0,0.0 +2013,2,6,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-10.0,38,102023,0,0,245,0,0,0,0,0,0,0,280,6.2,0,0,6000.0,77777,0,999099999,4,0.0910,0,88,0.866,0.0,0.0 +2013,2,6,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-10.0,38,102023,0,0,245,0,0,0,0,0,0,0,280,6.2,0,0,6000.0,77777,9,999999999,4,0.0910,0,88,0.866,0.3,0.0 +2013,2,6,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-13.9,31,102233,0,0,234,0,0,0,0,0,0,0,290,6.7,0,0,6000.0,77777,9,999999999,3,0.0910,0,88,0.866,0.0,0.0 +2013,2,6,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-15.0,30,102352,0,0,231,0,0,0,0,0,0,0,280,5.7,0,0,6000.0,77777,9,999999999,2,0.0910,0,88,0.866,0.0,0.0 +2013,2,6,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-15.0,30,102352,0,0,231,0,0,0,0,0,0,0,280,5.7,0,0,6000.0,77777,9,999999999,2,0.0910,0,88,0.866,0.0,0.0 +2013,2,6,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-16.1,31,102522,0,0,224,0,0,0,0,0,0,0,280,4.6,0,0,6000.0,77777,9,999999999,2,0.0910,0,88,0.866,0.0,0.0 +2013,2,7,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-16.1,32,102602,0,0,223,0,0,0,0,0,0,0,290,5.1,0,0,6000.0,77777,9,999999999,2,0.0910,0,88,0.866,0.0,0.0 +2013,2,7,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-16.1,32,102602,0,0,223,0,0,0,0,0,0,0,290,5.1,0,0,6000.0,77777,9,999999999,2,0.0910,0,88,0.866,0.0,0.0 +2013,2,7,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.6,-15.6,41,102722,0,0,216,0,0,0,0,0,0,0,10,4.6,0,0,6000.0,77777,9,999999999,2,0.0910,0,88,0.866,1.0,0.0 +2013,2,7,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-6.1,-17.8,35,102851,0,0,212,0,0,0,0,0,0,0,350,2.6,0,0,6000.0,77777,9,999999999,2,0.0910,0,88,0.866,0.0,0.0 +2013,2,7,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-6.1,-17.8,35,102851,0,0,212,0,0,0,0,0,0,0,350,2.6,0,0,6000.0,77777,9,999999999,2,0.0910,0,88,0.866,0.0,0.0 +2013,2,7,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-6.7,-18.9,33,102981,0,0,209,0,0,0,0,0,0,0,350,3.1,0,0,6000.0,77777,9,999999999,2,0.0910,0,88,0.866,0.0,0.0 +2013,2,7,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-7.2,-18.3,37,103081,0,0,208,0,0,0,0,0,0,0,360,2.6,0,0,6000.0,77777,9,999999999,2,0.0910,0,88,0.866,0.0,0.0 +2013,2,7,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-7.2,-18.3,37,103081,136,763,221,30,124,17,3518,0,1996,642,360,2.6,5,5,6000.0,77777,9,999999999,2,0.0910,0,88,0.866,0.0,0.0 +2013,2,7,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.6,-18.9,30,103251,361,1406,239,156,432,49,18356,15367,5778,2004,300,6.2,9,9,6000.0,6096,9,999999999,2,0.0910,0,88,0.866,0.0,0.0 +2013,2,7,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-18.9,29,103301,544,1406,241,300,612,83,35405,35311,9824,3589,320,6.7,9,9,6000.0,6096,9,999999999,2,0.0910,0,88,0.866,0.0,0.0 +2013,2,7,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-5.0,-18.9,29,103301,673,1406,227,446,779,95,53411,49638,11412,4360,320,6.7,5,5,6000.0,6096,9,999999999,2,0.0910,0,88,0.866,0.0,0.0 +2013,2,7,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-18.9,24,103302,739,1406,235,551,890,100,66488,58302,12105,4720,320,6.2,5,5,6000.0,77777,9,999999999,2,0.0910,0,88,0.866,0.0,0.0 +2013,2,7,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-18.3,24,103222,737,1406,238,579,896,105,69581,59361,12660,4918,340,3.6,5,5,6000.0,77777,9,999999999,2,0.0910,0,88,0.866,0.0,0.0 +2013,2,7,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-18.3,24,103222,667,1406,238,547,888,100,65176,57239,11953,4539,340,3.6,5,5,6000.0,77777,9,999999999,2,0.0910,0,88,0.866,0.0,0.0 +2013,2,7,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-18.9,22,103162,535,1406,239,424,753,94,49455,44999,10999,3948,30,4.6,5,5,6000.0,77777,9,999999999,2,0.0910,0,88,0.866,0.0,0.0 +2013,2,7,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-18.9,23,103172,349,1406,251,257,451,95,28576,22443,10602,3264,20,3.1,9,9,6000.0,2134,9,999999999,2,0.0910,0,88,0.866,0.0,0.0 +2013,2,7,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.2,-18.9,23,103172,122,1406,251,109,211,59,11434,2034,6216,1322,20,3.1,9,9,6000.0,2134,9,999999999,2,0.0910,0,88,0.866,0.0,0.0 +2013,2,7,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-18.3,26,103222,0,679,230,0,0,0,0,0,0,0,50,2.1,3,3,6000.0,77777,9,999999999,2,0.0910,0,88,0.866,0.0,0.0 +2013,2,7,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-14.4,36,103302,0,0,239,0,0,0,0,0,0,0,80,3.1,5,5,6000.0,77777,9,999999999,2,0.0910,0,88,0.866,0.0,0.0 +2013,2,7,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-14.4,36,103302,0,0,226,0,0,0,0,0,0,0,80,3.1,0,0,6000.0,77777,9,999999999,2,0.0910,0,88,0.866,0.0,0.0 +2013,2,7,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-13.9,38,103292,0,0,261,0,0,0,0,0,0,0,90,3.1,10,10,6000.0,2743,9,999999999,3,0.0910,0,88,0.866,0.0,0.0 +2013,2,7,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-11.1,49,103242,0,0,264,0,0,0,0,0,0,0,90,4.6,10,10,6000.0,2591,9,999999999,3,0.0910,0,88,0.866,0.0,0.0 +2013,2,7,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.8,-11.1,49,103242,0,0,264,0,0,0,0,0,0,0,90,4.6,10,10,6000.0,2591,9,999999999,3,0.0910,0,88,0.866,0.0,0.0 +2013,2,7,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.0,-8.0,60,101278,0,0,270,0,0,0,0,0,0,0,130,4.1,10,10,6000.0,762,9,999999999,5,0.0910,0,88,0.866,0.0,0.0 +2013,2,8,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-7.2,65,103142,0,0,270,0,0,0,0,0,0,0,120,4.6,10,10,6000.0,762,9,999999999,5,0.0920,0,88,0.866,0.0,0.0 +2013,2,8,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.2,-7.2,65,103142,0,0,270,0,0,0,0,0,0,0,120,4.6,10,10,6000.0,762,9,999999999,5,0.0920,0,88,0.866,0.0,0.0 +2013,2,8,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-5.6,68,102952,0,0,269,0,0,0,0,0,0,0,110,5.7,9,9,6000.0,1006,9,999999999,6,0.0920,0,88,0.866,0.0,0.0 +2013,2,8,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.0,-6.0,66,101278,0,0,276,0,0,0,0,0,0,0,120,7.2,10,10,6000.0,853,9,999999999,5,0.0920,0,88,0.866,0.0,0.0 +2013,2,8,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-0.6,-5.6,66,102842,0,0,278,0,0,0,0,0,0,0,110,6.7,10,10,6000.0,853,9,999999999,6,0.0920,0,88,0.866,0.0,0.0 +2013,2,8,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-5.0,66,102742,0,0,282,0,0,0,0,0,0,0,120,7.7,10,10,6000.0,701,9,999999999,6,0.0920,0,88,0.866,0.0,0.0 +2013,2,8,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-5.0,66,102723,0,0,282,0,0,0,0,0,0,0,110,8.8,10,10,6000.0,792,9,999999999,6,0.0920,0,88,0.866,0.0,0.0 +2013,2,8,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.0,-5.0,66,102723,142,791,282,11,0,11,1072,0,1080,438,110,8.7,10,10,6000.0,792,9,999999999,6,0.0920,0,88,0.866,0.0,0.0 +2013,2,8,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-4.4,66,102603,367,1405,285,36,0,36,3575,0,3602,1538,100,10.3,10,10,6000.0,732,9,999999999,6,0.0920,0,88,0.866,0.0,0.0 +2013,2,8,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,0.6,-3.3,73,102533,550,1405,286,65,0,65,6552,0,6604,2922,100,10.3,10,10,8047.0,671,0,999099999,7,0.0920,0,88,0.866,0.0,0.0 +2013,2,8,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,0.6,-3.3,73,102533,679,1405,286,189,50,166,21650,3706,19100,6834,100,10.3,10,10,8000.0,671,0,999099999,7,0.0920,0,88,0.866,0.0,0.0 +2013,2,8,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.0,-2.0,79,101278,745,1405,289,219,59,191,25099,4583,21995,7953,90,10.3,10,10,1207.0,396,0,999099999,8,0.0920,0,88,0.866,0.0,0.0 +2013,2,8,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,0.6,-1.1,87,102043,743,1405,288,199,27,184,22862,2061,21238,7731,80,11.3,10,10,1207.0,183,0,999099999,9,0.0920,0,88,0.866,0.0,0.0 +2013,2,8,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,0.6,-1.1,87,102043,673,1405,274,176,6,172,20071,448,19705,6977,80,11.3,8,8,1200.0,183,0,999099999,9,0.0920,0,88,0.866,0.0,0.0 +2013,2,8,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,0.0,-1.1,91,101753,541,1405,286,128,4,126,14570,257,14399,4969,70,11.8,10,10,805.0,183,0,999099999,9,0.0920,0,88,0.866,0.0,0.0 +2013,2,8,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,0.0,-1.1,91,101503,355,1405,286,71,0,71,7039,0,7091,2684,60,11.8,10,10,805.0,274,0,999099999,9,0.0920,0,88,0.866,0.0,0.0 +2013,2,8,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,0.0,-1.1,91,101503,128,1405,286,33,0,33,3210,0,3232,1054,60,11.8,10,10,800.0,274,0,999099999,9,0.0920,0,88,0.866,0.0,0.0 +2013,2,8,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,0.0,-1.0,92,101278,0,710,272,0,0,0,0,0,0,0,60,13.9,8,8,805.0,335,0,999099999,9,0.0920,0,88,0.866,0.0,0.0 +2013,2,8,19,60,?9?9?9?9E0?9?9?9*9*9?9?9?9?9?9?9?9?9*9*9*9*9,-1.0,-1.0,100,101278,0,0,281,0,0,0,0,0,0,0,50,16.0,10,10,805.0,122,0,999099999,9,0.0920,0,88,0.866,0.0,0.0 +2013,2,8,20,60,?9?9?9?9E0?9?9?9*9*9?9?9?9?9?9?9?9*9*9*9*9*9,-0.6,-0.6,100,101043,0,0,284,0,0,0,0,0,0,0,50,17.0,10,10,800.0,122,0,999099999,9,0.0920,0,88,0.866,6.0,0.0 +2013,2,8,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-1.0,-2.0,92,101278,0,0,267,0,0,0,0,0,0,0,40,17.0,8,8,402.0,91,0,999099999,8,0.0920,0,88,0.866,6.0,0.0 +2013,2,8,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-1.0,-2.0,92,101278,0,0,280,0,0,0,0,0,0,0,30,14.9,10,10,1207.0,91,0,999099999,8,0.0920,0,88,0.866,0.4,0.0 +2013,2,8,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-4.4,-4.4,100,100533,0,0,264,0,0,0,0,0,0,0,10,13.4,10,10,1200.0,91,0,999099999,6,0.0920,0,88,0.866,0.0,0.0 +2013,2,8,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-6.0,-7.0,92,101277,0,0,256,0,0,0,0,0,0,0,10,14.9,10,10,1207.0,91,0,999099999,5,0.0920,0,88,0.866,0.0,0.0 +2013,2,9,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-7.8,-8.9,91,99972,0,0,247,0,0,0,0,0,0,0,10,13.4,10,10,1207.0,91,0,999099999,4,0.0920,0,88,0.866,0.0,0.0 +2013,2,9,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-7.8,-8.9,91,99972,0,0,247,0,0,0,0,0,0,0,10,13.4,10,10,1200.0,91,0,999099999,4,0.0920,0,88,0.866,0.0,0.0 +2013,2,9,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-9.0,-10.0,92,101277,0,0,235,0,0,0,0,0,0,0,350,10.3,9,9,402.0,152,0,999099999,4,0.0920,0,88,0.866,0.0,0.0 +2013,2,9,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-9.0,-9.0,100,101277,0,0,231,0,0,0,0,0,0,0,350,9.3,8,8,402.0,122,0,999099999,4,0.0920,0,88,0.866,0.0,0.0 +2013,2,9,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-8.3,-9.4,91,100192,0,0,238,0,0,0,0,0,0,0,350,9.8,9,9,400.0,122,0,999099999,4,0.0920,0,88,0.866,0.0,0.0 +2013,2,9,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-7.8,-8.9,91,100232,0,0,240,0,0,0,0,0,0,0,340,9.3,9,9,402.0,213,0,999099999,4,0.0920,0,88,0.866,0.0,0.0 +2013,2,9,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-8.0,-9.0,92,101277,0,0,239,0,0,0,0,0,0,0,360,11.3,9,9,402.0,366,0,999099999,4,0.0920,0,88,0.866,0.0,0.0 +2013,2,9,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-7.8,-8.9,91,100352,147,820,240,18,0,18,1757,0,1769,684,350,8.2,9,9,800.0,366,0,999099999,4,0.0920,0,88,0.866,0.0,0.0 +2013,2,9,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-7.0,-8.0,92,101277,373,1405,251,31,0,31,3083,0,3106,1349,350,8.2,10,10,805.0,457,0,999099999,5,0.0920,0,88,0.866,0.0,0.0 +2013,2,9,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-7.8,-8.9,91,100632,556,1405,240,83,0,83,8379,0,8447,3619,330,8.2,9,9,805.0,488,0,999099999,4,0.0920,0,88,0.866,0.0,0.0 +2013,2,9,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-8.0,-9.0,92,101277,685,1405,239,170,26,157,19603,1915,18182,6593,320,11.3,9,9,805.0,396,0,999099999,4,0.0920,0,88,0.866,0.0,0.0 +2013,2,9,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-8.0,-9.0,92,101277,751,1405,246,268,82,224,30399,6913,25539,8912,330,7.7,10,10,805.0,488,0,999099999,4,0.0920,0,88,0.866,0.0,0.0 +2013,2,9,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-7.2,-8.9,86,100892,749,1405,249,338,172,244,38060,15052,27623,9387,330,11.3,10,10,805.0,610,0,999099999,4,0.0920,0,88,0.866,0.0,0.0 +2013,2,9,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-7.2,-8.9,86,100892,680,1405,249,354,255,224,39624,21785,25204,8333,330,11.3,10,10,800.0,610,0,999099999,4,0.0920,0,88,0.866,0.0,0.0 +2013,2,9,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-7.0,-10.0,77,101277,547,1405,249,322,347,172,35845,26469,19237,6149,330,11.8,10,10,800.0,1036,0,999099999,4,0.0920,0,88,0.866,0.0,0.0 +2013,2,9,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-6.7,-11.7,64,101342,361,1405,249,195,182,129,21200,11113,14087,3951,320,11.3,10,10,800.0,1219,0,999099999,3,0.0920,0,88,0.866,0.0,0.0 +2013,2,9,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-6.7,-11.7,64,101342,133,1405,242,96,104,66,10040,1602,6933,1443,320,11.3,9,9,800.0,1219,0,999099999,3,0.0920,0,88,0.866,0.0,0.0 +2013,2,9,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-7.2,-12.2,64,101592,0,741,239,0,0,0,0,0,0,0,330,10.3,9,9,800.0,7620,0,999099999,3,0.0920,0,88,0.866,0.0,0.0 +2013,2,9,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-7.2,-12.8,61,101732,0,0,239,0,0,0,0,0,0,0,320,7.7,9,9,800.0,6096,0,999099999,3,0.0920,0,88,0.866,0.0,0.0 +2013,2,9,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-7.2,-12.8,61,101732,0,0,225,0,0,0,0,0,0,0,320,7.7,5,5,800.0,6096,9,999999999,3,0.0920,0,88,0.866,0.0,0.0 +2013,2,9,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-8.3,-14.4,58,101941,0,0,217,0,0,0,0,0,0,0,310,8.2,3,3,800.0,77777,9,999999999,2,0.0920,0,88,0.866,0.0,0.0 +2013,2,9,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-8.9,-15.0,58,102011,0,0,215,0,0,0,0,0,0,0,310,8.2,3,3,800.0,77777,9,999999999,2,0.0920,0,88,0.866,0.0,0.0 +2013,2,9,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-8.9,-15.0,58,102011,0,0,215,0,0,0,0,0,0,0,310,8.2,3,3,800.0,77777,9,999999999,2,0.0920,0,88,0.866,0.0,0.0 +2013,2,9,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-9.4,-16.1,54,102141,0,0,203,0,0,0,0,0,0,0,310,7.7,0,0,800.0,77777,9,999999999,2,0.0920,0,88,0.866,0.0,0.0 +2013,2,10,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-9.4,-16.7,51,102211,0,0,203,0,0,0,0,0,0,0,310,7.7,0,0,800.0,77777,9,999999999,2,0.0930,0,88,0.866,0.0,0.0 +2013,2,10,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-9.4,-16.7,51,102211,0,0,203,0,0,0,0,0,0,0,310,7.7,0,0,800.0,77777,9,999999999,2,0.0930,0,88,0.866,0.0,0.0 +2013,2,10,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-8.9,-16.7,49,102301,0,0,204,0,0,0,0,0,0,0,320,6.7,0,0,800.0,77777,9,999999999,2,0.0930,0,88,0.866,0.0,0.0 +2013,2,10,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-8.9,-16.7,49,102381,0,0,204,0,0,0,0,0,0,0,310,8.8,0,0,800.0,77777,9,999999999,2,0.0930,0,88,0.866,0.0,0.0 +2013,2,10,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-8.9,-16.7,49,102381,0,0,204,0,0,0,0,0,0,0,310,8.7,0,0,800.0,77777,9,999999999,2,0.0930,0,88,0.866,0.0,0.0 +2013,2,10,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-9.4,-17.8,46,102581,0,0,211,0,0,0,0,0,0,0,300,5.1,3,3,800.0,77777,9,999999999,2,0.0930,0,88,0.866,0.0,0.0 +2013,2,10,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-9.4,-17.2,49,102651,0,0,211,0,0,0,0,0,0,0,310,5.1,3,3,800.0,77777,9,999999999,2,0.0930,0,88,0.866,0.0,0.0 +2013,2,10,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-9.4,-17.2,49,102651,153,849,211,52,256,23,6007,0,2661,847,310,5.1,3,3,800.0,77777,9,999999999,2,0.0930,0,88,0.866,0.0,0.0 +2013,2,10,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-7.2,-17.2,41,102811,378,1404,218,190,549,52,22358,21000,6132,2138,310,3.6,3,3,800.0,77777,9,999999999,2,0.0930,0,88,0.866,0.0,0.0 +2013,2,10,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.6,-17.2,35,102881,562,1404,223,358,806,77,42652,45937,9199,3410,300,4.6,3,3,800.0,77777,9,999999999,2,0.0930,0,88,0.866,0.0,0.0 +2013,2,10,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.6,-17.2,35,102881,691,1404,223,497,888,94,59763,56594,11338,4367,300,4.6,3,3,800.0,77777,9,999999999,2,0.0930,0,88,0.866,0.0,0.0 +2013,2,10,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-16.1,28,102822,757,1404,238,583,922,103,70408,60792,12479,4891,310,4.1,3,3,800.0,77777,9,999999999,2,0.0930,0,88,0.866,0.0,0.0 +2013,2,10,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-16.1,23,102773,755,1404,246,610,928,107,73432,61761,12924,5049,320,3.1,3,3,800.0,77777,9,999999999,2,0.0930,0,88,0.866,0.0,0.0 +2013,2,10,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-16.1,23,102773,686,1404,246,575,912,102,68638,59219,12215,4668,320,3.1,3,3,800.0,77777,9,999999999,2,0.0930,0,88,0.866,0.0,0.0 +2013,2,10,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-9.4,45,102693,553,1404,240,481,871,91,56420,51160,10707,3900,140,2.6,0,0,800.0,77777,9,999999999,4,0.0930,0,88,0.866,0.0,0.0 +2013,2,10,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-9.4,43,102723,367,1404,253,339,778,75,38595,33880,8565,2836,160,1.5,3,3,800.0,77777,9,999999999,4,0.0930,0,88,0.866,0.0,0.0 +2013,2,10,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-9.4,43,102723,139,1404,256,168,566,49,18086,1064,5294,1371,160,1.5,5,5,800.0,77777,9,999999999,4,0.0930,0,88,0.866,0.0,0.0 +2013,2,10,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-13.9,26,102743,0,771,252,0,0,0,0,0,0,0,230,3.1,3,3,800.0,77777,9,999999999,3,0.0930,0,88,0.866,0.0,0.0 +2013,2,10,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-11.7,38,102772,0,0,236,0,0,0,0,0,0,0,284,0.0,0,0,800.0,77777,9,999999999,3,0.0930,0,88,0.866,0.0,0.0 +2013,2,10,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-11.7,38,102772,0,0,236,0,0,0,0,0,0,0,286,0.0,0,0,800.0,77777,9,999999999,3,0.0930,0,88,0.866,0.0,0.0 +2013,2,10,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-12.2,40,102772,0,0,232,0,0,0,0,0,0,0,210,2.6,0,0,800.0,77777,9,999999999,3,0.0930,0,88,0.866,0.0,0.0 +2013,2,10,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-11.1,51,102762,0,0,227,0,0,0,0,0,0,0,220,2.6,0,0,800.0,77777,9,999999999,3,0.0930,0,88,0.866,0.0,0.0 +2013,2,10,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-11.1,51,102762,0,0,237,0,0,0,0,0,0,0,220,2.6,3,3,800.0,77777,9,999999999,3,0.0930,0,88,0.866,0.0,0.0 +2013,2,10,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-8.9,54,102742,0,0,245,0,0,0,0,0,0,0,240,1.3,3,3,800.0,77777,0,999099999,4,0.0930,0,88,0.866,0.0,0.0 +2013,2,11,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-2.0,-9.0,55,101278,0,0,262,0,0,0,0,0,0,0,260,1.5,9,9,4023.0,77777,0,999099999,4,0.0930,0,88,0.866,0.0,0.0 +2013,2,11,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-5.6,-11.1,62,102722,0,0,246,0,0,0,0,0,0,0,200,3.6,9,9,4023.0,77777,0,999099999,3,0.0930,0,88,0.866,0.0,0.0 +2013,2,11,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-4.4,-10.0,61,102522,0,0,252,0,0,0,0,0,0,0,170,2.1,9,9,4023.0,7620,0,999099999,4,0.0930,0,88,0.866,0.0,0.0 +2013,2,11,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-4.4,-9.4,65,102492,0,0,252,0,0,0,0,0,0,0,190,2.6,9,9,4023.0,7620,0,999099999,4,0.0930,0,88,0.866,0.0,0.0 +2013,2,11,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-4.4,-9.4,65,102492,0,0,259,0,0,0,0,0,0,0,190,2.6,10,10,4023.0,7620,0,999099999,4,0.0930,0,88,0.866,0.0,0.0 +2013,2,11,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-8.3,65,102392,0,0,265,0,0,0,0,0,0,0,190,3.1,10,10,4023.0,3962,0,999099999,4,0.0930,0,88,0.866,0.0,0.0 +2013,2,11,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-7.2,69,102322,0,0,268,0,0,0,0,0,0,0,180,3.6,10,10,4023.0,3048,0,999099999,5,0.0930,0,88,0.866,0.0,0.0 +2013,2,11,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.8,-7.2,69,102322,158,879,268,3,0,3,293,0,295,128,180,3.6,10,10,4023.0,3048,0,999099999,5,0.0930,0,88,0.866,0.0,0.0 +2013,2,11,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-1.1,-5.0,72,102103,384,1404,277,10,0,10,995,0,1002,464,160,4.6,10,10,8047.0,1524,0,999099999,6,0.0930,0,88,0.866,0.0,0.0 +2013,2,11,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-3.0,78,101278,568,1404,284,55,0,55,5552,0,5597,2545,150,5.1,10,10,8047.0,1676,0,919099999,7,0.0930,0,88,0.866,0.0,0.0 +2013,2,11,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.6,-2.2,80,101893,698,1404,287,53,0,53,5405,0,5451,2616,150,5.1,10,10,8047.0,1676,0,919099999,8,0.0930,0,88,0.866,0.0,0.0 +2013,2,11,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.0,0.0,87,101279,764,1404,295,92,0,92,9426,0,9508,4445,150,4.1,10,10,9656.0,640,0,919099999,10,0.0930,0,88,0.866,0.0,0.0 +2013,2,11,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.0,1.0,93,101279,762,1404,296,197,21,186,22679,1593,21514,7905,140,2.6,10,10,3219.0,274,0,919099999,11,0.0930,0,88,0.866,0.0,0.0 +2013,2,11,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,2.2,1.7,96,101204,692,1404,298,127,0,127,12931,0,13041,5620,160,3.1,10,10,3200.0,274,0,919099999,12,0.0930,0,88,0.866,0.0,0.0 +2013,2,11,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,4.4,3.3,93,100814,559,1404,309,93,2,93,10875,113,10910,3988,190,4.6,10,10,3219.0,396,0,919099999,14,0.0930,0,88,0.866,0.0,0.0 +2013,2,11,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,5.0,4.0,93,101279,373,1404,313,89,2,89,9979,90,10015,3234,200,4.6,10,10,9656.0,396,0,919099999,15,0.0930,0,88,0.866,0.0,0.0 +2013,2,11,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.6,5.0,96,100714,145,1404,316,81,242,45,8781,0,4895,1342,210,3.1,10,10,9656.0,396,0,919099999,16,0.0930,0,88,0.866,0.0,0.0 +2013,2,11,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,6.0,5.0,93,101279,0,802,318,0,0,0,0,0,0,0,200,3.1,10,10,2414.0,213,0,919099999,16,0.0930,0,88,0.866,0.0,0.0 +2013,2,11,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,6.0,6.0,100,101279,0,0,319,0,0,0,0,0,0,0,200,2.6,10,10,1609.0,152,0,919099999,18,0.0930,0,88,0.866,0.0,0.0 +2013,2,11,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,5.6,4.4,92,100474,0,0,316,0,0,0,0,0,0,0,210,2.6,10,10,1600.0,152,0,919999999,15,0.0930,0,88,0.866,5.0,0.0 +2013,2,11,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,5.0,4.0,93,101279,0,0,313,0,0,0,0,0,0,0,220,2.1,10,10,4023.0,244,0,919999999,15,0.0930,0,88,0.866,0.1,0.0 +2013,2,11,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,6.1,5.0,93,100245,0,0,319,0,0,0,0,0,0,0,230,4.1,10,10,4023.0,244,0,919999999,16,0.0930,0,88,0.866,0.0,0.0 +2013,2,11,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,6.1,5.0,93,100245,0,0,319,0,0,0,0,0,0,0,230,4.1,10,10,4000.0,244,0,919999999,16,0.0930,0,88,0.866,0.0,0.0 +2013,2,11,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.9,3.3,96,100244,0,0,307,0,0,0,0,0,0,0,290,3.6,10,10,4828.0,244,0,919999999,14,0.0930,0,88,0.866,0.0,0.0 +2013,2,12,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,5.0,3.0,87,101279,0,0,303,0,0,0,0,0,0,0,280,3.6,9,9,4828.0,3048,0,919999999,13,0.0940,0,88,0.866,0.0,0.0 +2013,2,12,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,4.4,3.3,93,100234,0,0,309,0,0,0,0,0,0,0,280,5.1,10,10,4800.0,3048,0,919999999,14,0.0940,0,88,0.866,0.0,0.0 +2013,2,12,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-1.7,66,100204,0,0,261,0,0,0,0,0,0,0,280,9.3,0,0,4800.0,77777,0,919999999,8,0.0940,0,88,0.866,0.0,0.0 +2013,2,12,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-2.2,66,100264,0,0,259,0,0,0,0,0,0,0,270,7.2,0,0,4800.0,77777,0,919999999,8,0.0940,0,88,0.866,0.0,0.0 +2013,2,12,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-2.2,66,100264,0,0,259,0,0,0,0,0,0,0,270,7.2,0,0,4800.0,77777,0,919999999,8,0.0940,0,88,0.866,0.0,0.0 +2013,2,12,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-2.8,65,100354,0,0,256,0,0,0,0,0,0,0,280,7.7,0,0,4800.0,77777,0,919999999,7,0.0940,0,88,0.866,0.0,0.0 +2013,2,12,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-3.3,62,100414,0,0,267,0,0,0,0,0,0,0,260,4.1,3,3,4800.0,77777,0,919999999,7,0.0940,0,88,0.866,0.0,0.0 +2013,2,12,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-3.3,62,100414,164,910,287,30,60,25,3457,0,2886,923,260,4.1,9,9,4800.0,77777,0,919999999,7,0.0940,0,88,0.866,0.0,0.0 +2013,2,12,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-2.2,66,100504,390,1403,270,164,384,64,19009,15652,7438,2567,230,5.7,3,3,4800.0,77777,0,919999999,8,0.0940,0,88,0.866,0.0,0.0 +2013,2,12,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-3.3,53,100514,574,1403,275,326,590,97,38180,35137,11397,4173,270,7.2,3,3,4800.0,77777,0,919999999,7,0.0940,0,88,0.866,0.0,0.0 +2013,2,12,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-3.3,53,100514,704,1403,280,482,800,111,57256,51795,13231,5067,270,7.2,5,5,4800.0,77777,0,919999999,7,0.0940,0,88,0.866,0.0,0.0 +2013,2,12,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-4.4,45,100495,770,1403,283,419,415,207,47960,33397,23812,8586,290,10.3,5,5,4800.0,77777,0,919999999,6,0.0940,0,88,0.866,0.0,0.0 +2013,2,12,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-3.9,47,100545,768,1403,300,487,536,190,56102,41669,21992,8066,280,10.8,9,9,4800.0,1494,0,919999999,7,0.0940,0,88,0.866,0.0,0.0 +2013,2,12,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.1,-3.9,47,100545,698,1403,300,485,618,157,56022,44926,18213,6661,280,10.8,9,9,4800.0,1494,0,919999999,7,0.0940,0,88,0.866,0.0,0.0 +2013,2,12,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-3.3,49,100624,566,1403,301,347,357,182,38565,27567,20326,6505,270,8.8,9,9,4800.0,1524,0,919999999,7,0.0940,0,88,0.866,0.0,0.0 +2013,2,12,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-3.3,53,100694,379,1403,296,152,90,110,16813,4894,12217,3746,270,8.2,9,9,4800.0,1280,0,919999999,7,0.0940,0,88,0.866,0.0,0.0 +2013,2,12,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.0,-3.3,53,100694,151,1403,296,65,2,65,6869,28,6898,1599,270,8.2,9,9,4800.0,1280,0,919999999,7,0.0940,0,88,0.866,0.0,0.0 +2013,2,12,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-3.3,53,100704,0,833,296,0,0,0,0,0,0,0,280,5.1,9,9,4800.0,1433,0,919999999,7,0.0940,0,88,0.866,0.0,0.0 +2013,2,12,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-3.3,57,100804,0,0,292,0,0,0,0,0,0,0,260,5.1,9,9,4800.0,1372,0,919999999,7,0.0940,0,88,0.866,0.0,0.0 +2013,2,12,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.9,-3.3,57,100804,0,0,292,0,0,0,0,0,0,0,260,5.1,9,9,4800.0,1372,9,999999999,7,0.0940,0,88,0.866,0.0,0.0 +2013,2,12,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-3.3,57,101124,0,0,300,0,0,0,0,0,0,0,260,6.7,10,10,4800.0,1250,9,999999999,7,0.0940,0,88,0.866,0.0,0.0 +2013,2,12,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-3.9,57,101034,0,0,288,0,0,0,0,0,0,0,280,5.7,9,9,4800.0,1250,9,999999999,7,0.0940,0,88,0.866,0.0,0.0 +2013,2,12,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,-3.9,57,101034,0,0,268,0,0,0,0,0,0,0,280,5.7,3,3,4800.0,1250,9,999999999,7,0.0940,0,88,0.866,0.0,0.0 +2013,2,12,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-4.4,59,100954,0,0,263,0,0,0,0,0,0,0,280,4.1,3,3,4800.0,77777,9,999999999,6,0.0940,0,88,0.866,0.0,0.0 +2013,2,13,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-5.0,58,101004,0,0,261,0,0,0,0,0,0,0,270,5.7,3,3,4800.0,77777,9,999999999,6,0.0940,0,88,0.866,0.0,0.0 +2013,2,13,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-5.0,58,101004,0,0,261,0,0,0,0,0,0,0,270,5.7,3,3,4800.0,77777,9,999999999,6,0.0940,0,88,0.866,0.0,0.0 +2013,2,13,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-6.1,55,100963,0,0,247,0,0,0,0,0,0,0,270,5.1,0,0,4800.0,77777,9,999999999,5,0.0940,0,88,0.866,0.0,0.0 +2013,2,13,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-6.1,55,101023,0,0,258,0,0,0,0,0,0,0,260,5.7,3,3,4800.0,77777,9,999999999,5,0.0940,0,88,0.866,0.0,0.0 +2013,2,13,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-6.1,55,101023,0,0,258,0,0,0,0,0,0,0,260,5.7,3,3,4800.0,77777,9,999999999,5,0.0940,0,88,0.866,0.0,0.0 +2013,2,13,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-6.1,57,101063,0,0,256,0,0,0,0,0,0,0,270,3.6,3,3,4800.0,77777,9,999999999,5,0.0940,0,88,0.866,0.0,0.0 +2013,2,13,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-6.7,60,101083,0,0,251,0,0,0,0,0,0,0,240,3.6,3,3,4800.0,77777,9,999999999,5,0.0940,0,88,0.866,0.0,0.0 +2013,2,13,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-6.7,60,101083,170,941,240,56,235,27,6436,0,3109,991,240,3.6,0,0,4800.0,77777,9,999999999,5,0.0940,0,88,0.866,0.0,0.0 +2013,2,13,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-5.6,53,101104,396,1403,251,195,522,57,22862,20869,6698,2345,270,3.6,0,0,4800.0,77777,9,999999999,6,0.0940,0,88,0.866,0.0,0.0 +2013,2,13,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-5.6,51,101044,581,1403,265,362,774,81,43068,44084,9664,3604,300,3.1,3,3,4800.0,77777,9,999999999,6,0.0940,0,88,0.866,0.0,0.0 +2013,2,13,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-5.6,51,101044,710,1403,265,499,856,99,59894,54179,11921,4615,300,3.1,3,3,4800.0,77777,9,999999999,6,0.0940,0,88,0.866,0.0,0.0 +2013,2,13,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-5.6,49,100964,777,1403,266,585,885,112,70347,58407,13515,5310,250,2.6,3,3,4800.0,77777,9,999999999,6,0.0940,0,88,0.866,0.0,0.0 +2013,2,13,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-5.0,48,100904,775,1403,276,569,762,145,67048,54073,17156,6579,274,2.6,5,5,4800.0,77777,9,999999999,6,0.0940,0,88,0.866,0.0,0.0 +2013,2,13,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-5.0,48,100904,705,1403,292,386,319,217,43506,26514,24584,8388,268,2.6,9,9,4800.0,77777,9,999999999,6,0.0940,0,88,0.866,0.0,0.0 +2013,2,13,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-5.6,44,100794,572,1403,277,390,568,144,44262,39639,16412,5632,270,2.6,5,5,4800.0,77777,9,999999999,6,0.0940,0,88,0.866,0.0,0.0 +2013,2,13,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-5.6,44,100714,385,1403,277,320,668,94,35936,33591,10594,3412,290,1.5,5,5,4800.0,77777,9,999999999,6,0.0940,0,88,0.866,0.0,0.0 +2013,2,13,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-5.6,44,100714,156,1403,277,177,554,55,19047,4477,5941,1546,290,1.5,5,5,4800.0,77777,9,999999999,6,0.0940,0,88,0.866,0.0,0.0 +2013,2,13,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-3.3,67,100734,0,863,282,0,0,0,0,0,0,0,130,3.6,9,9,4800.0,6096,9,999999999,7,0.0940,0,88,0.866,0.0,0.0 +2013,2,13,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-3.3,67,100704,0,0,290,0,0,0,0,0,0,0,150,3.1,10,10,4800.0,5486,9,999999999,7,0.0940,0,88,0.866,0.0,0.0 +2013,2,13,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.7,-3.3,67,100704,0,0,290,0,0,0,0,0,0,0,150,3.1,10,10,4800.0,5486,9,999999999,7,0.0940,0,88,0.866,0.0,0.0 +2013,2,13,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-3.3,73,100674,0,0,286,0,0,0,0,0,0,0,40,1.5,10,10,4800.0,4877,9,999999999,7,0.0940,0,88,0.866,0.0,0.0 +2013,2,13,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-2.8,73,100624,0,0,288,0,0,0,0,0,0,0,75,0.0,10,10,4800.0,3048,9,999999999,8,0.0940,0,88,0.866,0.0,0.0 +2013,2,13,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.1,-2.8,73,100624,0,0,288,0,0,0,0,0,0,0,85,0.0,10,10,4800.0,3048,9,999999999,8,0.0940,0,88,0.866,0.0,0.0 +2013,2,13,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-2.2,74,100524,0,0,292,0,0,0,0,0,0,0,360,1.5,10,10,4800.0,3048,9,999999999,8,0.0940,0,88,0.866,0.0,0.0 +2013,2,14,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-2.2,74,100674,0,0,292,0,0,0,0,0,0,0,340,1.5,10,10,4800.0,2438,9,999999999,8,0.0940,0,88,0.866,0.0,0.0 +2013,2,14,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.7,-2.2,74,100674,0,0,292,0,0,0,0,0,0,0,340,1.5,10,10,4800.0,2438,0,999099999,8,0.0940,0,88,0.866,0.0,0.0 +2013,2,14,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-4.4,61,100604,0,0,289,0,0,0,0,0,0,0,5,0.0,10,10,4800.0,1829,0,999099999,6,0.0940,0,88,0.866,0.0,0.0 +2013,2,14,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-5.0,61,100654,0,0,278,0,0,0,0,0,0,0,330,3.1,9,9,4800.0,1097,0,999099999,6,0.0940,0,88,0.866,0.0,0.0 +2013,2,14,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.1,-5.0,61,100654,0,0,286,0,0,0,0,0,0,0,330,3.1,10,10,4800.0,1097,0,999099999,6,0.0940,0,88,0.866,0.0,0.0 +2013,2,14,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-6.7,54,100744,0,0,274,0,0,0,0,0,0,0,350,4.6,9,9,4800.0,1463,0,999099999,5,0.0940,0,88,0.866,0.0,0.0 +2013,2,14,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-7.2,54,100863,0,0,252,0,0,0,0,0,0,0,340,4.6,3,3,4800.0,77777,0,999099999,5,0.0940,0,88,0.866,0.0,0.0 +2013,2,14,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-7.2,54,100863,176,973,252,57,218,29,6533,0,3330,1059,340,4.6,3,3,4800.0,77777,0,999099999,5,0.0940,0,88,0.866,0.0,0.0 +2013,2,14,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-7.2,46,101054,403,1402,261,195,498,61,22785,20934,7145,2495,360,4.6,3,3,4800.0,77777,0,999099999,5,0.0940,0,88,0.866,0.0,0.0 +2013,2,14,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-8.3,39,101144,587,1402,268,364,755,86,43182,44309,10232,3808,360,5.1,5,5,4800.0,77777,0,999099999,4,0.0940,0,88,0.866,0.0,0.0 +2013,2,14,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-8.3,39,101144,717,1402,264,504,856,100,60544,54818,12051,4672,360,5.1,3,3,4800.0,77777,0,999099999,4,0.0940,0,88,0.866,0.0,0.0 +2013,2,14,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-7.8,38,101194,783,1402,268,594,902,107,71783,59240,12974,5122,320,3.1,3,3,4800.0,77777,0,999099999,5,0.0940,0,88,0.866,0.0,0.0 +2013,2,14,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-7.2,38,101184,781,1402,271,623,914,109,75151,60201,13193,5200,310,3.6,3,3,4800.0,77777,0,999099999,5,0.0940,0,88,0.866,0.0,0.0 +2013,2,14,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-7.2,38,101184,711,1402,271,589,901,105,70411,58221,12594,4856,310,3.6,3,3,4800.0,77777,0,999099999,5,0.0940,0,88,0.866,0.0,0.0 +2013,2,14,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-3.3,60,101214,578,1402,258,495,856,97,58021,51082,11407,4185,130,4.6,0,0,4800.0,77777,0,999099999,7,0.0940,0,88,0.866,0.0,0.0 +2013,2,14,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-3.3,60,101294,391,1402,258,353,763,81,40173,35294,9248,3088,120,4.1,0,0,4800.0,77777,0,999099999,7,0.0940,0,88,0.866,0.0,0.0 +2013,2,14,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-3.3,60,101294,162,1402,258,183,573,54,19777,4395,5857,1565,120,4.1,0,0,4800.0,77777,0,999099999,7,0.0940,0,88,0.866,0.0,0.0 +2013,2,14,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-3.3,65,101413,0,894,253,0,0,0,0,0,0,0,130,4.6,0,0,4800.0,77777,0,999099999,7,0.0940,0,88,0.866,0.0,0.0 +2013,2,14,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-4.4,61,101473,0,0,251,0,0,0,0,0,0,0,180,4.1,0,0,4800.0,77777,0,999099999,6,0.0940,0,88,0.866,0.0,0.0 +2013,2,14,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-4.4,61,101473,0,0,251,0,0,0,0,0,0,0,180,4.1,0,0,4800.0,77777,9,999999999,6,0.0940,0,88,0.866,0.0,0.0 +2013,2,14,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-4.4,61,101483,0,0,251,0,0,0,0,0,0,0,230,4.6,0,0,4800.0,77777,9,999999999,6,0.0940,0,88,0.866,0.0,0.0 +2013,2,14,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-4.4,61,101493,0,0,251,0,0,0,0,0,0,0,220,4.1,0,0,4800.0,77777,9,999999999,6,0.0940,0,88,0.866,0.0,0.0 +2013,2,14,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-4.4,61,101493,0,0,251,0,0,0,0,0,0,0,220,4.1,0,0,4800.0,77777,9,999999999,6,0.0940,0,88,0.866,0.0,0.0 +2013,2,14,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-5.0,63,101533,0,0,257,0,0,0,0,0,0,0,220,3.6,3,3,4800.0,77777,9,999999999,6,0.0940,0,88,0.866,0.0,0.0 +2013,2,15,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-5.0,66,101543,0,0,254,0,0,0,0,0,0,0,230,3.6,3,3,4800.0,77777,9,999999999,6,0.0950,0,88,0.866,0.0,0.0 +2013,2,15,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-5.0,66,101543,0,0,254,0,0,0,0,0,0,0,230,3.6,3,3,4800.0,77777,9,999999999,6,0.0950,0,88,0.866,0.0,0.0 +2013,2,15,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-4.4,76,101533,0,0,241,0,0,0,0,0,0,0,200,2.6,0,0,4800.0,77777,9,999999999,6,0.0950,0,88,0.866,0.0,0.0 +2013,2,15,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-3.3,76,101523,0,0,245,0,0,0,0,0,0,0,210,3.6,0,0,4800.0,77777,9,999999999,7,0.0950,0,88,0.866,0.0,0.0 +2013,2,15,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-3.3,76,101523,0,0,245,0,0,0,0,0,0,0,210,3.6,0,0,4800.0,77777,9,999999999,7,0.0950,0,88,0.866,0.0,0.0 +2013,2,15,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-0.6,-2.2,88,101543,0,0,274,0,0,0,0,0,0,0,190,4.1,9,9,9656.0,5486,9,999999999,8,0.0950,0,88,0.866,0.0,0.0 +2013,2,15,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,0.0,-1.7,87,101533,0,0,277,0,0,0,0,0,0,0,230,3.6,9,9,6437.0,5486,9,999999999,8,0.0950,0,88,0.866,0.0,0.0 +2013,2,15,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,0.0,-1.7,87,101533,182,1005,277,55,154,34,6236,0,3863,1212,230,3.6,9,9,6000.0,5486,9,999999999,8,0.0950,0,88,0.866,0.0,0.0 +2013,2,15,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.2,0.0,85,101553,409,1401,256,190,411,78,21777,18843,8968,3057,180,4.1,0,0,9656.0,77777,9,999999999,10,0.0950,0,88,0.866,0.0,0.0 +2013,2,15,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-1.1,67,101564,593,1401,275,355,651,111,41283,40606,12954,4718,210,6.2,3,3,9656.0,77777,9,999999999,9,0.0950,0,88,0.866,0.0,0.0 +2013,2,15,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-1.1,67,101564,723,1401,279,493,753,133,57926,51225,15688,5952,210,6.2,5,5,9656.0,77777,9,999999999,9,0.0950,0,88,0.866,0.0,0.0 +2013,2,15,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,-1.1,55,101434,790,1401,291,582,806,143,68777,56182,16967,6563,210,8.8,5,5,9656.0,77777,9,999999999,9,0.0950,0,88,0.866,0.0,0.0 +2013,2,15,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,-0.6,53,101345,788,1401,296,611,822,144,72133,57310,17069,6593,190,5.1,5,5,9656.0,77777,9,999999999,9,0.0950,0,88,0.866,0.0,0.0 +2013,2,15,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,-0.6,53,101345,718,1401,296,578,816,136,67718,55782,15997,6039,190,5.1,5,5,9656.0,77777,9,999999999,9,0.0950,0,88,0.866,0.0,0.0 +2013,2,15,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,0.6,60,101274,584,1401,295,486,765,125,55858,49363,14423,5138,190,5.7,5,5,9656.0,77777,9,999999999,10,0.0950,0,88,0.866,0.0,0.0 +2013,2,15,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,0.6,63,101244,397,1401,293,344,653,107,38300,34889,11960,3782,190,5.7,5,5,9656.0,77777,9,999999999,10,0.0950,0,88,0.866,0.0,0.0 +2013,2,15,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,0.6,63,101244,168,1401,288,177,453,70,18748,8239,7446,1774,190,5.7,3,3,9656.0,77777,9,999999999,10,0.0950,0,88,0.866,0.0,0.0 +2013,2,15,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,0.0,70,101264,0,924,279,0,0,0,0,0,0,0,190,4.6,3,3,9656.0,77777,9,999999999,10,0.0950,0,88,0.866,0.0,0.0 +2013,2,15,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,0.6,73,101314,0,0,279,0,0,0,0,0,0,0,210,5.1,3,3,9656.0,77777,9,999999999,11,0.0950,0,88,0.866,0.0,0.0 +2013,2,15,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,0.6,73,101314,0,0,268,0,0,0,0,0,0,0,210,5.1,0,0,9656.0,77777,9,999999999,11,0.0950,0,88,0.866,0.0,0.0 +2013,2,15,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,0.6,79,101354,0,0,263,0,0,0,0,0,0,0,210,3.6,0,0,9656.0,77777,9,999999999,11,0.0950,0,88,0.866,0.0,0.0 +2013,2,15,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,0.6,79,101404,0,0,263,0,0,0,0,0,0,0,210,3.1,0,0,9656.0,77777,9,999999999,11,0.0950,0,88,0.866,0.0,0.0 +2013,2,15,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,0.6,79,101404,0,0,296,0,0,0,0,0,0,0,210,3.1,9,9,9656.0,77777,9,999999999,11,0.0950,0,88,0.866,0.0,0.0 +2013,2,15,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,0.0,88,101353,0,0,286,0,0,0,0,0,0,0,170,3.1,9,9,9656.0,2438,9,999999999,10,0.0950,0,88,0.866,0.0,0.0 +2013,2,16,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.7,0.0,88,101363,0,0,286,0,0,0,0,0,0,0,308,0.0,9,9,9656.0,2743,9,999999999,10,0.0950,0,88,0.866,0.0,0.0 +2013,2,16,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,1.7,0.0,88,101363,0,0,270,0,0,0,0,0,0,0,324,0.0,5,5,9000.0,2743,9,999999999,10,0.0950,0,88,0.866,0.0,0.0 +2013,2,16,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.7,0.0,88,101273,0,0,294,0,0,0,0,0,0,0,341,0.0,10,10,9656.0,1829,9,999999999,10,0.0950,0,88,0.866,0.0,0.0 +2013,2,16,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,0.6,82,101264,0,0,301,0,0,0,0,0,0,0,340,2.1,10,10,9656.0,1829,9,999999999,11,0.0950,0,88,0.866,0.0,0.0 +2013,2,16,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,0.6,82,101264,0,0,301,0,0,0,0,0,0,0,340,2.1,10,10,9656.0,1829,9,999999999,11,0.0950,0,88,0.866,0.0,0.0 +2013,2,16,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-2.2,74,101313,0,0,292,0,0,0,0,0,0,0,320,7.2,10,10,9656.0,1158,9,999999999,8,0.0950,0,88,0.866,0.0,0.0 +2013,2,16,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-2.2,77,101313,0,0,289,0,0,0,0,0,0,0,330,5.7,10,10,9656.0,1158,9,999999999,8,0.0950,0,88,0.866,0.0,0.0 +2013,2,16,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.1,-2.2,77,101313,188,1037,289,19,0,19,1858,0,1871,752,330,5.7,10,10,9656.0,1158,9,999999999,8,0.0950,0,88,0.866,0.0,0.0 +2013,2,16,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.0,-2.0,79,101278,415,1401,289,51,0,51,5083,0,5122,2165,330,4.1,10,10,3219.0,1097,0,999099999,8,0.0950,0,88,0.866,0.0,0.0 +2013,2,16,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.0,-2.0,79,101278,600,1401,289,126,29,113,14655,1832,13190,4809,340,4.1,10,10,1609.0,640,0,999099999,8,0.0950,0,88,0.866,0.0,0.0 +2013,2,16,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,0.6,-1.1,87,101293,730,1401,288,191,28,176,21979,2103,20346,7426,360,3.1,10,10,1600.0,640,0,999099999,9,0.0950,0,88,0.866,0.0,0.0 +2013,2,16,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.0,-2.0,79,101278,796,1401,289,234,32,216,26806,2589,24870,9027,340,3.1,10,10,4023.0,1158,0,999099999,8,0.0950,0,88,0.866,0.0,0.0 +2013,2,16,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.0,-1.0,86,101278,794,1401,290,360,211,238,40896,17718,27181,9623,340,3.1,10,10,2414.0,1158,0,999099999,9,0.0950,0,88,0.866,0.0,0.0 +2013,2,16,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,1.7,-0.6,84,101154,724,1401,293,353,199,243,39529,17123,27360,9159,360,2.6,10,10,4800.0,1158,0,999099999,9,0.0950,0,88,0.866,0.0,0.0 +2013,2,16,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-2.8,65,101044,591,1401,296,327,263,199,36272,21177,22186,7061,360,4.1,10,10,4800.0,1067,0,999099999,8,0.0950,0,88,0.866,0.0,0.0 +2013,2,16,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-3.3,60,100994,403,1401,297,214,174,148,23254,11636,16158,4577,350,3.6,10,10,4800.0,1372,0,999099999,7,0.0950,0,88,0.866,0.0,0.0 +2013,2,16,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,-3.3,60,100994,174,1401,297,92,36,81,9662,969,8546,1879,350,3.6,10,10,4800.0,1372,0,999099999,7,0.0950,0,88,0.866,0.0,0.0 +2013,2,16,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-1.1,78,100934,0,955,295,0,0,0,0,0,0,0,60,1.5,10,10,4800.0,1829,0,999099999,9,0.0950,0,88,0.866,0.0,0.0 +2013,2,16,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.2,-2.8,68,100964,0,0,293,0,0,0,0,0,0,0,330,4.1,10,10,4828.0,853,0,999099999,8,0.0950,0,88,0.866,0.0,0.0 +2013,2,16,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,2.2,-2.8,68,100964,0,0,293,0,0,0,0,0,0,0,330,4.1,10,10,4800.0,853,0,999099999,8,0.0950,0,88,0.866,0.0,0.0 +2013,2,16,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-6.1,53,100844,0,0,287,0,0,0,0,0,0,0,360,5.1,10,10,4800.0,1676,0,999099999,5,0.0950,0,88,0.866,0.0,0.0 +2013,2,16,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-7.8,48,100794,0,0,283,0,0,0,0,0,0,0,340,5.7,10,10,4800.0,1676,0,999099999,5,0.0950,0,88,0.866,0.0,0.0 +2013,2,16,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.1,-7.8,48,100794,0,0,283,0,0,0,0,0,0,0,340,5.7,10,10,4800.0,1676,0,999099999,5,0.0950,0,88,0.866,0.0,0.0 +2013,2,16,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.0,-8.0,47,101278,0,0,282,0,0,0,0,0,0,0,350,5.1,10,10,4800.0,1676,0,999099999,4,0.0950,0,88,0.866,0.0,0.0 +2013,2,17,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-7.8,54,100473,0,0,276,0,0,0,0,0,0,0,360,6.2,10,10,4800.0,1829,0,999099999,5,0.0960,0,88,0.866,0.0,0.0 +2013,2,17,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-0.6,-7.8,54,100473,0,0,276,0,0,0,0,0,0,0,360,6.2,10,10,4800.0,1829,0,999099999,5,0.0960,0,88,0.866,0.0,0.0 +2013,2,17,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-10.0,49,100253,0,0,269,0,0,0,0,0,0,0,10,7.7,10,10,4800.0,1494,0,999099999,4,0.0960,0,88,0.866,0.0,0.0 +2013,2,17,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-12.2,42,100123,0,0,265,0,0,0,0,0,0,0,330,8.8,10,10,4800.0,1829,0,999099999,3,0.0960,0,88,0.866,0.0,0.0 +2013,2,17,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.2,-12.2,42,100123,0,0,265,0,0,0,0,0,0,0,330,8.7,10,10,4800.0,1829,0,999099999,3,0.0960,0,88,0.866,0.0,0.0 +2013,2,17,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-4.0,-10.0,59,101277,0,0,260,0,0,0,0,0,0,0,330,8.2,10,10,4023.0,1067,0,999099999,4,0.0960,0,88,0.866,0.0,0.0 +2013,2,17,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-6.0,-9.0,77,101277,0,0,242,0,0,0,0,0,0,0,320,9.8,8,8,1207.0,457,0,999099999,4,0.0960,0,88,0.866,0.0,0.0 +2013,2,17,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-6.1,-8.9,78,99803,194,1071,241,9,0,9,882,0,888,379,320,10.3,8,8,1200.0,457,0,999099999,4,0.0960,0,88,0.866,0.0,0.0 +2013,2,17,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-6.7,-9.4,79,99553,422,1400,239,37,0,37,3695,0,3724,1635,310,9.3,8,8,402.0,305,0,999099999,4,0.0960,0,88,0.866,0.0,0.0 +2013,2,17,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-7.0,-9.0,84,101277,607,1400,238,95,0,95,9632,0,9711,4195,310,9.8,8,8,402.0,274,0,999099999,4,0.0960,0,88,0.866,0.0,0.0 +2013,2,17,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-7.2,-9.4,82,99463,737,1400,237,153,3,151,17870,218,17710,6642,310,9.3,8,8,400.0,274,0,999099999,4,0.0960,0,88,0.866,0.0,0.0 +2013,2,17,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-6.7,-9.4,79,99423,803,1400,251,194,10,187,22536,780,21825,8170,300,12.4,10,10,805.0,457,0,999099999,4,0.0960,0,88,0.866,0.0,0.0 +2013,2,17,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-6.0,-9.0,77,101277,801,1400,247,247,36,226,28253,3014,25984,9346,300,9.8,9,9,805.0,427,0,999099999,4,0.0960,0,88,0.866,0.0,0.0 +2013,2,17,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-6.7,-9.4,79,99423,730,1400,251,343,188,240,38562,16408,27127,9151,290,9.8,10,10,800.0,427,0,999099999,4,0.0960,0,88,0.866,0.0,0.0 +2013,2,17,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-6.0,-11.0,64,101277,597,1400,252,319,229,208,35354,19188,23171,7292,320,9.8,10,10,2414.0,1006,0,999099999,3,0.0960,0,88,0.866,0.0,0.0 +2013,2,17,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-5.0,-14.0,45,101277,409,1400,253,225,200,150,24504,13875,16413,4659,300,16.0,10,10,2012.0,1250,0,999099999,2,0.0960,0,88,0.866,0.0,0.0 +2013,2,17,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-5.0,-15.6,39,99623,180,1400,251,116,137,85,12192,4348,8975,1948,300,10.8,10,10,2012.0,1250,0,999099999,2,0.0960,0,88,0.866,0.0,0.0 +2013,2,17,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-16.7,35,99843,0,985,250,0,0,0,0,0,0,0,300,12.4,10,10,2012.0,2134,0,999099999,2,0.0960,0,88,0.866,0.0,0.0 +2013,2,17,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-17.2,34,99883,0,0,249,0,0,0,0,0,0,0,300,11.8,10,10,2012.0,2591,0,999099999,2,0.0960,0,88,0.866,0.0,0.0 +2013,2,17,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-5.0,-17.2,34,99883,0,0,249,0,0,0,0,0,0,0,300,11.8,10,10,2012.0,2591,9,999999999,2,0.0960,0,88,0.866,0.0,0.0 +2013,2,17,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.6,-17.2,35,100103,0,0,247,0,0,0,0,0,0,0,290,10.3,10,10,2012.0,3048,9,999999999,2,0.0960,0,88,0.866,0.0,0.0 +2013,2,17,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-6.7,-17.8,37,100242,0,0,243,0,0,0,0,0,0,0,290,9.3,10,10,2012.0,3048,9,999999999,2,0.0960,0,88,0.866,0.0,0.0 +2013,2,17,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-6.7,-17.8,37,100242,0,0,243,0,0,0,0,0,0,0,290,9.3,10,10,2012.0,3048,9,999999999,2,0.0960,0,88,0.866,0.0,0.0 +2013,2,17,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-7.8,-17.8,40,100382,0,0,239,0,0,0,0,0,0,0,290,7.2,10,10,2012.0,3048,9,999999999,2,0.0960,0,88,0.866,0.5,0.0 +2013,2,18,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-8.3,-17.8,42,100442,0,0,237,0,0,0,0,0,0,0,290,10.3,10,10,2012.0,3353,9,999999999,2,0.0970,0,88,0.866,0.0,0.0 +2013,2,18,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-8.3,-17.8,42,100442,0,0,237,0,0,0,0,0,0,0,290,10.3,10,10,2012.0,3353,9,999999999,2,0.0970,0,88,0.866,0.0,0.0 +2013,2,18,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-8.3,-18.3,40,100602,0,0,236,0,0,0,0,0,0,0,290,10.8,10,10,2012.0,3048,9,999999999,2,0.0970,0,88,0.866,0.0,0.0 +2013,2,18,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-8.9,-18.3,42,100732,0,0,228,0,0,0,0,0,0,0,300,9.3,9,9,2012.0,4572,9,999999999,2,0.0970,0,88,0.866,0.0,0.0 +2013,2,18,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-8.9,-18.3,42,100732,0,0,228,0,0,0,0,0,0,0,300,9.3,9,9,2012.0,4572,9,999999999,2,0.0970,0,88,0.866,0.0,0.0 +2013,2,18,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-8.9,-17.8,44,100982,0,0,215,0,0,0,0,0,0,0,290,10.3,5,5,2012.0,77777,9,999999999,2,0.0970,0,88,0.866,0.0,0.0 +2013,2,18,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-8.9,-18.3,42,101112,0,0,212,0,0,0,0,0,0,0,290,8.8,3,3,2012.0,77777,9,999999999,2,0.0970,0,88,0.866,0.0,0.0 +2013,2,18,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-8.9,-18.3,42,101112,201,1104,212,77,398,26,9015,0,3049,1001,290,8.7,3,3,2012.0,77777,9,999999999,2,0.0970,0,88,0.866,0.0,0.0 +2013,2,18,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-7.2,-17.8,38,101292,428,1400,218,232,697,52,27660,30009,6212,2223,300,10.3,3,3,2012.0,77777,9,999999999,2,0.0970,0,88,0.866,0.0,0.0 +2013,2,18,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-17.2,34,101332,613,1400,225,410,876,74,49508,51036,8958,3400,290,11.8,3,3,2012.0,77777,9,999999999,2,0.0970,0,88,0.866,0.0,0.0 +2013,2,18,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-17.2,34,101332,743,1400,216,556,954,87,58098,93694,12635,1672,290,11.8,0,0,2012.0,77777,9,999999999,2,0.0970,0,88,0.866,0.0,0.0 +2013,2,18,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-17.2,25,101403,809,1400,227,648,992,93,67611,98112,13320,1842,280,9.8,0,0,2012.0,77777,9,999999999,2,0.0970,0,88,0.866,0.0,0.0 +2013,2,18,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-18.3,21,101433,807,1400,230,676,1000,95,70461,98828,13594,1837,300,9.8,0,0,2012.0,77777,9,999999999,2,0.0970,0,88,0.866,0.0,0.0 +2013,2,18,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-18.3,21,101433,737,1400,230,640,980,94,77604,63211,11432,4476,300,9.8,0,0,2012.0,77777,9,999999999,2,0.0970,0,88,0.866,0.0,0.0 +2013,2,18,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-18.9,20,101543,603,1400,229,542,941,86,64582,56878,10277,3849,300,9.8,0,0,2012.0,77777,9,999999999,2,0.0970,0,88,0.866,0.0,0.0 +2013,2,18,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-18.9,20,101633,415,1400,229,394,865,71,45701,41020,8258,2856,290,6.2,0,0,2012.0,77777,9,999999999,2,0.0970,0,88,0.866,0.0,0.0 +2013,2,18,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-18.9,20,101633,185,1400,239,214,700,49,23645,7175,5431,1581,290,6.2,3,3,2012.0,77777,9,999999999,2,0.0970,0,88,0.866,0.0,0.0 +2013,2,18,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-18.3,22,101773,0,1015,238,0,0,0,0,0,0,0,270,6.7,3,3,2012.0,77777,9,999999999,2,0.0970,0,88,0.866,0.0,0.0 +2013,2,18,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-18.3,23,101843,0,0,226,0,0,0,0,0,0,0,270,6.7,0,0,2012.0,77777,9,999999999,2,0.0970,0,88,0.866,0.0,0.0 +2013,2,18,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-18.3,23,101843,0,0,226,0,0,0,0,0,0,0,270,6.7,0,0,2012.0,77777,9,999999999,2,0.0970,0,88,0.866,0.0,0.0 +2013,2,18,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-17.8,26,101962,0,0,223,0,0,0,0,0,0,0,260,6.7,0,0,2012.0,77777,9,999999999,2,0.0970,0,88,0.866,0.0,0.0 +2013,2,18,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-16.7,30,101982,0,0,222,0,0,0,0,0,0,0,260,6.2,0,0,2012.0,77777,9,999999999,2,0.0970,0,88,0.866,0.0,0.0 +2013,2,18,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-16.7,30,101982,0,0,222,0,0,0,0,0,0,0,260,6.2,0,0,2012.0,77777,9,999999999,2,0.0970,0,88,0.866,0.0,0.0 +2013,2,18,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-16.7,30,102062,0,0,222,0,0,0,0,0,0,0,270,6.2,0,0,2012.0,77777,9,999999999,2,0.0970,0,88,0.866,0.0,0.0 +2013,2,19,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-16.7,30,102072,0,0,222,0,0,0,0,0,0,0,270,6.7,0,0,2012.0,77777,9,999999999,2,0.0980,0,88,0.866,0.0,0.0 +2013,2,19,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-16.7,30,102072,0,0,222,0,0,0,0,0,0,0,270,6.7,0,0,2012.0,77777,9,999999999,2,0.0980,0,88,0.866,0.0,0.0 +2013,2,19,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-15.6,31,102072,0,0,227,0,0,0,0,0,0,0,270,4.6,0,0,2012.0,77777,9,999999999,2,0.0980,0,88,0.866,0.0,0.0 +2013,2,19,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-15.0,34,102032,0,0,235,0,0,0,0,0,0,0,280,4.1,3,3,2012.0,77777,9,999999999,2,0.0980,0,88,0.866,0.0,0.0 +2013,2,19,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-15.0,34,102032,0,0,253,0,0,0,0,0,0,0,280,4.1,9,9,2012.0,77777,9,999999999,2,0.0980,0,88,0.866,0.0,0.0 +2013,2,19,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-12.8,42,102002,0,0,262,0,0,0,0,0,0,0,230,3.6,10,10,2012.0,1463,9,999999999,3,0.0980,0,88,0.866,0.0,0.0 +2013,2,19,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-12.2,40,101953,0,0,260,0,0,0,0,0,0,0,230,3.6,9,9,2012.0,1524,9,999999999,3,0.0980,0,88,0.866,0.0,0.0 +2013,2,19,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-1.7,-12.2,40,101953,207,1138,245,69,259,34,7927,1273,3914,1260,230,3.6,5,5,2012.0,1524,9,999999999,3,0.0980,0,88,0.866,0.0,0.0 +2013,2,19,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-9.4,43,101893,435,1399,253,212,529,69,24747,25013,8076,2839,220,4.1,3,3,2012.0,77777,9,999999999,4,0.0980,0,88,0.866,0.0,0.0 +2013,2,19,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-6.7,48,101843,620,1399,261,381,722,98,45032,44559,11620,4343,210,4.1,3,3,2012.0,77777,9,999999999,5,0.0980,0,88,0.866,0.0,0.0 +2013,2,19,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-6.7,48,101843,750,1399,281,444,621,140,52272,43786,16548,6310,210,4.1,9,9,2012.0,77777,9,999999999,5,0.0980,0,88,0.866,0.0,0.0 +2013,2,19,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-2.8,53,101634,816,1399,308,500,593,164,58754,43387,19355,7444,180,4.1,10,10,2012.0,6096,9,999999999,7,0.0980,0,88,0.866,0.0,0.0 +2013,2,19,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-1.1,59,101484,814,1399,312,496,495,207,57182,39130,23983,8874,180,2.1,10,10,2012.0,6096,9,999999999,9,0.0980,0,88,0.866,0.0,0.0 +2013,2,19,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-1.7,54,101364,743,1399,314,416,323,232,46946,27185,26320,9075,200,5.1,10,10,2012.0,6096,9,999999999,8,0.0980,0,88,0.866,0.0,0.0 +2013,2,19,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-1.7,54,101244,609,1399,314,338,264,206,37529,21509,22990,7368,190,5.1,10,10,2012.0,6096,9,999999999,8,0.0980,0,88,0.866,0.0,0.0 +2013,2,19,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,0.0,62,101114,421,1399,316,197,104,150,21474,6971,16428,4765,180,6.2,10,10,2012.0,6096,9,999999999,10,0.0980,0,88,0.866,0.0,0.0 +2013,2,19,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.7,0.0,62,101114,191,1399,316,80,16,74,8536,369,7929,1988,180,6.2,10,10,2012.0,6096,0,919999999,10,0.0980,0,88,0.866,0.0,0.0 +2013,2,19,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,1.7,83,100884,0,1045,307,0,0,0,0,0,0,0,140,5.1,10,10,2012.0,1311,0,919999999,12,0.0980,0,88,0.866,0.0,0.0 +2013,2,19,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.0,1.0,87,101279,0,0,301,0,0,0,0,0,0,0,120,3.6,10,10,2012.0,579,0,919999999,11,0.0980,0,88,0.866,0.0,0.0 +2013,2,19,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,3.9,2.2,89,100744,0,0,306,0,0,0,0,0,0,0,150,3.1,10,10,8000.0,579,0,919999999,12,0.0980,0,88,0.866,6.0,0.0 +2013,2,19,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,3.3,93,100354,0,0,309,0,0,0,0,0,0,0,140,6.2,10,10,8000.0,1494,0,919999999,14,0.0980,0,88,0.866,5.4,0.0 +2013,2,19,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,5.0,4.0,93,101279,0,0,313,0,0,0,0,0,0,0,190,3.6,10,10,6437.0,732,0,919999999,15,0.0980,0,88,0.866,0.0,0.0 +2013,2,19,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,5.6,5.0,96,100265,0,0,316,0,0,0,0,0,0,0,200,3.1,10,10,6000.0,732,0,919999999,16,0.0980,0,88,0.866,0.0,0.0 +2013,2,19,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,5.0,5.0,100,101279,0,0,314,0,0,0,0,0,0,0,210,3.1,10,10,2816.0,2743,0,919999999,16,0.0980,0,88,0.866,0.0,0.0 +2013,2,20,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,3.3,82,100045,0,0,317,0,0,0,0,0,0,0,260,4.6,10,10,2816.0,457,0,919999999,14,0.0990,0,88,0.866,0.0,0.0 +2013,2,20,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.1,3.3,82,100045,0,0,317,0,0,0,0,0,0,0,260,4.6,10,10,2816.0,457,0,919999999,14,0.0990,0,88,0.866,0.0,0.0 +2013,2,20,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,1.7,83,99994,0,0,299,0,0,0,0,0,0,0,270,6.7,9,9,2816.0,1524,0,919999999,12,0.0990,0,88,0.866,0.0,0.0 +2013,2,20,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,1.1,82,99994,0,0,305,0,0,0,0,0,0,0,260,5.1,10,10,2816.0,1676,0,919999999,11,0.0990,0,88,0.866,0.0,0.0 +2013,2,20,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.9,1.1,82,99994,0,0,296,0,0,0,0,0,0,0,260,5.1,9,9,2816.0,1676,0,919999999,11,0.0990,0,88,0.866,0.0,0.0 +2013,2,20,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-3.3,67,100144,0,0,263,0,0,0,0,0,0,0,280,8.2,3,3,2816.0,77777,0,919999999,7,0.0990,0,88,0.866,0.0,0.0 +2013,2,20,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-5.6,58,100234,0,0,278,0,0,0,0,0,0,0,270,7.7,9,9,2816.0,2286,0,919999999,6,0.0990,0,88,0.866,0.0,0.0 +2013,2,20,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.1,-5.6,58,100234,214,1173,262,77,316,33,8883,1471,3814,1241,270,7.7,5,5,2816.0,2286,0,919999999,6,0.0990,0,88,0.866,0.0,0.0 +2013,2,20,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-7.8,49,100344,441,1398,254,226,579,70,26390,27665,8196,2889,280,7.7,3,3,2816.0,77777,0,919999999,5,0.0990,0,88,0.866,0.0,0.0 +2013,2,20,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-8.3,47,100374,627,1398,258,397,740,105,46747,46980,12406,4620,270,10.3,5,5,2816.0,77777,0,919999999,4,0.0990,0,88,0.866,0.0,0.0 +2013,2,20,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-8.3,47,100374,757,1398,273,417,486,188,48039,38085,21760,7953,270,10.3,9,9,2816.0,77777,0,919999999,4,0.0990,0,88,0.866,0.0,0.0 +2013,2,20,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-10.0,41,100364,823,1398,271,463,434,224,53213,36109,25876,9447,280,10.8,9,9,2816.0,1463,0,919999999,4,0.0990,0,88,0.866,0.0,0.0 +2013,2,20,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-10.0,41,100304,820,1398,271,331,102,271,37449,9188,30833,10686,280,9.3,9,9,2816.0,1524,0,919999999,4,0.0990,0,88,0.866,0.0,0.0 +2013,2,20,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.6,-10.0,41,100304,750,1398,271,435,378,224,49365,31911,25551,8926,280,9.3,9,9,2816.0,1524,0,919999999,4,0.0990,0,88,0.866,0.0,0.0 +2013,2,20,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-11.7,35,100344,615,1398,269,388,426,172,43855,32682,19530,6641,290,9.3,9,9,2816.0,1676,0,919999999,3,0.0990,0,88,0.866,0.0,0.0 +2013,2,20,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-12.2,33,100364,427,1398,250,342,609,111,38370,35790,12502,4033,270,8.2,3,3,2816.0,77777,0,919999999,3,0.0990,0,88,0.866,0.0,0.0 +2013,2,20,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-12.2,33,100364,197,1398,254,192,507,72,20640,12614,7771,2008,270,8.2,5,5,2816.0,77777,0,919999999,3,0.0990,0,88,0.866,0.0,0.0 +2013,2,20,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-12.8,36,100493,0,1075,243,0,0,0,0,0,0,0,280,9.8,3,3,2816.0,77777,0,919999999,3,0.0990,0,88,0.866,0.0,0.0 +2013,2,20,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-12.8,38,100553,0,0,241,0,0,0,0,0,0,0,290,8.8,3,3,2816.0,77777,0,919999999,3,0.0990,0,88,0.866,0.0,0.0 +2013,2,20,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-12.8,38,100553,0,0,259,0,0,0,0,0,0,0,290,8.7,9,9,2816.0,77777,9,999999999,3,0.0990,0,88,0.866,0.0,0.0 +2013,2,20,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-11.7,42,100643,0,0,268,0,0,0,0,0,0,0,280,7.7,10,10,2816.0,1981,9,999999999,3,0.0990,0,88,0.866,0.0,0.0 +2013,2,20,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-11.7,44,100683,0,0,240,0,0,0,0,0,0,0,260,4.6,3,3,2816.0,77777,9,999999999,3,0.0990,0,88,0.866,0.0,0.0 +2013,2,20,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-11.7,44,100683,0,0,258,0,0,0,0,0,0,0,260,4.6,9,9,2816.0,77777,9,999999999,3,0.0990,0,88,0.866,0.0,0.0 +2013,2,20,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-10.6,48,100773,0,0,260,0,0,0,0,0,0,0,280,7.7,9,9,2816.0,4572,9,999999999,3,0.0990,0,88,0.866,0.0,0.0 +2013,2,21,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-10.6,51,100793,0,0,229,0,0,0,0,0,0,0,280,7.7,0,0,2816.0,77777,9,999999999,3,0.1000,0,88,0.866,0.0,0.0 +2013,2,21,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-10.6,51,100793,0,0,239,0,0,0,0,0,0,0,280,7.7,3,3,2816.0,77777,9,999999999,3,0.1000,0,88,0.866,0.0,0.0 +2013,2,21,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-11.1,46,100803,0,0,245,0,0,0,0,0,0,0,270,7.2,5,5,2816.0,77777,9,999999999,3,0.1000,0,88,0.866,0.0,0.0 +2013,2,21,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-11.1,49,100823,0,0,242,0,0,0,0,0,0,0,280,6.2,5,5,2816.0,77777,9,999999999,3,0.1000,0,88,0.866,0.0,0.0 +2013,2,21,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-11.1,49,100823,0,0,242,0,0,0,0,0,0,0,280,6.2,5,5,2816.0,77777,9,999999999,3,0.1000,0,88,0.866,0.0,0.0 +2013,2,21,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-11.7,48,100853,0,0,240,0,0,0,0,0,0,0,280,7.2,5,5,2816.0,77777,9,999999999,3,0.1000,0,88,0.866,0.0,0.0 +2013,2,21,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-12.2,46,100903,0,0,240,0,0,0,0,0,0,0,280,9.3,5,5,2816.0,77777,9,999999999,3,0.1000,0,88,0.866,0.0,0.0 +2013,2,21,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-12.2,46,100903,220,1208,240,48,100,38,5496,967,4361,1402,280,9.3,5,5,2816.0,77777,9,999999999,3,0.1000,0,88,0.866,0.0,0.0 +2013,2,21,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-12.8,44,100873,448,1398,239,161,288,84,18574,15172,9721,3365,290,9.8,5,5,2816.0,77777,9,999999999,3,0.1000,0,88,0.866,0.0,0.0 +2013,2,21,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-12.8,40,100883,633,1398,243,377,637,99,44680,40219,11771,4419,300,9.8,5,5,2816.0,77777,9,999999999,3,0.1000,0,88,0.866,0.0,0.0 +2013,2,21,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-12.8,40,100883,763,1398,243,549,870,108,66148,57802,13056,5119,300,9.8,5,5,2816.0,77777,9,999999999,3,0.1000,0,88,0.866,0.0,0.0 +2013,2,21,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-12.2,38,100893,829,1398,247,640,909,117,77470,61799,14212,5662,290,8.2,5,5,2816.0,77777,9,999999999,3,0.1000,0,88,0.866,0.0,0.0 +2013,2,21,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-12.2,37,100893,827,1398,249,668,918,120,80672,62805,14544,5781,320,7.2,5,5,2816.0,77777,9,999999999,3,0.1000,0,88,0.866,0.0,0.0 +2013,2,21,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-12.2,37,100893,756,1398,249,631,890,122,75225,60983,14597,5656,320,7.2,5,5,2816.0,77777,9,999999999,3,0.1000,0,88,0.866,0.0,0.0 +2013,2,21,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-11.1,39,100973,622,1398,253,534,836,116,62359,55108,13595,4993,310,8.8,5,5,2816.0,77777,9,999999999,3,0.1000,0,88,0.866,0.0,0.0 +2013,2,21,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-11.1,39,101073,433,1398,268,331,510,115,37083,30605,12935,4161,330,7.7,9,9,2816.0,3048,9,999999999,3,0.1000,0,88,0.866,0.0,0.0 +2013,2,21,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.0,-11.1,39,101073,202,1398,268,173,316,74,18602,8369,7989,2071,330,7.7,9,9,2816.0,3048,9,999999999,3,0.1000,0,88,0.866,0.0,0.0 +2013,2,21,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-11.1,42,101373,0,1105,263,0,0,0,0,0,0,0,320,6.7,9,9,2816.0,3048,9,999999999,3,0.1000,0,88,0.866,0.0,0.0 +2013,2,21,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-11.7,44,101563,0,0,258,0,0,0,0,0,0,0,330,9.8,9,9,2816.0,1524,9,999999999,3,0.1000,0,88,0.866,0.0,0.0 +2013,2,21,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.2,-11.7,44,101563,0,0,240,0,0,0,0,0,0,0,330,9.8,3,3,2816.0,1524,9,999999999,3,0.1000,0,88,0.866,0.0,0.0 +2013,2,21,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-10.6,51,101802,0,0,239,0,0,0,0,0,0,0,330,8.8,3,3,2816.0,77777,9,999999999,3,0.1000,0,88,0.866,0.0,0.0 +2013,2,21,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-10.6,51,101882,0,0,239,0,0,0,0,0,0,0,320,7.7,3,3,2816.0,77777,9,999999999,3,0.1000,0,88,0.866,0.0,0.0 +2013,2,21,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-10.6,51,101882,0,0,229,0,0,0,0,0,0,0,320,7.7,0,0,2816.0,77777,9,999999999,3,0.1000,0,88,0.866,0.0,0.0 +2013,2,21,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-10.0,54,102112,0,0,230,0,0,0,0,0,0,0,320,5.7,0,0,2816.0,77777,9,999999999,4,0.1000,0,88,0.866,0.0,0.0 +2013,2,22,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-9.4,57,102302,0,0,230,0,0,0,0,0,0,0,310,6.7,0,0,2816.0,77777,9,999999999,4,0.1010,0,88,0.866,0.0,0.0 +2013,2,22,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-9.4,57,102302,0,0,240,0,0,0,0,0,0,0,310,6.7,3,3,2816.0,77777,9,999999999,4,0.1010,0,88,0.866,0.0,0.0 +2013,2,22,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-8.9,59,102382,0,0,266,0,0,0,0,0,0,0,320,5.7,10,10,2816.0,1128,9,999999999,4,0.1010,0,88,0.866,0.0,0.0 +2013,2,22,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-8.3,62,102442,0,0,267,0,0,0,0,0,0,0,320,5.1,10,10,2816.0,1067,9,999999999,4,0.1010,0,88,0.866,0.0,0.0 +2013,2,22,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.8,-8.3,62,102442,0,0,241,0,0,0,0,0,0,0,320,5.1,3,3,2816.0,1067,9,999999999,4,0.1010,0,88,0.866,0.0,0.0 +2013,2,22,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-8.3,65,102622,0,0,239,0,0,0,0,0,0,0,310,4.1,3,3,2816.0,77777,9,999999999,4,0.1010,0,88,0.866,0.0,0.0 +2013,2,22,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-8.3,62,102762,0,0,245,0,0,0,0,0,0,0,310,5.7,5,5,2816.0,77777,9,999999999,4,0.1010,0,88,0.866,0.0,0.0 +2013,2,22,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-8.3,62,102762,227,1243,245,62,202,36,7146,1891,4158,1355,310,5.7,5,5,2816.0,77777,9,999999999,4,0.1010,0,88,0.866,0.0,0.0 +2013,2,22,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-7.2,60,102802,455,1397,252,197,475,76,22930,23836,8872,3126,360,6.2,5,5,2816.0,77777,9,999999999,5,0.1010,0,88,0.866,0.0,0.0 +2013,2,22,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-6.7,52,102793,640,1397,261,418,828,83,50242,49177,10004,3818,20,5.7,5,5,2816.0,77777,9,999999999,5,0.1010,0,88,0.866,0.0,0.0 +2013,2,22,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-6.7,52,102793,770,1397,261,561,908,96,68226,57851,11711,4636,20,5.7,5,5,2816.0,77777,9,999999999,5,0.1010,0,88,0.866,0.0,0.0 +2013,2,22,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-6.1,51,102753,836,1397,282,579,809,113,70292,53772,13766,5512,40,5.1,9,9,2816.0,7620,9,999999999,5,0.1010,0,88,0.866,0.0,0.0 +2013,2,22,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-5.0,56,102743,834,1397,283,581,759,123,70041,51364,14882,5924,60,5.7,9,9,2816.0,7620,9,999999999,6,0.1010,0,88,0.866,0.0,0.0 +2013,2,22,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.2,-5.0,56,102743,762,1397,283,582,824,106,70141,53454,12817,5036,60,5.7,9,9,2816.0,7620,9,999999999,6,0.1010,0,88,0.866,0.0,0.0 +2013,2,22,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-5.0,56,102743,628,1397,283,529,849,102,62420,52929,12075,4516,80,4.1,9,9,2816.0,4877,9,999999999,6,0.1010,0,88,0.866,0.0,0.0 +2013,2,22,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-5.0,58,102773,439,1397,281,339,647,83,39016,32744,9583,3306,100,3.1,9,9,2816.0,4877,9,999999999,6,0.1010,0,88,0.866,0.0,0.0 +2013,2,22,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.7,-5.0,58,102773,208,1397,281,179,406,69,19394,9461,7504,2042,100,3.1,9,9,2816.0,4877,9,999999999,6,0.1010,0,88,0.866,0.0,0.0 +2013,2,22,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-5.0,61,102703,0,1135,278,0,0,0,0,0,0,0,100,4.6,9,9,2816.0,4877,9,999999999,6,0.1010,0,88,0.866,0.0,0.0 +2013,2,22,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-4.4,64,102743,0,0,287,0,0,0,0,0,0,0,110,3.1,10,10,2816.0,4877,9,999999999,6,0.1010,0,88,0.866,0.0,0.0 +2013,2,22,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.1,-4.4,64,102743,0,0,287,0,0,0,0,0,0,0,110,3.1,10,10,2816.0,4877,9,999999999,6,0.1010,0,88,0.866,0.0,0.0 +2013,2,22,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-4.4,64,102743,0,0,287,0,0,0,0,0,0,0,170,1.5,10,10,2816.0,4267,9,999999999,6,0.1010,0,88,0.866,0.0,0.0 +2013,2,22,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-4.4,66,102753,0,0,285,0,0,0,0,0,0,0,200,1.5,10,10,2816.0,4267,9,999999999,7,0.1010,0,88,0.866,0.0,0.0 +2013,2,22,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.6,-4.4,66,102753,0,0,277,0,0,0,0,0,0,0,200,1.5,9,9,2816.0,4267,9,999999999,7,0.1010,0,88,0.866,0.0,0.0 +2013,2,22,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-4.4,66,102703,0,0,285,0,0,0,0,0,0,0,200,1.5,10,10,2816.0,3353,9,999999999,6,0.1010,0,88,0.866,0.0,0.0 +2013,2,23,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-5.0,66,102663,0,0,258,0,0,0,0,0,0,0,172,0.0,5,5,2816.0,77777,9,999999999,6,0.1020,0,88,0.866,0.0,0.0 +2013,2,23,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-5.0,66,102663,0,0,282,0,0,0,0,0,0,0,167,0.0,10,10,2816.0,77777,9,999999999,6,0.1020,0,88,0.866,0.0,0.0 +2013,2,23,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-3.3,73,102573,0,0,286,0,0,0,0,0,0,0,171,0.0,10,10,2816.0,975,9,999999999,7,0.1020,0,88,0.866,0.0,0.0 +2013,2,23,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-2.8,76,102523,0,0,286,0,0,0,0,0,0,0,179,0.0,10,10,2816.0,975,9,999999999,8,0.1020,0,88,0.866,0.0,0.0 +2013,2,23,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.6,-2.8,76,102523,0,0,286,0,0,0,0,0,0,0,184,0.0,10,10,2816.0,975,9,999999999,8,0.1020,0,88,0.866,0.0,0.0 +2013,2,23,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-2.8,76,102453,0,0,286,0,0,0,0,0,0,0,182,0.0,10,10,2816.0,1829,9,999999999,8,0.1020,0,88,0.866,0.0,0.0 +2013,2,23,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-2.8,73,102403,0,0,288,0,0,0,0,0,0,0,140,2.1,10,10,2816.0,1829,9,999999999,8,0.1020,0,88,0.866,0.0,0.0 +2013,2,23,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.1,-2.8,73,102403,234,1278,288,33,0,33,3241,0,3264,1271,140,2.1,10,10,2816.0,1829,9,999999999,8,0.1020,0,88,0.866,0.0,0.0 +2013,2,23,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-1.7,77,102383,462,1396,292,95,19,90,10917,1007,10377,3597,140,3.6,10,10,2816.0,1189,9,999999999,8,0.1020,0,88,0.866,0.0,0.0 +2013,2,23,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-1.7,74,102333,647,1396,294,196,71,166,22323,5235,18991,6676,150,3.1,10,10,2816.0,1067,9,999999999,8,0.1020,0,88,0.866,0.0,0.0 +2013,2,23,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.2,-1.7,74,102333,777,1396,294,241,50,215,27536,4046,24690,8885,150,3.1,10,10,2816.0,1067,9,999999999,8,0.1020,0,88,0.866,0.0,0.0 +2013,2,23,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-1.7,71,102143,843,1396,297,327,107,263,37179,9277,30069,10689,130,3.6,10,10,2816.0,1067,9,999999999,8,0.1020,0,88,0.866,0.0,0.0 +2013,2,23,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-1.1,75,102053,840,1396,297,329,93,272,37282,8173,30997,10895,130,3.1,10,10,2816.0,1036,9,999999999,9,0.1020,0,88,0.866,0.0,0.0 +2013,2,23,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,-1.1,75,102053,769,1396,297,282,78,237,31919,6575,26968,9417,130,3.1,10,10,2816.0,1036,9,999999999,9,0.1020,0,88,0.866,0.0,0.0 +2013,2,23,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.0,-2.0,68,101279,634,1396,297,254,80,210,28310,6564,23526,7673,130,3.6,10,10,2816.0,762,9,999999999,8,0.1020,0,88,0.866,0.0,0.0 +2013,2,23,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.0,-1.0,74,101279,445,1396,298,168,35,154,18397,2412,16943,5032,120,4.6,10,10,2816.0,792,9,999999999,9,0.1020,0,88,0.866,0.0,0.0 +2013,2,23,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,-0.6,78,101903,214,1396,298,96,17,90,10184,581,9590,2310,120,4.6,10,10,2816.0,792,9,999999999,9,0.1020,0,88,0.866,0.0,0.0 +2013,2,23,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.0,-1.0,80,101279,0,1164,294,0,0,0,0,0,0,0,120,4.6,10,10,2816.0,1372,0,919099999,9,0.1020,0,88,0.866,0.0,0.0 +2013,2,23,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.0,-1.0,80,101279,0,0,294,0,0,0,0,0,0,0,130,5.7,10,10,4828.0,823,0,919099999,9,0.1020,0,88,0.866,0.0,0.0 +2013,2,23,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,1.1,-0.6,88,101743,0,0,291,0,0,0,0,0,0,0,100,3.6,10,10,4800.0,823,0,919099999,9,0.1020,0,88,0.866,5.0,0.0 +2013,2,23,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,0.0,88,101603,0,0,294,0,0,0,0,0,0,0,90,3.6,10,10,4800.0,335,0,919099999,10,0.1020,0,88,0.866,5.0,0.0 +2013,2,23,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.0,0.0,87,101279,0,0,295,0,0,0,0,0,0,0,100,3.1,10,10,4800.0,274,0,919099999,10,0.1020,0,88,0.866,3.5,0.0 +2013,2,23,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.7,0.0,88,101473,0,0,294,0,0,0,0,0,0,0,90,3.6,10,10,4800.0,274,0,919099999,10,0.1020,0,88,0.866,0.0,0.0 +2013,2,23,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.2,1.1,92,101284,0,0,297,0,0,0,0,0,0,0,50,4.1,10,10,6437.0,244,0,919099999,11,0.1020,0,88,0.866,0.0,0.0 +2013,2,24,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,1.1,89,101184,0,0,300,0,0,0,0,0,0,0,50,4.1,10,10,6437.0,213,0,919099999,11,0.1030,0,88,0.866,0.0,0.0 +2013,2,24,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,1.1,89,101184,0,0,300,0,0,0,0,0,0,0,50,4.1,10,10,6437.0,213,0,919099999,11,0.1030,0,88,0.866,0.0,0.0 +2013,2,24,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.0,2.0,93,101279,0,0,302,0,0,0,0,0,0,0,50,4.6,10,10,4023.0,152,0,919099999,12,0.1030,0,88,0.866,0.0,0.0 +2013,2,24,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.3,2.2,92,100854,0,0,303,0,0,0,0,0,0,0,50,6.7,10,10,4828.0,152,0,919099999,12,0.1030,0,88,0.866,0.0,0.0 +2013,2,24,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,3.3,2.2,92,100854,0,0,303,0,0,0,0,0,0,0,50,6.7,10,10,4800.0,152,0,919099999,12,0.1030,0,88,0.866,0.0,0.0 +2013,2,24,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.3,2.2,92,100794,0,0,303,0,0,0,0,0,0,0,40,7.2,10,10,4828.0,152,0,919099999,12,0.1030,0,88,0.866,0.0,0.0 +2013,2,24,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.0,2.0,93,101279,0,0,302,0,0,0,0,0,0,0,50,7.2,10,10,4828.0,488,0,919099999,12,0.1030,0,88,0.866,0.0,0.0 +2013,2,24,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,3.3,2.2,92,100764,240,1314,303,4,0,4,392,0,395,177,40,7.7,10,10,6000.0,488,0,919099999,12,0.1030,0,88,0.866,0.0,0.0 +2013,2,24,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.8,2.2,96,100684,469,1396,301,36,0,36,3599,0,3628,1640,20,6.7,10,10,8047.0,274,0,919099999,12,0.1030,0,88,0.866,0.0,0.0 +2013,2,24,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.8,2.2,96,100614,654,1396,301,126,9,122,14711,581,14297,5319,10,6.2,10,10,6437.0,274,0,919099999,12,0.1030,0,88,0.866,0.0,0.0 +2013,2,24,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,2.8,2.2,96,100614,784,1396,301,208,36,188,24026,2719,21819,8113,10,6.2,10,10,6000.0,274,0,919099999,12,0.1030,0,88,0.866,0.0,0.0 +2013,2,24,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.0,1.0,100,101278,850,1396,292,266,51,238,30501,4195,27436,10052,10,8.2,10,10,6437.0,274,0,919099999,11,0.1030,0,88,0.866,0.0,0.0 +2013,2,24,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.0,-1.0,86,101278,847,1396,290,169,8,164,19956,580,19450,7579,10,8.8,10,10,4023.0,305,0,919099999,9,0.1030,0,88,0.866,0.0,0.0 +2013,2,24,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,0.6,0.0,96,100544,775,1396,289,141,4,139,16663,275,16492,6372,360,7.2,10,10,4000.0,305,0,919099999,10,0.1030,0,88,0.866,0.0,0.0 +2013,2,24,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,0.0,-1.0,92,101278,640,1396,286,204,44,183,23018,3374,20747,7093,20,8.2,10,10,1207.0,244,0,919099999,9,0.1030,0,88,0.866,0.0,0.0 +2013,2,24,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,0.0,-1.0,92,101278,451,1396,286,91,0,91,9095,0,9166,3591,10,7.2,10,10,3219.0,335,0,919099999,9,0.1030,0,88,0.866,0.0,0.0 +2013,2,24,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,0.0,-0.6,95,100623,220,1396,286,22,0,22,2157,0,2172,883,10,6.7,10,10,3200.0,335,0,919099999,9,0.1030,0,88,0.866,0.0,0.0 +2013,2,24,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-1.0,-1.0,100,101278,0,1194,281,0,0,0,0,0,0,0,350,5.1,10,10,3219.0,274,0,919099999,9,0.1030,0,88,0.866,0.0,0.0 +2013,2,24,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-1.0,-1.0,100,101278,0,0,281,0,0,0,0,0,0,0,350,5.1,10,10,8047.0,396,0,919099999,9,0.1030,0,88,0.866,0.0,0.0 +2013,2,24,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-0.6,-1.1,96,100873,0,0,283,0,0,0,0,0,0,0,340,4.1,10,10,4000.0,396,0,999099999,9,0.1030,0,88,0.866,4.0,0.0 +2013,2,24,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-1.0,-2.0,92,101278,0,0,280,0,0,0,0,0,0,0,340,4.6,10,10,2012.0,274,0,999099999,8,0.1030,0,88,0.866,4.0,0.0 +2013,2,24,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-1.0,-2.0,92,101278,0,0,280,0,0,0,0,0,0,0,350,5.1,10,10,2414.0,457,0,999099999,8,0.1030,0,88,0.866,4.0,0.0 +2013,2,24,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-1.1,-1.7,95,101103,0,0,280,0,0,0,0,0,0,0,350,3.6,10,10,2400.0,457,0,999099999,8,0.1030,0,88,0.866,1.2,0.0 +2013,2,24,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-2.0,-2.0,100,101278,0,0,276,0,0,0,0,0,0,0,350,3.6,10,10,3219.0,975,0,999099999,8,0.1030,0,88,0.866,0.0,0.0 +2013,2,25,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-1.7,-1.7,100,101243,0,0,278,0,0,0,0,0,0,0,350,4.1,10,10,6437.0,1097,0,999099999,8,0.1030,0,88,0.866,0.0,0.0 +2013,2,25,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-1.7,-1.7,100,101243,0,0,278,0,0,0,0,0,0,0,350,4.1,10,10,6000.0,1097,0,999099999,8,0.1030,0,88,0.866,0.0,0.0 +2013,2,25,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-2.0,-2.0,100,101278,0,0,276,0,0,0,0,0,0,0,340,3.6,10,10,8047.0,335,0,999099999,8,0.1030,0,88,0.866,0.0,0.0 +2013,2,25,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.0,-3.0,92,101278,0,0,275,0,0,0,0,0,0,0,340,3.6,10,10,8047.0,823,0,999099999,7,0.1030,0,88,0.866,0.0,0.0 +2013,2,25,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-1.7,-2.8,91,101403,0,0,269,0,0,0,0,0,0,0,340,3.6,9,9,8047.0,823,0,999099999,8,0.1030,0,88,0.866,0.0,0.0 +2013,2,25,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-2.8,91,101573,0,0,277,0,0,0,0,0,0,0,340,3.6,10,10,8047.0,762,0,999099999,8,0.1030,0,88,0.866,0.0,0.0 +2013,2,25,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.0,-3.0,85,101278,0,0,272,0,0,0,0,0,0,0,340,3.6,9,9,8047.0,1158,0,999099999,7,0.1030,0,88,0.866,0.0,0.0 +2013,2,25,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-1.1,-2.8,87,101633,247,1351,256,91,317,39,10495,4281,4507,1483,340,4.1,5,5,8047.0,1158,0,999099999,8,0.1030,0,88,0.866,0.0,0.0 +2013,2,25,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-3.9,69,101793,475,1395,262,246,582,75,28791,29419,8802,3146,360,3.6,5,5,8047.0,77777,0,999099999,7,0.1030,0,88,0.866,0.0,0.0 +2013,2,25,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-3.9,67,101853,661,1395,279,361,576,129,42084,38944,15096,5588,10,3.1,9,9,8047.0,975,0,999099999,7,0.1030,0,88,0.866,0.0,0.0 +2013,2,25,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.1,-3.9,67,101853,791,1395,279,464,575,168,54223,42642,19719,7483,10,3.1,9,9,8047.0,975,0,999099999,7,0.1030,0,88,0.866,0.0,0.0 +2013,2,25,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-2.8,65,101883,856,1395,271,591,729,152,70340,51909,18166,7161,40,4.1,5,5,8047.0,77777,0,999099999,8,0.1030,0,88,0.866,0.0,0.0 +2013,2,25,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-2.8,63,101893,853,1395,273,599,720,153,71221,51381,18268,7189,70,2.6,5,5,8047.0,77777,0,999099999,8,0.1030,0,88,0.866,0.0,0.0 +2013,2,25,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-2.8,63,101893,782,1395,290,573,687,164,66969,50390,19251,7303,70,2.6,9,9,8047.0,77777,0,999099999,8,0.1030,0,88,0.866,0.0,0.0 +2013,2,25,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-2.8,68,102033,646,1395,285,502,697,146,57777,49018,16874,6081,140,2.6,9,9,8047.0,945,0,999099999,8,0.1030,0,88,0.866,0.0,0.0 +2013,2,25,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-2.2,61,102054,457,1395,278,381,669,117,42825,40064,13203,4336,352,2.1,5,5,8047.0,77777,0,999099999,8,0.1030,0,88,0.866,0.0,0.0 +2013,2,25,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-2.2,61,102054,225,1395,295,222,498,84,23822,16138,9051,2350,356,2.3,9,9,8047.0,77777,0,999099999,8,0.1030,0,88,0.866,0.0,0.0 +2013,2,25,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-2.8,65,102173,0,1223,287,0,0,0,0,0,0,0,120,2.6,9,9,8047.0,1067,0,999099999,8,0.1030,0,88,0.866,0.0,0.0 +2013,2,25,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.0,-2.0,73,101279,0,0,293,0,0,0,0,0,0,0,130,3.1,10,10,8047.0,792,0,999099999,8,0.1030,0,88,0.866,0.0,0.0 +2013,2,25,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.2,-1.1,78,102213,0,0,295,0,0,0,0,0,0,0,130,2.1,10,10,8047.0,792,9,999999999,9,0.1030,0,88,0.866,0.0,0.0 +2013,2,25,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-1.1,81,102313,0,0,293,0,0,0,0,0,0,0,180,2.1,10,10,8047.0,1097,9,999999999,9,0.1030,0,88,0.866,0.0,0.0 +2013,2,25,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-1.1,78,102293,0,0,295,0,0,0,0,0,0,0,200,3.1,10,10,8047.0,1067,9,999999999,9,0.1030,0,88,0.866,0.0,0.0 +2013,2,25,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.2,-1.1,78,102293,0,0,287,0,0,0,0,0,0,0,200,3.1,9,9,8047.0,1067,9,999999999,9,0.1030,0,88,0.866,0.0,0.0 +2013,2,25,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-1.7,80,102393,0,0,282,0,0,0,0,0,0,0,160,3.1,9,9,8047.0,1311,9,999999999,8,0.1030,0,88,0.866,0.0,0.0 +2013,2,26,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-1.7,83,102413,0,0,280,0,0,0,0,0,0,0,170,3.1,9,9,8047.0,1311,9,999999999,8,0.1040,0,88,0.866,0.0,0.0 +2013,2,26,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.6,-1.7,83,102413,0,0,287,0,0,0,0,0,0,0,170,3.1,10,10,8047.0,1311,9,999999999,8,0.1040,0,88,0.866,0.0,0.0 +2013,2,26,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-2.2,91,102392,0,0,253,0,0,0,0,0,0,0,180,2.6,3,3,8047.0,77777,9,999999999,8,0.1040,0,88,0.866,0.0,0.0 +2013,2,26,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-2.2,88,102523,0,0,282,0,0,0,0,0,0,0,297,0.0,10,10,8047.0,1829,9,999999999,8,0.1040,0,88,0.866,0.0,0.0 +2013,2,26,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-0.6,-2.2,88,102523,0,0,282,0,0,0,0,0,0,0,301,0.0,10,10,8047.0,1829,9,999999999,8,0.1040,0,88,0.866,0.0,0.0 +2013,2,26,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-2.2,91,102572,0,0,280,0,0,0,0,0,0,0,190,2.1,10,10,8047.0,1829,9,999999999,8,0.1040,0,88,0.866,0.0,0.0 +2013,2,26,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-1.7,91,102612,0,0,275,0,0,0,0,0,0,0,3,0.0,9,9,8047.0,1829,9,999999999,9,0.1040,0,88,0.866,0.0,0.0 +2013,2,26,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-0.6,-1.7,91,102612,254,1388,259,91,277,44,10420,4634,5050,1648,47,0.0,5,5,8047.0,1829,9,999999999,9,0.1040,0,88,0.866,0.0,0.0 +2013,2,26,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,0.0,88,102683,482,1394,270,246,520,89,28428,27762,10318,3634,92,0.0,5,5,8047.0,77777,9,999999999,10,0.1040,0,88,0.866,0.0,0.0 +2013,2,26,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,0.0,82,102713,668,1394,274,417,678,127,48695,44963,14887,5546,121,1.5,5,5,8047.0,77777,9,999999999,10,0.1040,0,88,0.866,0.0,0.0 +2013,2,26,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,0.0,82,102713,798,1394,290,558,767,149,65843,53897,17655,6831,129,2.5,9,9,8047.0,77777,9,999999999,10,0.1040,0,88,0.866,0.0,0.0 +2013,2,26,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,0.0,76,102653,863,1394,279,605,758,151,72077,53270,18065,7148,80,3.6,5,5,8047.0,77777,9,999999999,10,0.1040,0,88,0.866,0.0,0.0 +2013,2,26,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,0.0,76,102663,860,1394,279,613,675,193,71614,51375,22655,8683,100,3.1,5,5,8047.0,77777,9,999999999,10,0.1040,0,88,0.866,0.0,0.0 +2013,2,26,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,0.0,76,102663,788,1394,279,622,773,163,72765,55973,19152,7298,100,3.1,5,5,8047.0,77777,9,999999999,10,0.1040,0,88,0.866,0.0,0.0 +2013,2,26,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-0.6,72,102563,652,1394,278,488,668,135,56557,45281,15708,5757,80,4.6,5,5,8047.0,77777,9,999999999,9,0.1040,0,88,0.866,0.0,0.0 +2013,2,26,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-0.6,75,102563,462,1394,276,311,418,132,34652,26557,14770,4728,90,3.1,5,5,8047.0,77777,9,999999999,9,0.1040,0,88,0.866,0.0,0.0 +2013,2,26,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-0.6,75,102563,231,1394,292,188,366,85,20194,12076,9168,2404,90,3.1,9,9,8047.0,77777,9,999999999,9,0.1040,0,88,0.866,0.0,0.0 +2013,2,26,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-2.2,68,102513,0,1252,288,0,0,0,0,0,0,0,110,4.1,9,9,8047.0,7315,9,999999999,8,0.1040,0,88,0.866,0.0,0.0 +2013,2,26,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-1.7,71,102483,0,0,289,0,0,0,0,0,0,0,110,4.1,9,9,8047.0,4267,9,999999999,8,0.1040,0,88,0.866,0.0,0.0 +2013,2,26,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,-1.7,71,102483,0,0,289,0,0,0,0,0,0,0,110,4.1,9,9,8047.0,4267,9,999999999,8,0.1040,0,88,0.866,0.0,0.0 +2013,2,26,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-1.1,78,102403,0,0,295,0,0,0,0,0,0,0,100,4.1,10,10,8047.0,4267,9,999999999,9,0.1040,0,88,0.866,0.0,0.0 +2013,2,26,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-0.6,78,102323,0,0,298,0,0,0,0,0,0,0,90,4.1,10,10,8047.0,4267,9,999999999,9,0.1040,0,88,0.866,0.0,0.0 +2013,2,26,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,-0.6,78,102323,0,0,290,0,0,0,0,0,0,0,90,4.1,9,9,8047.0,4267,9,999999999,9,0.1040,0,88,0.866,0.0,0.0 +2013,2,26,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,0.0,79,102113,0,0,301,0,0,0,0,0,0,0,90,5.7,10,10,8047.0,762,9,999999999,10,0.1040,0,88,0.866,0.0,0.0 +2013,2,27,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,0.6,82,102053,0,0,301,0,0,0,0,0,0,0,80,6.7,10,10,8047.0,579,9,999999999,11,0.1050,0,88,0.866,6.0,0.0 +2013,2,27,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,0.6,82,102053,0,0,301,0,0,0,0,0,0,0,80,6.7,10,10,8047.0,579,9,999999999,11,0.1050,0,88,0.866,0.4,0.0 +2013,2,27,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,1.1,85,101833,0,0,302,0,0,0,0,0,0,0,80,7.7,10,10,8047.0,640,0,919999999,11,0.1050,0,88,0.866,0.0,0.0 +2013,2,27,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.3,1.7,89,101694,0,0,303,0,0,0,0,0,0,0,60,8.8,10,10,9656.0,457,0,919999999,12,0.1050,0,88,0.866,0.0,0.0 +2013,2,27,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,3.3,1.7,89,101694,0,0,303,0,0,0,0,0,0,0,60,8.7,10,10,9000.0,457,0,919999999,12,0.1050,0,88,0.866,0.0,0.0 +2013,2,27,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.9,3.3,96,101554,0,0,307,0,0,0,0,0,0,0,70,8.8,10,10,9656.0,335,0,919999999,14,0.1050,0,88,0.866,0.0,0.0 +2013,2,27,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.9,3.3,96,101434,6,30,307,0,0,0,0,0,0,0,70,9.8,10,10,8047.0,335,0,919999999,14,0.1050,0,88,0.866,0.0,0.0 +2013,2,27,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,3.9,3.3,96,101434,261,1394,307,28,0,28,2751,0,2771,1136,70,9.8,10,10,8000.0,335,0,919999999,14,0.1050,0,88,0.866,0.0,0.0 +2013,2,27,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.9,3.9,100,101274,489,1394,308,25,0,25,2503,0,2522,1178,90,11.3,10,10,4828.0,274,0,919999999,15,0.1050,0,88,0.866,0.0,0.0 +2013,2,27,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,4.0,4.0,100,101279,675,1394,308,58,0,58,5894,0,5944,2821,90,11.3,10,10,4828.0,335,0,919999999,15,0.1050,0,88,0.866,0.0,0.0 +2013,2,27,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,4.4,3.9,97,101184,805,1394,310,69,0,69,7086,0,7149,3495,90,11.3,10,10,3200.0,335,0,919999999,15,0.1050,0,88,0.866,0.0,0.0 +2013,2,27,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,4.4,3.9,97,100944,870,1394,310,115,0,115,11873,0,11980,5684,100,11.8,10,10,4828.0,274,0,919999999,15,0.1050,0,88,0.866,0.0,0.0 +2013,2,27,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,4.0,4.0,100,101279,866,1394,308,188,16,178,22101,1162,21022,8183,100,10.8,10,10,4023.0,213,0,919999999,15,0.1050,0,88,0.866,0.0,0.0 +2013,2,27,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,3.9,3.9,100,100844,794,1394,308,151,3,149,17788,207,17626,6820,90,11.3,10,10,4800.0,213,0,919999999,15,0.1050,0,88,0.866,0.0,0.0 +2013,2,27,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.3,3.3,100,100714,659,1394,304,165,24,154,18925,1680,17740,6391,80,10.8,10,10,2012.0,213,0,919999999,14,0.1050,0,88,0.866,0.0,0.0 +2013,2,27,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.0,3.0,100,101279,468,1394,303,27,0,27,2699,0,2720,1254,60,11.3,10,10,1207.0,213,0,919999999,13,0.1050,0,88,0.866,0.0,0.0 +2013,2,27,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,3.3,3.3,100,100594,237,1394,304,69,114,49,7769,1673,5532,1746,60,10.3,10,10,1600.0,213,0,919999999,14,0.1050,0,88,0.866,0.0,0.0 +2013,2,27,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.0,3.0,100,101279,0,1281,303,0,0,0,0,0,0,0,50,9.8,10,10,4828.0,213,0,919999999,13,0.1050,0,88,0.866,0.0,0.0 +2013,2,27,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.0,3.0,100,101279,0,0,303,0,0,0,0,0,0,0,50,8.8,10,10,4023.0,213,0,919999999,13,0.1050,0,88,0.866,0.0,0.0 +2013,2,27,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,3.3,3.3,100,100374,0,0,304,0,0,0,0,0,0,0,50,8.2,10,10,3200.0,213,0,919999999,14,0.1050,0,88,0.866,5.0,0.0 +2013,2,27,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,4.0,4.0,100,101279,0,0,308,0,0,0,0,0,0,0,40,7.2,10,10,2012.0,152,0,919999999,15,0.1050,0,88,0.866,5.0,0.0 +2013,2,27,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,4.0,4.0,100,101279,0,0,308,0,0,0,0,0,0,0,30,5.7,10,10,3219.0,152,0,919999999,15,0.1050,0,88,0.866,5.0,0.0 +2013,2,27,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,3.9,3.9,100,100034,0,0,308,0,0,0,0,0,0,0,20,6.2,10,10,3200.0,152,0,919999999,15,0.1050,0,88,0.866,5.0,0.0 +2013,2,27,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.3,3.3,100,100044,0,0,304,0,0,0,0,0,0,0,300,5.1,10,10,3219.0,152,0,919999999,14,0.1050,0,88,0.866,5.0,0.0 +2013,2,28,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.2,2.2,100,100054,0,0,298,0,0,0,0,0,0,0,290,4.6,10,10,3219.0,152,0,919999999,12,0.1060,0,88,0.866,3.4,0.0 +2013,2,28,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,2.2,2.2,100,100054,0,0,298,0,0,0,0,0,0,0,290,4.6,10,10,3200.0,152,0,919999999,12,0.1060,0,88,0.866,0.0,0.0 +2013,2,28,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.0,2.0,100,101279,0,0,297,0,0,0,0,0,0,0,300,3.6,10,10,4828.0,152,0,919999999,12,0.1060,0,88,0.866,0.0,0.0 +2013,2,28,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,1.1,100,100164,0,0,292,0,0,0,0,0,0,0,300,2.6,10,10,4828.0,152,0,919999999,11,0.1060,0,88,0.866,0.0,0.0 +2013,2,28,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.1,1.1,100,100164,0,0,292,0,0,0,0,0,0,0,300,2.6,10,10,4828.0,152,0,919999999,11,0.1060,0,88,0.866,0.0,0.0 +2013,2,28,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,0.6,100,100264,0,0,290,0,0,0,0,0,0,0,300,3.1,10,10,4828.0,213,0,919999999,11,0.1060,0,88,0.866,0.0,0.0 +2013,2,28,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,0.0,96,100274,13,67,289,0,0,0,0,0,0,0,300,3.1,10,10,4828.0,213,0,919999999,10,0.1060,0,88,0.866,0.0,0.0 +2013,2,28,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.6,0.0,96,100274,268,1393,289,65,98,50,7402,2072,5708,1854,300,3.1,10,10,4828.0,213,0,919999999,10,0.1060,0,88,0.866,0.0,0.0 +2013,2,28,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,0.0,96,100364,497,1393,289,147,127,114,16711,7626,13009,4447,270,2.1,10,10,4828.0,274,0,919999999,10,0.1060,0,88,0.866,0.0,0.0 +2013,2,28,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.0,1.0,93,101279,682,1393,296,218,88,176,24868,6572,20170,7174,270,2.6,10,10,4828.0,335,0,919999999,11,0.1060,0,88,0.866,0.0,0.0 +2013,2,28,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.7,0.6,92,100314,811,1393,294,382,297,211,43960,23501,24404,9003,320,2.1,10,10,4828.0,335,0,919999999,11,0.1060,0,88,0.866,0.0,0.0 +2013,2,28,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.0,1.0,87,101279,877,1393,301,408,225,273,46491,19451,31285,11246,130,2.1,10,10,4828.0,396,0,919999999,11,0.1060,0,88,0.866,0.0,0.0 +2013,2,28,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,2.2,86,100124,873,1393,308,485,330,276,55163,28562,31571,11295,110,1.5,10,10,4828.0,4267,0,919999999,12,0.1060,0,88,0.866,0.0,0.0 +2013,2,28,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,4.4,2.2,86,100124,801,1393,299,550,574,203,63342,44529,23494,8690,110,1.5,9,9,4828.0,4267,0,919999999,12,0.1060,0,88,0.866,0.0,0.0 +2013,2,28,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,2.2,86,100004,665,1393,299,491,632,151,56494,44162,17448,6330,120,2.6,9,9,4828.0,4877,0,919999999,12,0.1060,0,88,0.866,0.0,0.0 +2013,2,28,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,2.2,86,99974,474,1393,299,294,296,150,32485,19981,16650,5192,130,2.1,9,9,4828.0,7200,0,919999999,12,0.1060,0,88,0.866,0.0,0.0 +2013,2,28,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,4.4,2.2,86,99974,242,1393,299,167,223,101,17745,9097,10781,2651,130,2.1,9,9,4828.0,7200,0,919999999,12,0.1060,0,88,0.866,0.0,0.0 +2013,2,28,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,1.1,67,99995,0,1310,308,0,0,0,0,0,0,0,320,2.6,9,9,4828.0,1189,0,919999999,11,0.1060,0,88,0.866,0.0,0.0 +2013,2,28,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.6,0.5,74,100002,0,0,303,0,0,0,0,0,0,0,267,2.5,9,9,4828.0,3658,0,919999999,10,0.1060,0,88,0.866,0.0,0.0 +2013,2,28,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.9,0.3,77,99997,0,0,303,0,0,0,0,0,0,0,190,2.3,9,9,4828.0,3658,9,999999999,10,0.1060,0,88,0.105,0.0,0.0 +2013,2,28,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.2,0.6,83,100315,0,0,298,0,0,0,0,0,0,0,110,2.6,9,9,4828.0,1402,9,999999999,10,0.1060,0,88,0.105,0.0,0.0 +2013,2,28,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.1,-4.2,71,101022,0,0,274,0,0,0,0,0,0,0,100,3.4,5,5,4828.0,77777,9,999999999,7,0.1060,0,88,0.105,0.0,0.0 +2013,2,28,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.0,-8.9,60,101736,0,0,290,0,0,0,0,0,0,0,172,4.3,9,9,4828.0,77777,9,999999999,4,0.1060,0,88,0.105,0.0,0.0 +2013,2,28,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-6.2,-13.9,50,102491,0,0,302,0,0,0,0,0,0,0,250,4.8,10,10,4828.0,335,9,999999999,3,0.1060,0,88,0.105,0.0,0.0 +2008,3,1,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-9.6,-19.7,39,102951,0,0,211,0,0,0,0,0,0,0,327,5.2,3,3,8047.0,77777,9,999999999,1,0.1070,0,88,0.866,0.0,0.0 +2008,3,1,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-10.0,-20.3,39,103021,0,0,211,0,0,0,0,0,0,0,330,5.0,3,3,8047.0,77777,9,999999999,1,0.1070,0,88,0.866,0.0,0.0 +2008,3,1,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-10.7,-20.7,40,103138,0,0,207,0,0,0,0,0,0,0,330,4.7,3,3,8047.0,77777,9,999999999,1,0.1070,0,88,0.866,0.0,0.0 +2008,3,1,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-11.0,-20.9,40,103225,0,0,195,0,0,0,0,0,0,0,330,4.5,0,0,8047.0,77777,9,999999999,1,0.1070,0,88,0.866,0.0,0.0 +2008,3,1,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-11.1,-20.7,41,103283,0,0,195,0,0,0,0,0,0,0,332,4.0,0,0,8047.0,77777,9,999999999,1,0.1070,0,88,0.866,0.0,0.0 +2008,3,1,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-10.7,-20.6,40,103370,0,0,201,0,0,0,0,0,0,0,334,3.1,3,3,8047.0,77777,9,999999999,1,0.1070,0,88,0.866,0.0,0.0 +2008,3,1,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-11.1,-20.6,41,103350,20,103,194,0,0,0,0,0,0,0,340,3.1,0,0,8047.0,77777,9,999999999,1,0.1070,0,88,0.866,0.0,0.0 +2008,3,1,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-11.1,-20.6,41,103350,275,1392,194,115,459,35,13543,8766,4129,1397,340,3.1,0,0,8047.0,77777,9,999999999,1,0.1070,0,88,0.866,0.0,0.0 +2008,3,1,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-8.9,-20.6,34,103471,504,1392,201,287,741,64,34295,38366,7666,2808,336,1.5,0,0,8047.0,77777,9,999999999,1,0.1070,0,88,0.866,0.0,0.0 +2008,3,1,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-7.8,-20.6,31,103481,689,1392,204,469,883,85,56872,55186,10336,4007,333,2.1,0,0,8047.0,77777,9,999999999,1,0.1070,0,88,0.866,0.0,0.0 +2008,3,1,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-7.8,-20.6,31,103481,818,1392,204,613,942,101,74982,62593,12393,4962,325,2.1,0,0,8047.0,77777,9,999999999,1,0.1070,0,88,0.866,0.0,0.0 +2008,3,1,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-7.2,-16.7,42,103451,883,1392,222,703,966,112,86170,65506,13775,5586,100,2.1,5,5,8047.0,77777,9,999999999,2,0.1070,0,88,0.866,0.0,0.0 +2008,3,1,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-6.1,-15.0,45,103361,879,1392,227,684,907,110,83893,61110,13537,5489,80,2.1,5,5,8047.0,77777,9,999999999,2,0.1070,0,88,0.866,0.0,0.0 +2008,3,1,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-6.1,-15.0,45,103361,807,1392,241,689,937,121,82951,64519,14620,5775,80,2.1,9,9,8047.0,77777,9,999999999,2,0.1070,0,88,0.866,0.0,0.0 +2008,3,1,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-13.9,46,103261,671,1392,246,588,890,114,69453,59343,13513,5094,100,4.6,9,9,8047.0,7620,9,999999999,3,0.1070,0,88,0.866,0.0,0.0 +2008,3,1,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-12.2,53,103231,480,1392,247,436,804,99,50046,46781,11403,3941,110,5.1,9,9,8047.0,7620,9,999999999,3,0.1070,0,88,0.866,0.0,0.0 +2008,3,1,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-5.0,-12.2,53,103231,248,1392,234,250,628,74,27420,19895,8146,2345,110,5.1,5,5,8047.0,7620,9,999999999,3,0.1070,0,88,0.866,0.0,0.0 +2008,3,1,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-4.4,-10.6,58,103162,0,1339,237,0,0,0,0,0,0,0,140,6.2,5,5,8047.0,77777,9,999999999,4,0.1070,0,88,0.866,0.0,0.0 +2008,3,1,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.9,-10.6,56,103112,0,0,239,0,0,0,0,0,0,0,140,8.2,5,5,8047.0,77777,9,999999999,4,0.1070,0,88,0.866,0.0,0.0 +2008,3,1,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.9,-10.6,56,103112,0,0,253,0,0,0,0,0,0,0,140,8.2,9,9,8047.0,77777,9,999999999,4,0.1070,0,88,0.866,0.0,0.0 +2008,3,1,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-10.6,61,103081,0,0,249,0,0,0,0,0,0,0,190,5.1,9,9,8047.0,3353,9,999999999,4,0.1070,0,88,0.866,0.0,0.0 +2008,3,1,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-4.4,-10.0,61,103032,0,0,259,0,0,0,0,0,0,0,160,3.6,10,10,8047.0,2896,9,999999999,4,0.1070,0,88,0.866,0.0,0.0 +2008,3,1,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-4.4,-10.0,61,103032,0,0,259,0,0,0,0,0,0,0,160,3.6,10,10,8047.0,2896,9,999999999,4,0.1070,0,88,0.866,0.0,0.0 +2008,3,1,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-4.0,-8.0,71,101277,0,0,262,0,0,0,0,0,0,0,140,3.6,10,10,3219.0,884,0,999099999,5,0.1070,0,88,0.866,0.0,0.0 +2008,3,2,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-4.0,-7.0,77,101277,0,0,263,0,0,0,0,0,0,0,140,4.6,10,10,2414.0,640,0,999099999,5,0.1070,0,88,0.866,0.0,0.0 +2008,3,2,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-3.3,-6.1,79,102652,0,0,267,0,0,0,0,0,0,0,130,6.7,10,10,2800.0,640,0,999099999,6,0.1070,0,88,0.866,0.0,0.0 +2008,3,2,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-2.0,-4.0,85,101278,0,0,274,0,0,0,0,0,0,0,130,7.7,10,10,2816.0,579,0,999099999,7,0.1070,0,88,0.866,0.8,0.0 +2008,3,2,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-1.0,-3.0,85,101278,0,0,279,0,0,0,0,0,0,0,130,8.8,10,10,3219.0,396,0,999099999,7,0.1070,0,88,0.866,0.0,0.0 +2008,3,2,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,0.0,-2.2,83,101983,0,0,284,0,0,0,0,0,0,0,140,8.2,10,10,3200.0,396,0,999099999,8,0.1070,0,88,0.866,0.0,0.0 +2008,3,2,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.1,-0.6,88,101663,0,0,291,0,0,0,0,0,0,0,160,6.7,10,10,3219.0,305,0,999099999,9,0.1070,0,88,0.866,0.0,0.0 +2008,3,2,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.0,-1.0,86,101278,20,103,290,0,0,0,0,0,0,0,150,6.7,10,10,6437.0,305,0,999099999,9,0.1070,0,88,0.866,0.0,0.0 +2008,3,2,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,1.1,-0.6,88,101543,275,1392,291,27,0,27,2659,0,2679,1113,160,5.7,10,10,4800.0,305,0,999099999,9,0.1070,0,88,0.866,0.0,0.0 +2008,3,2,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.0,-1.0,86,101278,504,1392,290,57,31,48,6944,1397,5858,2176,150,4.6,10,10,2414.0,183,0,999099999,9,0.1070,0,88,0.866,0.0,0.0 +2008,3,2,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.0,0.0,93,101278,689,1392,291,118,31,109,14001,1966,12978,4962,170,4.1,10,10,4023.0,183,0,999099999,10,0.1070,0,88,0.866,0.0,0.0 +2008,3,2,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,1.1,0.0,92,101153,818,1392,291,97,0,97,9987,0,10076,4787,190,2.6,10,10,6000.0,183,0,919099999,10,0.1070,0,88,0.866,0.0,0.0 +2008,3,2,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.8,1.1,89,100904,883,1392,300,188,7,183,22136,519,21647,8444,230,1.5,10,10,9656.0,335,0,919099999,11,0.1070,0,88,0.866,0.0,0.0 +2008,3,2,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.0,1.0,87,101279,879,1392,301,341,130,257,39066,10947,29605,10830,230,3.1,10,10,9656.0,274,0,919099999,11,0.1070,0,88,0.866,0.0,0.0 +2008,3,2,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,1.1,85,100734,807,1392,302,198,43,171,23147,3145,20081,7669,300,2.6,10,10,9656.0,274,0,919099999,11,0.1070,0,88,0.866,0.0,0.0 +2008,3,2,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.0,1.0,87,101279,671,1392,301,249,89,200,28054,7028,22646,7747,280,5.7,10,10,9656.0,366,0,919099999,11,0.1070,0,88,0.866,0.0,0.0 +2008,3,2,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.0,0.0,81,101279,480,1392,299,139,52,120,15675,3169,13586,4534,290,5.7,10,10,9656.0,1250,0,919099999,10,0.1070,0,88,0.866,0.0,0.0 +2008,3,2,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,0.0,82,100704,248,1392,290,44,0,44,4323,0,4354,1635,290,4.1,9,9,9656.0,1250,0,919099999,10,0.1070,0,88,0.866,0.0,0.0 +2008,3,2,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-2.2,66,100794,0,1339,274,0,0,0,0,0,0,0,290,5.1,5,5,9656.0,77777,0,919099999,8,0.1070,0,88,0.866,0.0,0.0 +2008,3,2,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-3.9,57,100864,0,0,268,0,0,0,0,0,0,0,280,7.2,3,3,9656.0,77777,0,919099999,7,0.1070,0,88,0.866,0.0,0.0 +2008,3,2,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-3.9,57,100864,0,0,268,0,0,0,0,0,0,0,280,7.2,3,3,9656.0,77777,9,999999999,7,0.1070,0,88,0.866,0.3,0.0 +2008,3,2,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-6.1,53,100964,0,0,260,0,0,0,0,0,0,0,290,6.2,3,3,9656.0,77777,9,999999999,5,0.1070,0,88,0.866,0.0,0.0 +2008,3,2,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-6.1,55,101003,0,0,258,0,0,0,0,0,0,0,270,7.7,3,3,9656.0,77777,9,999999999,5,0.1070,0,88,0.866,0.0,0.0 +2008,3,2,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-6.1,55,101003,0,0,262,0,0,0,0,0,0,0,270,7.7,5,5,9656.0,77777,9,999999999,5,0.1070,0,88,0.866,0.0,0.0 +2008,3,2,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-6.7,57,101043,0,0,242,0,0,0,0,0,0,0,280,6.7,0,0,9656.0,77777,9,999999999,5,0.1070,0,88,0.866,0.0,0.0 +2008,3,3,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-7.2,54,101063,0,0,242,0,0,0,0,0,0,0,270,8.2,0,0,9656.0,77777,9,999999999,5,0.1080,0,88,0.866,0.0,0.0 +2008,3,3,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-7.2,54,101063,0,0,252,0,0,0,0,0,0,0,270,8.2,3,3,9656.0,77777,9,999999999,5,0.1080,0,88,0.866,0.0,0.0 +2008,3,3,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-7.2,60,101133,0,0,252,0,0,0,0,0,0,0,290,6.7,5,5,9656.0,77777,9,999999999,5,0.1080,0,88,0.866,5.0,0.0 +2008,3,3,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-7.8,57,101253,0,0,238,0,0,0,0,0,0,0,290,7.2,0,0,9656.0,77777,9,999999999,5,0.1080,0,88,0.866,0.0,0.0 +2008,3,3,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-7.8,57,101253,0,0,238,0,0,0,0,0,0,0,290,7.2,0,0,9656.0,77777,9,999999999,5,0.1080,0,88,0.866,0.0,0.0 +2008,3,3,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-9.4,54,101433,0,0,232,0,0,0,0,0,0,0,290,7.2,0,0,9656.0,77777,9,999999999,4,0.1080,0,88,0.866,0.0,0.0 +2008,3,3,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-10.0,51,101533,27,141,232,8,38,7,922,0,808,246,290,7.2,0,0,9656.0,77777,9,999999999,4,0.1080,0,88,0.866,0.0,0.0 +2008,3,3,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-10.0,51,101533,283,1392,232,114,340,50,13073,8629,5748,1888,290,7.2,0,0,9656.0,77777,9,999999999,4,0.1080,0,88,0.866,0.0,0.0 +2008,3,3,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-10.0,47,101693,511,1392,246,283,602,91,32927,34520,10622,3790,300,11.8,3,3,9656.0,77777,9,999999999,4,0.1080,0,88,0.866,0.0,0.0 +2008,3,3,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-10.0,43,101723,696,1392,239,464,767,120,54821,51775,14229,5398,300,7.7,0,0,9656.0,77777,9,999999999,4,0.1080,0,88,0.866,0.0,0.0 +2008,3,3,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-10.0,43,101723,825,1392,239,609,848,138,72769,59962,16554,6514,300,7.7,0,0,9656.0,77777,9,999999999,4,0.1080,0,88,0.866,0.0,0.0 +2008,3,3,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-9.4,37,101833,890,1392,250,702,893,145,84417,63709,17507,7003,310,8.8,0,0,9656.0,77777,9,999999999,4,0.1080,0,88,0.866,0.0,0.0 +2008,3,3,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-10.0,34,101823,886,1392,251,732,916,142,88115,65083,17161,6868,300,7.7,0,0,9656.0,77777,9,999999999,4,0.1080,0,88,0.866,0.0,0.0 +2008,3,3,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-10.0,34,101823,813,1392,251,697,916,132,83404,63988,15856,6237,300,7.7,0,0,9656.0,77777,9,999999999,4,0.1080,0,88,0.866,0.0,0.0 +2008,3,3,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-9.4,33,101914,677,1392,256,599,886,118,70609,59246,13960,5261,270,8.2,0,0,9656.0,77777,9,999999999,4,0.1080,0,88,0.866,0.0,0.0 +2008,3,3,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-10.0,30,101984,486,1392,289,404,661,110,46036,40208,12581,4288,300,6.2,9,9,9656.0,7620,9,999999999,4,0.1080,0,88,0.866,0.0,0.0 +2008,3,3,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.0,-10.0,30,101984,253,1392,289,227,486,71,25031,14896,7857,2315,300,6.2,9,9,9656.0,7620,9,999999999,4,0.1080,0,88,0.866,0.0,0.0 +2008,3,3,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-11.7,30,102193,0,1367,278,0,0,0,0,0,0,0,300,7.7,9,9,9656.0,7620,9,999999999,3,0.1080,0,88,0.866,0.0,0.0 +2008,3,3,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-11.7,32,102273,0,0,244,0,0,0,0,0,0,0,310,5.7,0,0,9656.0,77777,9,999999999,3,0.1080,0,88,0.866,0.0,0.0 +2008,3,3,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-11.7,32,102273,0,0,244,0,0,0,0,0,0,0,310,5.7,0,0,9656.0,77777,9,999999999,3,0.1080,0,88,0.866,0.0,0.0 +2008,3,3,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-11.7,34,102413,0,0,242,0,0,0,0,0,0,0,310,5.1,0,0,9656.0,77777,9,999999999,3,0.1080,0,88,0.866,0.0,0.0 +2008,3,3,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-11.1,37,102413,0,0,240,0,0,0,0,0,0,0,300,4.6,0,0,9656.0,77777,9,999999999,3,0.1080,0,88,0.866,0.0,0.0 +2008,3,3,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-11.1,37,102413,0,0,240,0,0,0,0,0,0,0,300,4.6,0,0,9656.0,77777,9,999999999,3,0.1080,0,88,0.866,0.0,0.0 +2008,3,3,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-10.6,40,102493,0,0,239,0,0,0,0,0,0,0,310,3.1,0,0,9656.0,77777,9,999999999,3,0.1080,0,88,0.866,0.0,0.0 +2008,3,4,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-11.1,41,102512,0,0,236,0,0,0,0,0,0,0,300,1.5,0,0,9656.0,77777,9,999999999,3,0.1090,0,88,0.866,0.0,0.0 +2008,3,4,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-11.1,41,102512,0,0,236,0,0,0,0,0,0,0,300,1.5,0,0,9656.0,77777,9,999999999,3,0.1090,0,88,0.866,0.0,0.0 +2008,3,4,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-8.9,62,102522,0,0,229,0,0,0,0,0,0,0,90,1.5,0,0,9656.0,77777,9,999999999,4,0.1090,0,88,0.866,0.0,0.0 +2008,3,4,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-8.3,59,102572,0,0,233,0,0,0,0,0,0,0,200,1.5,0,0,9656.0,77777,9,999999999,4,0.1090,0,88,0.866,0.0,0.0 +2008,3,4,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-8.3,59,102572,0,0,233,0,0,0,0,0,0,0,200,1.5,0,0,9656.0,77777,9,999999999,4,0.1090,0,88,0.866,0.0,0.0 +2008,3,4,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-8.9,56,102582,0,0,247,0,0,0,0,0,0,0,210,3.1,5,5,9656.0,77777,9,999999999,4,0.1090,0,88,0.866,0.0,0.0 +2008,3,4,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-8.9,51,102602,34,178,265,6,0,6,580,0,584,219,210,2.6,9,9,9656.0,2896,9,999999999,4,0.1090,0,88,0.866,0.0,0.0 +2008,3,4,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-1.1,-8.9,51,102602,290,1391,247,104,277,47,12013,6937,5441,1813,210,2.6,3,3,9656.0,2896,9,999999999,4,0.1090,0,88,0.866,0.0,0.0 +2008,3,4,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-8.3,40,102513,518,1391,262,267,516,88,31192,29260,10312,3710,190,4.6,3,3,9656.0,77777,9,999999999,4,0.1090,0,88,0.866,0.0,0.0 +2008,3,4,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-7.8,38,102403,703,1391,268,449,731,118,53172,48891,14024,5348,190,5.7,3,3,9656.0,77777,9,999999999,5,0.1090,0,88,0.866,0.0,0.0 +2008,3,4,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-7.8,38,102403,832,1391,289,463,490,203,53735,39014,23675,8881,190,5.7,9,9,9656.0,77777,9,999999999,5,0.1090,0,88,0.866,0.0,0.0 +2008,3,4,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-6.7,38,102244,897,1391,303,346,303,168,41170,22390,20078,7940,220,6.2,10,10,9656.0,1676,9,999999999,5,0.1090,0,88,0.866,0.0,0.0 +2008,3,4,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-5.6,39,102114,892,1391,309,338,134,252,38928,11378,29181,10784,220,6.2,10,10,9656.0,1981,9,999999999,6,0.1090,0,88,0.866,0.0,0.0 +2008,3,4,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.7,-5.6,39,102114,819,1391,301,297,188,185,34636,14434,21675,8215,220,6.2,9,9,9656.0,1981,9,999999999,6,0.1090,0,88,0.866,0.0,0.0 +2008,3,4,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,-2.8,46,101854,683,1391,318,218,54,190,24747,4221,21673,7576,230,6.2,10,10,9656.0,3353,9,999999999,7,0.1090,0,88,0.866,0.0,0.0 +2008,3,4,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,-2.8,42,101774,491,1391,296,293,316,174,32162,23722,19193,5777,230,9.8,5,5,9656.0,77777,9,999999999,7,0.1090,0,88,0.866,0.0,0.0 +2008,3,4,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,-2.8,42,101774,259,1391,292,184,318,110,19570,15069,11754,2878,230,9.8,3,3,9656.0,77777,9,999999999,7,0.1090,0,88,0.866,0.0,0.0 +2008,3,4,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,-1.1,53,101644,0,1396,289,0,0,0,0,0,0,0,220,7.7,3,3,9656.0,77777,9,999999999,9,0.1090,0,88,0.866,0.0,0.0 +2008,3,4,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,0.6,63,101604,0,0,288,0,0,0,0,0,0,0,220,8.2,3,3,9656.0,77777,9,999999999,11,0.1090,0,88,0.866,0.0,0.0 +2008,3,4,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,0.6,63,101604,0,0,288,0,0,0,0,0,0,0,220,8.2,3,3,9656.0,77777,9,999999999,11,0.1090,0,88,0.100,0.0,0.0 +2008,3,4,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,1.1,67,101554,0,0,287,0,0,0,0,0,0,0,220,7.7,3,3,9656.0,77777,9,999999999,11,0.1090,0,88,0.100,0.0,0.0 +2008,3,4,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,1.7,68,101484,0,0,289,0,0,0,0,0,0,0,220,9.3,3,3,9656.0,77777,9,999999999,12,0.1090,0,88,0.100,0.0,0.0 +2008,3,4,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,1.7,68,101484,0,0,289,0,0,0,0,0,0,0,220,9.3,3,3,9656.0,77777,9,999999999,12,0.1090,0,88,0.100,0.0,0.0 +2008,3,4,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,3.9,76,101334,0,0,299,0,0,0,0,0,0,0,220,8.2,5,5,9656.0,77777,9,999999999,15,0.1090,0,88,0.100,0.0,0.0 +2008,3,5,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,4.4,79,101304,0,0,299,0,0,0,0,0,0,0,210,7.7,5,5,9656.0,77777,9,999999999,15,0.1100,0,88,0.100,0.0,0.0 +2008,3,5,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,4.4,79,101304,0,0,299,0,0,0,0,0,0,0,210,7.7,5,5,9656.0,77777,9,999999999,15,0.1100,0,88,0.100,0.0,0.0 +2008,3,5,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,6.1,83,101125,0,0,324,0,0,0,0,0,0,0,220,6.7,9,9,9656.0,7620,9,999999999,18,0.1100,0,88,0.100,0.0,0.0 +2008,3,5,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,6.1,80,101135,0,0,326,0,0,0,0,0,0,0,220,6.7,9,9,9656.0,7620,9,999999999,18,0.1100,0,88,0.100,0.0,0.0 +2008,3,5,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,9.4,6.1,80,101135,0,0,326,0,0,0,0,0,0,0,220,6.7,9,9,9656.0,7620,9,999999999,18,0.1100,0,88,0.100,0.0,0.0 +2008,3,5,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,7.2,79,101145,0,0,333,0,0,0,0,0,0,0,230,8.8,9,9,9656.0,7620,9,999999999,20,0.1100,0,88,0.100,0.0,0.0 +2008,3,5,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,7.2,79,101175,41,216,333,9,0,9,866,0,872,315,230,9.8,9,9,9656.0,8230,9,999999999,20,0.1100,0,88,0.100,0.0,0.0 +2008,3,5,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.6,7.2,79,101175,297,1390,333,102,233,54,11631,5618,6174,2042,230,9.8,9,9,9656.0,8230,9,999999999,20,0.1100,0,88,0.100,0.0,0.0 +2008,3,5,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,8.9,72,101225,525,1390,351,245,409,109,28048,23000,12525,4420,230,9.8,9,9,9656.0,8230,9,999999999,24,0.1100,0,88,0.100,0.0,0.0 +2008,3,5,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,9.4,69,101286,710,1390,357,293,260,186,33350,18876,21274,7641,250,12.4,9,9,9656.0,8230,9,999999999,25,0.1100,0,88,0.100,0.0,0.0 +2008,3,5,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.0,9.4,69,101286,839,1390,367,276,121,218,31728,9189,25191,9401,250,12.3,10,10,9656.0,8230,9,999999999,25,0.1100,0,88,0.100,0.0,0.0 +2008,3,5,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.0,9.0,63,101281,904,1390,371,194,16,185,22832,1133,21876,8612,270,5.1,10,10,9656.0,1341,9,999999999,24,0.1100,0,88,0.100,0.0,0.0 +2008,3,5,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.0,9.0,72,101280,899,1390,361,134,7,129,16202,444,15658,6364,260,5.1,10,10,9656.0,640,9,999999999,24,0.1100,0,88,0.100,0.0,0.0 +2008,3,5,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.9,8.9,72,101305,826,1390,360,86,0,86,8828,0,8908,4313,280,4.6,10,10,9656.0,640,9,999999999,24,0.1100,0,88,0.100,0.0,0.0 +2008,3,5,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,5.6,66,101355,689,1390,346,65,0,65,6610,0,6666,3152,332,1.5,10,10,9656.0,762,9,999999999,17,0.1100,0,88,0.100,0.0,0.0 +2008,3,5,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,11.1,5.6,69,101435,497,1390,343,46,0,46,4605,0,4642,2087,340,5.1,10,10,8047.0,823,0,919999999,17,0.1100,0,88,0.100,0.0,0.0 +2008,3,5,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,11.1,5.6,69,101435,264,1390,343,19,0,19,1865,0,1879,802,340,5.1,10,10,8000.0,823,0,919999999,17,0.1100,0,88,0.100,0.0,0.0 +2008,3,5,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,4.4,89,101564,6,1390,318,4,0,4,384,0,387,145,360,3.6,10,10,8000.0,884,0,919999999,15,0.1100,0,88,0.100,0.0,0.0 +2008,3,5,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,6.0,4.0,87,101279,0,33,317,0,0,0,0,0,0,0,30,2.6,10,10,9656.0,549,0,919999999,15,0.1100,0,88,0.100,0.0,0.0 +2008,3,5,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,6.1,4.4,89,101624,0,0,318,0,0,0,0,0,0,0,50,2.6,10,10,8000.0,549,0,919999999,15,0.1100,0,88,0.097,6.0,0.0 +2008,3,5,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,5.6,3.9,89,101634,0,0,315,0,0,0,0,0,0,0,50,4.6,10,10,4023.0,183,0,919999999,15,0.1100,0,88,0.097,5.2,0.0 +2008,3,5,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,6.0,4.0,87,101279,0,0,317,0,0,0,0,0,0,0,40,4.1,10,10,8047.0,183,0,919999999,15,0.1100,0,88,0.097,0.0,0.0 +2008,3,5,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,4.4,3.3,93,101654,0,0,309,0,0,0,0,0,0,0,50,7.2,10,10,4000.0,183,0,919999999,14,0.1100,0,88,0.097,0.0,0.0 +2008,3,5,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.9,2.2,89,101544,0,0,306,0,0,0,0,0,0,0,50,7.7,10,10,6437.0,122,0,919999999,12,0.1100,0,88,0.097,0.0,0.0 +2008,3,6,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.9,2.8,93,101484,0,0,306,0,0,0,0,0,0,0,50,8.2,10,10,4828.0,122,0,919999999,13,0.1110,0,88,0.097,0.0,0.0 +2008,3,6,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,3.9,2.8,93,101484,0,0,306,0,0,0,0,0,0,0,50,8.2,10,10,4800.0,122,0,919999999,13,0.1110,0,88,0.097,0.0,0.0 +2008,3,6,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.9,2.8,93,101154,0,0,306,0,0,0,0,0,0,0,50,9.3,10,10,3219.0,122,0,919999999,13,0.1110,0,88,0.097,0.0,0.0 +2008,3,6,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.9,2.8,93,100974,0,0,306,0,0,0,0,0,0,0,40,9.3,10,10,3219.0,122,0,919999999,13,0.1110,0,88,0.097,0.0,0.0 +2008,3,6,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,3.9,2.8,93,100974,0,0,306,0,0,0,0,0,0,0,40,9.3,10,10,3200.0,122,0,919999999,13,0.1110,0,88,0.097,0.0,0.0 +2008,3,6,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,4.4,3.3,93,100674,0,0,309,0,0,0,0,0,0,0,50,8.8,10,10,402.0,61,0,919999999,14,0.1110,0,88,0.097,0.0,0.0 +2008,3,6,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,5.0,3.9,93,100384,49,254,312,0,0,0,0,0,0,0,50,8.8,10,10,402.0,61,0,919999999,15,0.1110,0,88,0.097,0.0,0.0 +2008,3,6,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,5.0,3.9,93,100384,304,1389,312,18,0,18,1774,0,1788,783,50,8.7,10,10,400.0,61,0,919999999,15,0.1110,0,88,0.097,0.0,0.0 +2008,3,6,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.0,6.0,93,101279,532,1389,315,52,0,52,5220,0,5262,2379,150,2.1,9,9,3219.0,488,0,919999999,18,0.1110,0,88,0.097,0.0,0.0 +2008,3,6,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.0,9.0,87,101280,717,1389,346,27,0,27,2747,0,2771,1393,190,5.7,10,10,3219.0,335,0,919999999,24,0.1110,0,88,0.097,0.0,0.0 +2008,3,6,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.1,10.0,93,99956,846,1389,319,49,0,49,5035,0,5081,2577,170,7.2,5,5,3219.0,335,0,919999999,26,0.1110,0,88,0.097,0.0,0.0 +2008,3,6,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,10.0,72,101281,910,1389,367,64,0,64,6611,0,6672,3384,210,9.3,10,10,3219.0,823,0,919999999,26,0.1110,0,88,0.097,0.0,0.0 +2008,3,6,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,9.4,72,99586,905,1389,354,251,55,215,29200,4096,25140,9689,220,10.3,9,9,3219.0,823,0,919999999,25,0.1110,0,88,0.097,0.0,0.0 +2008,3,6,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,14.4,9.4,72,99586,832,1389,354,62,0,61,6366,0,6320,3152,220,10.3,9,9,3219.0,823,0,919999999,25,0.1110,0,88,0.097,0.0,0.0 +2008,3,6,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,7.2,62,99746,694,1389,326,170,78,131,19861,5030,15365,5795,240,10.3,3,3,3219.0,77777,0,919999999,20,0.1110,0,88,0.097,0.0,0.0 +2008,3,6,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,5.0,59,99936,503,1389,322,176,104,135,19738,6600,15204,5044,280,7.7,5,5,3219.0,77777,0,919999999,16,0.1110,0,88,0.097,0.0,0.0 +2008,3,6,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,5.0,59,99936,270,1389,341,130,164,76,14293,5064,8387,2495,280,7.7,9,9,3219.0,77777,0,919999999,16,0.1110,0,88,0.097,0.0,0.0 +2008,3,6,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,2.8,66,100395,12,1389,329,61,124,25,6181,0,2545,368,280,9.3,10,10,3219.0,914,0,919999999,13,0.1110,0,88,0.097,0.0,0.0 +2008,3,6,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,2.2,65,100595,0,61,326,0,0,0,0,0,0,0,280,11.3,10,10,3219.0,1158,0,919999999,12,0.1110,0,88,0.097,0.0,0.0 +2008,3,6,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.3,2.2,65,100595,0,0,282,0,0,0,0,0,0,0,280,11.3,0,0,3219.0,1158,0,919999999,12,0.1110,0,88,0.097,5.0,0.0 +2008,3,6,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-2.2,58,100904,0,0,265,0,0,0,0,0,0,0,270,6.7,0,0,3219.0,77777,0,919999999,8,0.1110,0,88,0.097,0.0,0.0 +2008,3,6,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-3.3,57,101014,0,0,260,0,0,0,0,0,0,0,280,7.7,0,0,3219.0,77777,0,919999999,7,0.1110,0,88,0.097,0.0,0.0 +2008,3,6,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-3.3,57,101014,0,0,260,0,0,0,0,0,0,0,280,7.7,0,0,3219.0,77777,0,919999999,7,0.1110,0,88,0.097,0.0,0.0 +2008,3,6,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-4.4,57,101304,0,0,255,0,0,0,0,0,0,0,270,6.2,0,0,3219.0,77777,0,919999999,6,0.1110,0,88,0.097,0.0,0.0 +2008,3,7,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-4.4,59,101433,0,0,252,0,0,0,0,0,0,0,260,6.2,0,0,3219.0,77777,0,919999999,6,0.1120,0,88,0.097,0.0,0.0 +2008,3,7,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-4.4,59,101433,0,0,252,0,0,0,0,0,0,0,260,6.2,0,0,3219.0,77777,0,919999999,6,0.1120,0,88,0.097,0.0,0.0 +2008,3,7,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-5.0,61,101623,0,0,248,0,0,0,0,0,0,0,290,5.7,0,0,3219.0,77777,0,919999999,6,0.1120,0,88,0.097,0.3,0.0 +2008,3,7,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-4.4,64,101753,0,0,248,0,0,0,0,0,0,0,290,4.1,0,0,3219.0,77777,0,919999999,6,0.1120,0,88,0.097,0.0,0.0 +2008,3,7,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-4.4,64,101753,0,0,248,0,0,0,0,0,0,0,290,4.1,0,0,3219.0,77777,0,919999999,6,0.1120,0,88,0.097,0.0,0.0 +2008,3,7,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-5.0,61,101933,0,0,259,0,0,0,0,0,0,0,290,3.6,3,3,3219.0,77777,0,919999999,6,0.1120,0,88,0.097,0.0,0.0 +2008,3,7,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-5.6,55,101973,56,292,280,14,85,10,1615,0,1155,356,330,4.6,9,9,3219.0,9144,0,919999999,6,0.1120,0,88,0.097,0.0,0.0 +2008,3,7,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.7,-5.6,55,101973,312,1389,280,112,341,43,13115,8882,5045,1723,330,4.6,9,9,3219.0,9144,0,919999999,6,0.1120,0,88,0.097,0.0,0.0 +2008,3,7,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-6.1,45,102173,540,1389,289,293,669,69,35037,35501,8272,3070,340,3.1,9,9,3219.0,9144,0,919999999,5,0.1120,0,88,0.097,0.0,0.0 +2008,3,7,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-5.6,44,102214,724,1389,294,405,620,120,48072,41532,14295,5494,360,4.1,9,9,3219.0,9144,0,919999999,6,0.1120,0,88,0.097,0.0,0.0 +2008,3,7,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.0,-5.6,44,102214,853,1389,294,572,773,116,69534,51649,14151,5693,360,4.1,9,9,3219.0,9144,0,919999999,6,0.1120,0,88,0.097,0.0,0.0 +2008,3,7,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-2.8,58,102263,917,1389,278,685,910,99,71988,91471,13884,2202,100,5.1,5,5,3219.0,77777,0,919999999,8,0.1120,0,88,0.097,0.0,0.0 +2008,3,7,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-2.2,61,102283,912,1389,278,677,824,132,82184,56102,16086,6528,120,4.6,5,5,3219.0,77777,0,919999999,8,0.1120,0,88,0.097,0.0,0.0 +2008,3,7,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-2.2,61,102283,838,1389,278,559,558,204,64858,43801,23785,8953,120,4.6,5,5,3219.0,77777,0,919999999,8,0.1120,0,88,0.097,0.0,0.0 +2008,3,7,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-2.2,63,102263,700,1389,293,498,606,155,57654,43604,18021,6639,110,6.7,9,9,3219.0,9144,0,919999999,8,0.1120,0,88,0.097,0.0,0.0 +2008,3,7,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-2.2,63,102283,508,1389,293,373,565,119,42411,35178,13583,4648,110,5.7,9,9,3219.0,9144,0,919999999,8,0.1120,0,88,0.097,0.0,0.0 +2008,3,7,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.9,-2.2,63,102283,275,1389,293,201,337,97,21745,14389,10538,2884,110,5.7,9,9,3219.0,9144,0,919999999,8,0.1120,0,88,0.097,0.0,0.0 +2008,3,7,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-1.7,71,102363,17,1389,289,70,130,38,6885,0,3759,153,110,5.1,9,9,3219.0,9144,0,919999999,8,0.1120,0,88,0.097,0.0,0.0 +2008,3,7,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-0.6,78,102403,0,89,298,0,0,0,0,0,0,0,100,3.1,10,10,3219.0,7620,0,919999999,9,0.1120,0,88,0.097,0.0,0.0 +2008,3,7,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,-0.6,78,102403,0,0,298,0,0,0,0,0,0,0,100,3.1,10,10,3219.0,7620,9,999999999,9,0.1120,0,88,0.097,0.0,0.0 +2008,3,7,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-1.7,71,102453,0,0,268,0,0,0,0,0,0,0,200,2.6,3,3,3219.0,77777,9,999999999,8,0.1120,0,88,0.097,0.0,0.0 +2008,3,7,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-2.8,63,102443,0,0,269,0,0,0,0,0,0,0,190,2.6,3,3,3219.0,77777,9,999999999,8,0.1120,0,88,0.097,0.0,0.0 +2008,3,7,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-2.8,63,102443,0,0,273,0,0,0,0,0,0,0,190,2.6,5,5,3219.0,77777,9,999999999,8,0.1120,0,88,0.097,0.0,0.0 +2008,3,7,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-1.7,74,102493,0,0,255,0,0,0,0,0,0,0,170,3.6,0,0,3219.0,77777,9,999999999,8,0.1120,0,88,0.097,0.0,0.0 +2008,3,8,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-1.7,77,102553,0,0,253,0,0,0,0,0,0,0,200,2.6,0,0,3219.0,77777,9,999999999,8,0.1130,0,88,0.097,0.0,0.0 +2008,3,8,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-1.7,77,102553,0,0,253,0,0,0,0,0,0,0,200,2.6,0,0,3219.0,77777,9,999999999,8,0.1130,0,88,0.097,0.0,0.0 +2008,3,8,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-1.7,83,102593,0,0,249,0,0,0,0,0,0,0,233,0.0,0,0,3219.0,77777,9,999999999,9,0.1130,0,88,0.097,0.0,0.0 +2008,3,8,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-1.7,83,102583,0,0,249,0,0,0,0,0,0,0,258,0.0,0,0,3219.0,77777,9,999999999,9,0.1130,0,88,0.097,0.0,0.0 +2008,3,8,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-1.7,83,102583,0,0,249,0,0,0,0,0,0,0,307,0.0,0,0,3219.0,77777,9,999999999,9,0.1130,0,88,0.097,0.0,0.0 +2008,3,8,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-1.1,91,102553,0,0,258,0,0,0,0,0,0,0,10,1.5,3,3,3219.0,77777,9,999999999,9,0.1130,0,88,0.097,0.0,0.0 +2008,3,8,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,0.6,-1.1,87,102593,63,330,280,7,0,7,677,0,682,265,23,0.0,9,9,8047.0,7620,9,999999999,9,0.1130,0,88,0.097,0.0,0.0 +2008,3,8,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,0.6,-1.1,87,102593,319,1388,264,111,267,48,12905,7435,5593,1902,37,0.0,5,5,8000.0,7620,9,999999999,9,0.1130,0,88,0.097,0.0,0.0 +2008,3,8,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,0.6,82,102673,547,1388,293,241,386,99,28026,22480,11551,4175,80,3.1,9,9,8000.0,7620,9,999999999,11,0.1130,0,88,0.097,0.0,0.0 +2008,3,8,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.0,1.0,87,101279,731,1388,292,371,454,168,42887,33203,19507,7214,70,4.6,9,9,8000.0,7620,9,999999999,11,0.1130,0,88,0.097,0.0,0.0 +2008,3,8,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.9,1.1,82,102723,860,1388,296,407,264,256,46509,22286,29415,10673,80,3.6,9,9,8000.0,7620,9,999999999,11,0.1130,0,88,0.097,0.0,0.0 +2008,3,8,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.0,2.0,75,101279,923,1388,306,411,164,305,46779,14598,34922,12511,60,4.6,9,9,8000.0,457,9,999999999,12,0.1130,0,88,0.097,0.0,0.0 +2008,3,8,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.0,2.0,75,101279,918,1388,306,486,276,301,55327,24468,34470,12360,70,5.7,9,9,8000.0,7620,9,999999999,12,0.1130,0,88,0.097,0.0,0.0 +2008,3,8,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.6,1.1,73,102474,844,1388,312,464,272,289,52368,24318,32808,11387,80,4.6,10,10,8000.0,7620,9,999999999,11,0.1130,0,88,0.097,0.0,0.0 +2008,3,8,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,1.1,79,102323,706,1388,307,309,108,244,34499,9281,27391,9074,70,5.1,10,10,8000.0,457,9,999999999,11,0.1130,0,88,0.097,0.0,0.0 +2008,3,8,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.0,1.0,81,101279,514,1388,305,161,40,138,18097,2636,15578,5186,70,5.1,10,10,8000.0,396,9,999999999,11,0.1130,0,88,0.097,0.0,0.0 +2008,3,8,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,4.4,1.7,83,102233,281,1388,307,46,0,46,4530,0,4563,1765,70,4.6,10,10,8000.0,396,9,999999999,12,0.1130,0,88,0.097,0.0,0.0 +2008,3,8,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,2.2,86,102014,22,1388,308,8,0,8,770,0,775,270,60,4.6,10,10,8000.0,274,9,999999999,12,0.1130,0,88,0.097,0.0,0.0 +2008,3,8,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.0,2.0,87,101279,0,116,306,0,0,0,0,0,0,0,70,4.6,10,10,8000.0,335,9,999999999,12,0.1130,0,88,0.097,0.0,0.0 +2008,3,8,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,4.4,2.2,86,101914,0,0,308,0,0,0,0,0,0,0,60,5.1,10,10,8000.0,335,0,919999999,12,0.1130,0,88,0.097,5.0,0.0 +2008,3,8,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,2.8,93,101664,0,0,306,0,0,0,0,0,0,0,50,5.7,10,10,8000.0,274,0,919999999,13,0.1130,0,88,0.097,5.0,0.0 +2008,3,8,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.9,2.8,93,101434,0,0,306,0,0,0,0,0,0,0,50,5.7,10,10,8047.0,213,0,919999999,13,0.1130,0,88,0.097,5.0,0.0 +2008,3,8,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,3.9,2.8,93,101434,0,0,306,0,0,0,0,0,0,0,50,5.7,10,10,8000.0,213,0,919999999,13,0.1130,0,88,0.097,5.0,0.0 +2008,3,8,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,4.0,3.0,93,101279,0,0,307,0,0,0,0,0,0,0,50,7.2,10,10,3219.0,152,0,919999999,13,0.1130,0,88,0.097,1.3,0.0 +2008,3,9,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,4.0,3.0,93,101279,0,0,307,0,0,0,0,0,0,0,60,6.7,10,10,3219.0,91,0,919999999,13,0.1130,0,88,0.097,0.0,0.0 +2008,3,9,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,4.4,3.3,93,100924,0,0,309,0,0,0,0,0,0,0,30,6.2,10,10,6000.0,91,0,919999999,14,0.1130,0,88,0.097,0.0,0.0 +2008,3,9,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,4.0,3.0,93,101279,0,0,307,0,0,0,0,0,0,0,20,4.1,10,10,8047.0,366,0,919999999,13,0.1130,0,88,0.097,0.0,0.0 +2008,3,9,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.0,3.0,93,101279,0,0,307,0,0,0,0,0,0,0,330,4.6,10,10,8047.0,122,0,919999999,13,0.1130,0,88,0.097,0.0,0.0 +2008,3,9,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,4.4,3.3,93,100614,0,0,309,0,0,0,0,0,0,0,340,3.6,10,10,8047.0,122,0,919999999,14,0.1130,0,88,0.097,0.0,0.0 +2008,3,9,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.9,2.2,89,100824,0,0,306,0,0,0,0,0,0,0,320,4.6,10,10,9656.0,183,0,919999999,12,0.1130,0,88,0.097,0.0,0.0 +2008,3,9,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.8,1.7,92,100864,71,369,300,6,0,6,580,0,584,233,340,2.6,10,10,8047.0,183,0,919999999,12,0.1130,0,88,0.097,0.0,0.0 +2008,3,9,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,2.8,1.7,92,100864,326,1387,300,17,0,17,1680,0,1693,752,340,2.6,10,10,8000.0,183,0,919999999,12,0.1130,0,88,0.097,0.0,0.0 +2008,3,9,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,1.7,89,100904,554,1387,303,30,0,30,3022,0,3047,1445,60,2.6,10,10,8000.0,183,0,919999999,12,0.1130,0,88,0.097,0.0,0.0 +2008,3,9,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.0,2.0,93,101279,738,1387,302,74,0,74,7567,0,7632,3630,60,2.6,10,10,8000.0,122,0,919999999,12,0.1130,0,88,0.097,0.0,0.0 +2008,3,9,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,1.7,89,100854,867,1387,303,76,0,76,7853,0,7924,3916,60,3.6,10,10,8000.0,122,0,919999999,12,0.1130,0,88,0.097,0.0,0.0 +2008,3,9,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,2.2,89,100694,930,1387,306,104,0,104,10799,0,10899,5328,50,5.1,10,10,8000.0,122,0,919999999,12,0.1130,0,88,0.097,0.0,0.0 +2008,3,9,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,4.0,2.0,87,101279,924,1387,306,80,0,80,8304,0,8380,4186,50,4.6,10,10,2414.0,122,0,919999999,12,0.1130,0,88,0.097,0.0,0.0 +2008,3,9,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,3.9,2.2,89,100514,850,1387,306,109,0,109,11246,0,11347,5386,50,4.1,10,10,2400.0,122,0,919999999,12,0.1130,0,88,0.097,0.0,0.0 +2008,3,9,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,4.4,3.3,93,100234,712,1387,309,47,0,47,4793,0,4835,2360,40,5.1,10,10,2414.0,122,0,919999999,14,0.1130,0,88,0.097,0.0,0.0 +2008,3,9,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,4.4,3.3,93,100044,520,1387,309,46,0,46,4618,0,4655,2115,60,7.7,10,10,2414.0,122,0,919999999,14,0.1130,0,88,0.097,0.0,0.0 +2008,3,9,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,4.4,3.3,93,100044,286,1387,309,33,0,33,3249,0,3273,1342,60,7.7,10,10,2400.0,122,0,919999999,14,0.1130,0,88,0.097,0.0,0.0 +2008,3,9,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,6.0,5.0,93,101279,28,1387,318,4,0,4,385,0,387,151,60,6.2,10,10,805.0,274,0,919999999,16,0.1130,0,88,0.097,0.0,0.0 +2008,3,9,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.0,6.0,93,101279,0,144,324,0,0,0,0,0,0,0,60,3.1,10,10,805.0,152,0,919999999,18,0.1130,0,88,0.097,0.0,0.0 +2008,3,9,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,7.8,6.7,93,99335,0,0,328,0,0,0,0,0,0,0,50,5.1,10,10,800.0,152,0,919999999,19,0.1130,0,88,0.097,5.0,0.0 +2008,3,9,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.0,11.0,82,101280,0,0,353,0,0,0,0,0,0,0,200,8.2,9,9,800.0,2286,0,919999999,29,0.1130,0,88,0.097,5.0,0.0 +2008,3,9,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,6.7,69,99096,0,0,321,0,0,0,0,0,0,0,220,10.3,5,5,800.0,77777,0,919999999,19,0.1130,0,88,0.097,5.0,0.0 +2008,3,9,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,6.7,69,99096,0,0,316,0,0,0,0,0,0,0,220,10.3,3,3,800.0,77777,0,919999999,19,0.1130,0,88,0.097,5.0,0.0 +2008,3,9,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,1.7,54,99206,0,0,291,0,0,0,0,0,0,0,220,14.4,0,0,800.0,77777,0,919999999,11,0.1130,0,88,0.097,0.7,0.0 +2008,3,10,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,1.1,60,99385,0,0,315,0,0,0,0,0,0,0,220,12.9,9,9,800.0,1372,0,919999999,11,0.1140,0,88,0.097,5.0,0.0 +2008,3,10,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.3,1.1,60,99385,0,0,315,0,0,0,0,0,0,0,220,12.9,9,9,800.0,1372,0,919999999,11,0.1140,0,88,0.097,5.0,0.0 +2008,3,10,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-4.4,51,99645,0,0,292,0,0,0,0,0,0,0,240,11.8,9,9,800.0,1280,0,919999999,6,0.1140,0,88,0.097,0.0,0.0 +2008,3,10,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-5.6,49,99844,0,0,295,0,0,0,0,0,0,0,250,10.8,10,10,800.0,1372,0,919999999,6,0.1140,0,88,0.097,0.0,0.0 +2008,3,10,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,-5.6,49,99844,0,0,295,0,0,0,0,0,0,0,250,10.8,10,10,800.0,1372,0,919999999,6,0.1140,0,88,0.097,0.0,0.0 +2008,3,10,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-10.6,36,100354,0,0,255,0,0,0,0,0,0,0,270,10.3,3,3,800.0,77777,0,919999999,3,0.1140,0,88,0.097,0.0,0.0 +2008,3,10,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-11.1,37,100554,78,407,251,19,99,13,2190,0,1500,465,270,13.4,3,3,800.0,77777,0,919999999,3,0.1140,0,88,0.097,0.0,0.0 +2008,3,10,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-11.1,37,100554,334,1386,251,136,389,49,15886,12477,5736,1963,270,13.4,3,3,800.0,77777,0,919999999,3,0.1140,0,88,0.097,0.0,0.0 +2008,3,10,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-10.6,37,100794,561,1386,253,304,628,85,35965,36530,10085,3723,260,10.8,3,3,800.0,77777,0,919999999,3,0.1140,0,88,0.097,0.0,0.0 +2008,3,10,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-10.0,39,100914,745,1386,254,472,748,110,56657,49587,13249,5168,280,12.9,3,3,800.0,77777,0,919999999,4,0.1140,0,88,0.097,0.0,0.0 +2008,3,10,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-10.0,39,100914,873,1386,254,575,727,144,69042,51884,17360,6919,280,12.9,3,3,800.0,77777,0,919999999,4,0.1140,0,88,0.097,0.0,0.0 +2008,3,10,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-7.8,41,101094,937,1386,268,578,526,230,67573,42890,27028,10379,270,8.2,5,5,800.0,77777,0,919999999,5,0.1140,0,88,0.097,0.0,0.0 +2008,3,10,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-8.3,39,101104,931,1386,264,683,779,155,82250,56230,18744,7550,260,9.3,3,3,800.0,77777,0,919999999,4,0.1140,0,88,0.097,0.0,0.0 +2008,3,10,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-8.3,39,101104,856,1386,268,648,770,153,77216,55769,18308,7217,260,9.3,5,5,800.0,77777,0,919999999,4,0.1140,0,88,0.097,0.0,0.0 +2008,3,10,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-8.9,35,101304,718,1386,265,603,881,98,72661,56304,11846,4611,270,11.3,3,3,800.0,77777,0,919999999,4,0.1140,0,88,0.097,0.0,0.0 +2008,3,10,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-9.4,35,101414,525,1386,263,459,814,86,53830,46235,10116,3665,270,10.8,3,3,800.0,77777,0,919999999,4,0.1140,0,88,0.097,0.0,0.0 +2008,3,10,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-9.4,35,101414,292,1386,263,280,667,70,31353,23119,7863,2457,270,10.8,3,3,800.0,77777,0,919999999,4,0.1140,0,88,0.097,0.0,0.0 +2008,3,10,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-10.0,38,101763,33,1386,256,103,332,36,10411,0,3657,464,280,8.8,3,3,800.0,77777,0,919999999,4,0.1140,0,88,0.097,0.0,0.0 +2008,3,10,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-10.6,39,101873,0,171,241,0,0,0,0,0,0,0,280,7.2,0,0,800.0,77777,0,919999999,3,0.1140,0,88,0.097,0.0,0.0 +2008,3,10,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-10.6,39,101873,0,0,241,0,0,0,0,0,0,0,280,7.2,0,0,800.0,77777,9,999999999,3,0.1140,0,88,0.097,0.0,0.0 +2008,3,10,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-11.1,41,102133,0,0,236,0,0,0,0,0,0,0,290,7.2,0,0,800.0,77777,9,999999999,3,0.1140,0,88,0.097,0.0,0.0 +2008,3,10,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-11.1,41,102253,0,0,247,0,0,0,0,0,0,0,280,6.2,3,3,800.0,77777,9,999999999,3,0.1140,0,88,0.097,0.0,0.0 +2008,3,10,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-11.1,41,102253,0,0,273,0,0,0,0,0,0,0,280,6.2,10,10,800.0,77777,9,999999999,3,0.1140,0,88,0.097,0.0,0.0 +2008,3,10,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-11.1,44,102382,0,0,268,0,0,0,0,0,0,0,290,6.2,10,10,800.0,1463,9,999999999,3,0.1140,0,88,0.097,0.0,0.0 +2008,3,11,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-11.1,46,102432,0,0,241,0,0,0,0,0,0,0,300,5.1,3,3,800.0,77777,9,999999999,3,0.1150,0,88,0.097,0.0,0.0 +2008,3,11,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-11.1,46,102432,0,0,241,0,0,0,0,0,0,0,300,5.1,3,3,800.0,77777,9,999999999,3,0.1150,0,88,0.097,0.0,0.0 +2008,3,11,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-11.1,49,102472,0,0,239,0,0,0,0,0,0,0,310,4.1,3,3,800.0,77777,9,999999999,3,0.1150,0,88,0.097,0.0,0.0 +2008,3,11,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-11.1,51,102532,0,0,227,0,0,0,0,0,0,0,280,3.6,0,0,800.0,77777,9,999999999,3,0.1150,0,88,0.097,0.0,0.0 +2008,3,11,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-11.1,51,102532,0,0,237,0,0,0,0,0,0,0,280,3.6,3,3,800.0,77777,9,999999999,3,0.1150,0,88,0.097,0.0,0.0 +2008,3,11,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.9,-11.7,51,102652,0,0,238,0,0,0,0,0,0,0,300,5.1,5,5,800.0,77777,9,999999999,3,0.1150,0,88,0.097,0.0,0.0 +2008,3,11,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-11.7,48,102662,86,446,236,23,153,13,2667,0,1509,472,290,6.2,3,3,800.0,77777,9,999999999,3,0.1150,0,88,0.097,0.0,0.0 +2008,3,11,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-11.7,48,102662,341,1386,236,150,476,41,17807,14438,4876,1698,290,6.2,3,3,800.0,77777,9,999999999,3,0.1150,0,88,0.097,0.0,0.0 +2008,3,11,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-13.3,38,102642,569,1386,239,329,741,68,39667,40944,8218,3087,310,6.7,3,3,800.0,77777,9,999999999,3,0.1150,0,88,0.097,0.0,0.0 +2008,3,11,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-13.3,35,102592,753,1386,243,505,861,84,61965,53979,10336,4096,290,5.7,3,3,800.0,77777,9,999999999,3,0.1150,0,88,0.097,0.0,0.0 +2008,3,11,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-13.3,35,102592,880,1386,243,642,923,92,67137,92044,13019,2059,290,5.7,3,3,800.0,77777,9,999999999,3,0.1150,0,88,0.097,0.0,0.0 +2008,3,11,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-12.8,32,102433,943,1386,253,726,946,99,75781,94674,13803,2302,300,6.2,5,5,800.0,77777,9,999999999,3,0.1150,0,88,0.097,0.0,0.0 +2008,3,11,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-13.9,28,102313,937,1386,250,711,844,135,86664,59390,16519,6728,280,3.6,3,3,800.0,77777,9,999999999,3,0.1150,0,88,0.097,0.0,0.0 +2008,3,11,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-13.9,28,102313,862,1386,240,677,849,125,82061,58844,15207,6103,280,3.6,0,0,800.0,77777,9,999999999,3,0.1150,0,88,0.097,0.0,0.0 +2008,3,11,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-14.4,23,102153,723,1386,258,617,915,87,75146,57561,10626,4168,300,4.6,3,3,800.0,77777,9,999999999,2,0.1150,0,88,0.097,0.0,0.0 +2008,3,11,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-14.4,23,102113,531,1386,258,468,833,83,55137,47496,9807,3573,280,5.1,3,3,800.0,77777,9,999999999,2,0.1150,0,88,0.097,0.0,0.0 +2008,3,11,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-14.4,23,102113,297,1386,262,285,676,69,32029,24019,7779,2453,280,5.1,5,5,800.0,77777,9,999999999,2,0.1150,0,88,0.097,0.0,0.0 +2008,3,11,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-15.0,23,102123,38,1386,257,106,337,36,10790,0,3682,533,290,4.6,5,5,800.0,77777,9,999999999,2,0.1150,0,88,0.097,0.0,0.0 +2008,3,11,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-15.0,24,102173,0,199,255,0,0,0,0,0,0,0,320,4.6,5,5,800.0,77777,9,999999999,2,0.1150,0,88,0.097,0.0,0.0 +2008,3,11,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-15.0,24,102173,0,0,251,0,0,0,0,0,0,0,320,4.6,3,3,800.0,77777,9,999999999,2,0.1150,0,88,0.097,0.0,0.0 +2008,3,11,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-15.6,24,102223,0,0,246,0,0,0,0,0,0,0,310,5.1,3,3,800.0,77777,9,999999999,2,0.1150,0,88,0.097,0.0,0.0 +2008,3,11,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-15.0,26,102203,0,0,247,0,0,0,0,0,0,0,290,4.1,3,3,800.0,77777,9,999999999,2,0.1150,0,88,0.097,0.0,0.0 +2008,3,11,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-15.0,26,102203,0,0,247,0,0,0,0,0,0,0,290,4.1,3,3,800.0,77777,9,999999999,2,0.1150,0,88,0.097,0.0,0.0 +2008,3,11,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-12.8,35,102163,0,0,235,0,0,0,0,0,0,0,290,4.1,0,0,800.0,77777,9,999999999,3,0.1150,0,88,0.097,0.0,0.0 +2008,3,12,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-12.2,38,102173,0,0,234,0,0,0,0,0,0,0,290,5.1,0,0,800.0,77777,9,999999999,3,0.1160,0,88,0.097,0.0,0.0 +2008,3,12,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-12.2,38,102173,0,0,234,0,0,0,0,0,0,0,290,5.1,0,0,800.0,77777,9,999999999,3,0.1160,0,88,0.097,0.0,0.0 +2008,3,12,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-13.3,36,102083,0,0,240,0,0,0,0,0,0,0,290,4.1,3,3,800.0,77777,9,999999999,3,0.1160,0,88,0.097,0.0,0.0 +2008,3,12,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-13.3,38,102082,0,0,239,0,0,0,0,0,0,0,300,4.1,3,3,800.0,77777,9,999999999,3,0.1160,0,88,0.097,0.0,0.0 +2008,3,12,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-13.3,38,102082,0,0,239,0,0,0,0,0,0,0,300,4.1,3,3,800.0,77777,9,999999999,3,0.1160,0,88,0.097,0.0,0.0 +2008,3,12,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-13.3,40,102132,0,0,237,0,0,0,0,0,0,0,300,3.6,3,3,800.0,77777,9,999999999,3,0.1160,0,88,0.097,0.0,0.0 +2008,3,12,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-13.3,40,102142,93,485,227,25,154,14,2898,0,1625,510,310,4.1,0,0,800.0,77777,9,999999999,3,0.1160,0,88,0.097,0.0,0.0 +2008,3,12,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-13.3,40,102142,349,1385,237,154,475,43,18257,15272,5107,1781,310,4.1,3,3,800.0,77777,9,999999999,3,0.1160,0,88,0.097,0.0,0.0 +2008,3,12,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-15.0,28,102093,576,1385,243,336,743,70,40490,41723,8456,3181,270,4.1,3,3,800.0,77777,9,999999999,2,0.1160,0,88,0.097,0.0,0.0 +2008,3,12,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-15.0,26,102003,760,1385,237,513,865,85,62978,54603,10464,4154,300,4.6,0,0,800.0,77777,9,999999999,2,0.1160,0,88,0.097,0.0,0.0 +2008,3,12,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-15.0,26,102003,887,1385,237,651,928,91,68053,92539,12869,2075,300,4.6,0,0,800.0,77777,9,999999999,2,0.1160,0,88,0.097,0.0,0.0 +2008,3,12,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-15.0,23,101813,950,1385,242,733,950,98,76462,95038,13653,2322,286,2.1,0,0,800.0,77777,9,999999999,2,0.1160,0,88,0.097,0.0,0.0 +2008,3,12,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-13.3,24,101714,943,1385,261,753,943,104,78465,94315,14458,2329,270,2.6,3,3,800.0,77777,9,999999999,3,0.1160,0,88,0.097,0.0,0.0 +2008,3,12,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-13.3,24,101714,868,1385,261,713,922,105,87644,61317,12949,5252,270,2.6,3,3,800.0,77777,9,999999999,3,0.1160,0,88,0.097,0.0,0.0 +2008,3,12,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-13.3,21,101514,729,1385,267,611,868,105,73431,57104,12661,4925,270,4.1,3,3,800.0,77777,9,999999999,3,0.1160,0,88,0.097,0.0,0.0 +2008,3,12,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-13.3,21,101434,536,1385,267,464,796,93,54244,47228,10907,3940,220,3.1,3,3,800.0,77777,9,999999999,3,0.1160,0,88,0.097,0.0,0.0 +2008,3,12,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-13.3,21,101434,302,1385,267,285,663,72,31973,24646,8103,2548,220,3.1,3,3,800.0,77777,9,999999999,3,0.1160,0,88,0.097,0.0,0.0 +2008,3,12,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-12.8,23,101304,43,1385,266,106,328,37,10826,0,3797,585,250,5.1,3,3,800.0,77777,9,999999999,3,0.1160,0,88,0.097,0.0,0.0 +2008,3,12,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-11.1,29,101244,0,226,263,0,0,0,0,0,0,0,220,2.1,3,3,800.0,77777,9,999999999,3,0.1160,0,88,0.097,0.0,0.0 +2008,3,12,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-11.1,29,101244,0,0,263,0,0,0,0,0,0,0,220,2.1,3,3,800.0,77777,9,999999999,3,0.1160,0,88,0.097,0.0,0.0 +2008,3,12,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-5.0,54,101214,0,0,285,0,0,0,0,0,0,0,210,5.7,9,9,800.0,7620,9,999999999,6,0.1160,0,88,0.097,0.0,0.0 +2008,3,12,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-3.9,62,101154,0,0,284,0,0,0,0,0,0,0,230,6.7,9,9,800.0,7620,9,999999999,7,0.1160,0,88,0.097,0.0,0.0 +2008,3,12,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.2,-3.9,62,101154,0,0,284,0,0,0,0,0,0,0,230,6.7,9,9,800.0,7620,9,999999999,7,0.1160,0,88,0.097,0.0,0.0 +2008,3,12,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-2.8,70,101004,0,0,283,0,0,0,0,0,0,0,210,5.1,9,9,800.0,7620,9,999999999,8,0.1160,0,88,0.097,0.0,0.0 +2008,3,13,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-1.7,77,100934,0,0,284,0,0,0,0,0,0,0,210,4.1,9,9,800.0,7620,9,999999999,8,0.1170,0,88,0.097,0.0,0.0 +2008,3,13,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.7,-1.7,77,100934,0,0,292,0,0,0,0,0,0,0,210,4.1,10,10,800.0,7620,9,999999999,8,0.1170,0,88,0.097,0.0,0.0 +2008,3,13,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-1.1,78,100714,0,0,295,0,0,0,0,0,0,0,200,3.6,10,10,800.0,4267,9,999999999,9,0.1170,0,88,0.097,0.0,0.0 +2008,3,13,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-1.1,78,100614,0,0,295,0,0,0,0,0,0,0,200,4.1,10,10,800.0,3353,9,999999999,9,0.1170,0,88,0.097,0.0,0.0 +2008,3,13,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.2,-1.1,78,100614,0,0,295,0,0,0,0,0,0,0,200,4.1,10,10,800.0,3353,9,999999999,9,0.1170,0,88,0.097,0.0,0.0 +2008,3,13,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,0.0,85,100424,0,0,288,0,0,0,0,0,0,0,170,3.1,9,9,800.0,427,9,999999999,10,0.1170,0,88,0.097,0.0,0.0 +2008,3,13,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.0,0.0,87,101279,101,524,295,1,0,1,97,0,98,42,160,4.1,10,10,9656.0,1524,0,919999999,10,0.1170,0,88,0.097,0.0,0.0 +2008,3,13,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,2.8,0.6,85,100344,356,1384,299,28,0,28,2776,0,2797,1220,180,3.6,10,10,8000.0,1524,0,919999999,10,0.1170,0,88,0.097,0.0,0.0 +2008,3,13,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.0,2.0,93,101279,583,1384,302,27,0,27,2726,0,2749,1324,180,4.6,10,10,3219.0,549,0,919999999,12,0.1170,0,88,0.097,0.0,0.0 +2008,3,13,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,4.0,2.0,87,101279,767,1384,306,86,0,86,8815,0,8892,4211,180,4.1,10,10,4023.0,610,0,919999999,12,0.1170,0,88,0.097,0.0,0.0 +2008,3,13,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,4.4,2.8,89,100124,894,1384,309,66,0,66,6833,0,6895,3469,200,4.1,10,10,4000.0,610,0,919999999,13,0.1170,0,88,0.097,0.0,0.0 +2008,3,13,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,5.0,3.0,87,101279,956,1384,311,64,0,64,6659,0,6720,3433,200,3.6,10,10,9656.0,457,0,919999999,13,0.1170,0,88,0.097,0.0,0.0 +2008,3,13,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,4.0,2.0,87,101279,949,1384,306,66,0,66,6865,0,6929,3527,340,5.7,10,10,8047.0,457,0,919999999,12,0.1170,0,88,0.097,0.0,0.0 +2008,3,13,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,2.8,2.2,96,99984,874,1384,301,232,33,211,26984,2561,24665,9399,320,5.7,10,10,8000.0,457,0,919999999,12,0.1170,0,88,0.097,0.0,0.0 +2008,3,13,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.0,4.0,87,101279,735,1384,317,309,102,250,34594,8695,28144,9487,310,5.1,10,10,8000.0,762,0,919999999,15,0.1170,0,88,0.097,0.0,0.0 +2008,3,13,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.0,2.0,93,101279,542,1384,293,317,318,179,35098,23867,19916,6309,320,6.7,9,9,3219.0,671,0,919999999,12,0.1170,0,88,0.097,0.0,0.0 +2008,3,13,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.6,3.9,89,100005,308,1384,306,194,316,111,20956,15360,12043,3320,310,5.7,9,9,3219.0,671,0,919999999,14,0.1170,0,88,0.097,0.0,0.0 +2008,3,13,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-3.9,51,100244,49,1384,279,100,229,50,9982,1018,5019,448,300,7.7,5,5,3219.0,77777,0,919999999,7,0.1170,0,88,0.097,0.0,0.0 +2008,3,13,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-3.3,57,100414,0,253,275,0,0,0,0,0,0,0,310,9.8,5,5,3219.0,77777,0,919999999,7,0.1170,0,88,0.097,0.0,0.0 +2008,3,13,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-3.3,57,100414,0,0,271,0,0,0,0,0,0,0,310,9.8,3,3,3219.0,77777,9,999999999,7,0.1170,0,88,0.097,4.8,0.0 +2008,3,13,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-5.6,51,100714,0,0,265,0,0,0,0,0,0,0,310,7.2,3,3,3219.0,77777,9,999999999,6,0.1170,0,88,0.097,0.0,0.0 +2008,3,13,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-5.6,53,100814,0,0,262,0,0,0,0,0,0,0,300,5.1,3,3,3219.0,77777,9,999999999,6,0.1170,0,88,0.097,0.0,0.0 +2008,3,13,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-5.6,53,100814,0,0,262,0,0,0,0,0,0,0,300,5.1,3,3,3219.0,77777,9,999999999,6,0.1170,0,88,0.097,0.0,0.0 +2008,3,13,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-7.2,50,100973,0,0,257,0,0,0,0,0,0,0,310,7.2,3,3,3219.0,77777,9,999999999,5,0.1170,0,88,0.097,0.0,0.0 +2008,3,14,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-7.8,49,101063,0,0,254,0,0,0,0,0,0,0,310,6.7,3,3,3219.0,77777,9,999999999,5,0.1180,0,88,0.097,0.0,0.0 +2008,3,14,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-7.8,49,101063,0,0,254,0,0,0,0,0,0,0,310,6.7,3,3,3219.0,77777,9,999999999,5,0.1180,0,88,0.097,0.0,0.0 +2008,3,14,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-8.3,52,101183,0,0,239,0,0,0,0,0,0,0,310,4.1,0,0,3219.0,77777,9,999999999,4,0.1180,0,88,0.097,0.0,0.0 +2008,3,14,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-8.9,51,101283,0,0,237,0,0,0,0,0,0,0,320,4.6,0,0,3219.0,77777,9,999999999,4,0.1180,0,88,0.097,0.0,0.0 +2008,3,14,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-8.9,51,101283,0,0,265,0,0,0,0,0,0,0,320,4.6,9,9,3219.0,77777,9,999999999,4,0.1180,0,88,0.097,0.0,0.0 +2008,3,14,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-11.1,44,101473,0,0,261,0,0,0,0,0,0,0,320,6.7,9,9,3219.0,7620,9,999999999,3,0.1180,0,88,0.097,0.0,0.0 +2008,3,14,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-13.3,36,101543,108,563,259,14,0,14,1363,0,1372,523,340,5.7,9,9,3219.0,7620,9,999999999,3,0.1180,0,88,0.097,0.0,0.0 +2008,3,14,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-1.7,-13.3,36,101543,364,1383,259,94,97,68,10797,4073,7833,2637,340,5.7,9,9,3219.0,7620,9,999999999,3,0.1180,0,88,0.097,0.0,0.0 +2008,3,14,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-15.0,28,101653,591,1383,261,227,225,136,26056,15726,15673,5534,340,4.6,9,9,3219.0,7620,9,999999999,2,0.1180,0,88,0.097,0.0,0.0 +2008,3,14,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-16.1,23,101643,774,1383,265,487,727,99,59258,47644,12084,4787,340,2.6,9,9,3219.0,7620,9,999999999,2,0.1180,0,88,0.097,0.0,0.0 +2008,3,14,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.6,-16.1,23,101643,901,1383,250,655,923,89,68490,92113,12571,2103,340,2.6,5,5,3219.0,7620,9,999999999,2,0.1180,0,88,0.097,0.0,0.0 +2008,3,14,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-11.7,32,101553,962,1383,258,738,947,95,77173,94958,13230,2350,140,3.6,5,5,3219.0,77777,9,999999999,3,0.1180,0,88,0.097,0.0,0.0 +2008,3,14,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-11.1,32,101474,955,1383,263,758,942,101,79142,94398,14034,2366,130,4.1,5,5,3219.0,77777,9,999999999,3,0.1180,0,88,0.097,0.0,0.0 +2008,3,14,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-11.1,32,101474,880,1383,279,610,600,205,71371,47809,24102,9230,130,4.1,9,9,3219.0,77777,9,999999999,3,0.1180,0,88,0.097,0.0,0.0 +2008,3,14,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-10.0,36,101314,740,1383,262,543,640,172,62914,48740,20018,7401,120,7.2,5,5,3219.0,77777,9,999999999,4,0.1180,0,88,0.097,0.0,0.0 +2008,3,14,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-7.2,48,101263,547,1383,263,417,567,154,46903,40817,17398,5790,110,7.7,5,5,3219.0,77777,9,999999999,5,0.1180,0,88,0.097,0.0,0.0 +2008,3,14,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-7.2,48,101263,313,1383,263,236,332,118,25481,18104,12797,3453,110,7.7,5,5,3219.0,77777,9,999999999,5,0.1180,0,88,0.097,0.0,0.0 +2008,3,14,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-6.7,48,101234,54,1383,281,70,62,56,6959,782,5599,403,140,7.2,9,9,3219.0,7620,9,999999999,5,0.1180,0,88,0.097,0.0,0.0 +2008,3,14,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-7.2,44,101224,0,280,291,0,0,0,0,0,0,0,170,7.7,10,10,3219.0,2286,9,999999999,5,0.1180,0,88,0.097,0.0,0.0 +2008,3,14,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,-7.2,44,101224,0,0,267,0,0,0,0,0,0,0,170,7.7,5,5,3219.0,2286,9,999999999,5,0.1180,0,88,0.097,0.0,0.0 +2008,3,14,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-5.6,55,101353,0,0,264,0,0,0,0,0,0,0,190,4.1,5,5,3219.0,77777,9,999999999,6,0.1180,0,88,0.097,0.0,0.0 +2008,3,14,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-4.4,64,101343,0,0,259,0,0,0,0,0,0,0,170,3.1,3,3,3219.0,77777,9,999999999,6,0.1180,0,88,0.097,0.0,0.0 +2008,3,14,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-4.4,64,101343,0,0,279,0,0,0,0,0,0,0,170,3.1,9,9,3219.0,77777,9,999999999,6,0.1180,0,88,0.097,0.0,0.0 +2008,3,14,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.0,-4.0,67,101278,0,0,279,0,0,0,0,0,0,0,180,2.6,9,9,3219.0,792,9,999999999,7,0.1180,0,88,0.097,0.0,0.0 +2008,3,15,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.0,-4.0,67,101278,0,0,287,0,0,0,0,0,0,0,170,2.1,10,10,3219.0,2438,9,999999999,7,0.1190,0,88,0.097,0.0,0.0 +2008,3,15,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.6,-3.3,73,101273,0,0,286,0,0,0,0,0,0,0,170,2.1,10,10,3219.0,2438,9,999999999,7,0.1190,0,88,0.097,0.0,0.0 +2008,3,15,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-2.2,74,101183,0,0,292,0,0,0,0,0,0,0,160,2.1,10,10,3219.0,701,9,999999999,8,0.1190,0,88,0.097,0.0,0.0 +2008,3,15,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-2.2,74,101193,0,0,292,0,0,0,0,0,0,0,160,2.1,10,10,3219.0,701,9,999999999,8,0.1190,0,88,0.097,0.0,0.0 +2008,3,15,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.7,-2.2,74,101193,0,0,292,0,0,0,0,0,0,0,160,2.1,10,10,3219.0,701,9,999999999,8,0.1190,0,88,0.097,0.0,0.0 +2008,3,15,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-1.7,80,101113,0,0,282,0,0,0,0,0,0,0,190,2.6,9,9,3219.0,3658,9,999999999,8,0.1190,0,88,0.097,0.0,0.0 +2008,3,15,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-1.1,78,101144,116,602,295,13,0,13,1263,0,1272,496,220,1.5,10,10,3219.0,3658,9,999999999,9,0.1190,0,88,0.097,0.0,0.0 +2008,3,15,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.2,-1.1,78,101144,371,1383,295,58,1,58,6748,37,6764,2338,220,1.5,10,10,3219.0,3658,9,999999999,9,0.1190,0,88,0.097,0.0,0.0 +2008,3,15,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,1.1,73,101174,598,1383,312,162,55,140,18529,3724,16079,5690,240,4.1,10,10,3219.0,7620,9,999999999,11,0.1190,0,88,0.097,0.0,0.0 +2008,3,15,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,1.1,67,101124,781,1383,317,301,148,225,34307,12055,25778,9243,222,0.0,10,10,3219.0,2438,9,999999999,11,0.1190,0,88,0.097,0.0,0.0 +2008,3,15,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.7,1.1,67,101124,907,1383,317,458,316,254,52803,26240,29444,10981,232,0.0,10,10,3219.0,2438,9,999999999,11,0.1190,0,88,0.097,0.0,0.0 +2008,3,15,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,-0.6,47,101025,969,1383,330,361,161,253,42053,13221,29633,11344,310,1.5,10,10,3219.0,2438,9,999999999,9,0.1190,0,88,0.097,0.0,0.0 +2008,3,15,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,2.8,71,100955,961,1383,324,301,122,216,35426,9350,25551,10031,100,4.1,10,10,3219.0,2438,9,999999999,13,0.1190,0,88,0.097,0.0,0.0 +2008,3,15,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.8,2.8,71,100955,885,1383,324,222,31,201,25967,2352,23626,9124,100,4.1,10,10,3219.0,2438,9,999999999,13,0.1190,0,88,0.097,0.0,0.0 +2008,3,15,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,2.8,71,100915,746,1383,324,337,174,237,37992,14507,26862,9287,90,4.1,10,10,3219.0,2743,9,999999999,13,0.1190,0,88,0.097,0.0,0.0 +2008,3,15,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,1.7,70,100894,552,1383,309,218,70,176,24234,5217,19659,6335,100,4.1,9,9,3219.0,2438,9,999999999,12,0.1190,0,88,0.097,0.0,0.0 +2008,3,15,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.7,1.7,70,100894,318,1383,318,85,1,84,9439,40,9362,2898,100,4.1,10,10,3219.0,2438,9,999999999,12,0.1190,0,88,0.097,0.0,0.0 +2008,3,15,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,2.2,82,100954,59,1383,311,27,0,27,2609,0,2626,702,60,2.1,10,10,3219.0,2438,9,999999999,12,0.1190,0,88,0.097,0.0,0.0 +2008,3,15,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,1.7,79,100934,0,307,310,0,0,0,0,0,0,0,50,3.1,10,10,3219.0,1676,9,999999999,12,0.1190,0,88,0.097,0.0,0.0 +2008,3,15,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.0,1.7,79,100934,0,0,310,0,0,0,0,0,0,0,50,3.1,10,10,3219.0,1676,0,919999999,12,0.1190,0,88,0.097,0.0,0.0 +2008,3,15,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,2.8,89,100904,0,0,309,0,0,0,0,0,0,0,90,3.6,10,10,3219.0,2896,0,919999999,13,0.1190,0,88,0.097,3.8,0.0 +2008,3,15,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.0,3.0,93,101279,0,0,307,0,0,0,0,0,0,0,60,3.1,10,10,3219.0,183,0,919999999,13,0.1190,0,88,0.097,0.0,0.0 +2008,3,15,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,4.4,2.8,89,100904,0,0,300,0,0,0,0,0,0,0,70,3.1,9,9,3219.0,183,0,919999999,13,0.1190,0,88,0.097,0.0,0.0 +2008,3,15,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.0,3.0,93,101279,0,0,299,0,0,0,0,0,0,0,50,4.6,9,9,3219.0,183,0,919999999,13,0.1190,0,88,0.097,0.0,0.0 +2008,3,16,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,2.2,89,100664,0,0,306,0,0,0,0,0,0,0,60,5.7,10,10,3219.0,6096,0,919999999,12,0.1200,0,88,0.097,0.0,0.0 +2008,3,16,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.9,2.2,89,100664,0,0,306,0,0,0,0,0,0,0,60,5.7,10,10,3219.0,6096,0,919999999,12,0.1200,0,88,0.097,0.0,0.0 +2008,3,16,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,2.2,86,100464,0,0,308,0,0,0,0,0,0,0,70,6.2,10,10,3219.0,213,0,919999999,12,0.1200,0,88,0.097,0.0,0.0 +2008,3,16,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,2.2,89,100444,0,0,306,0,0,0,0,0,0,0,60,6.7,10,10,3219.0,152,0,919999999,12,0.1200,0,88,0.097,0.0,0.0 +2008,3,16,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.9,2.2,89,100444,0,0,306,0,0,0,0,0,0,0,60,6.7,10,10,3219.0,152,0,919999999,12,0.1200,0,88,0.097,0.0,0.0 +2008,3,16,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.9,2.2,89,100434,0,0,306,0,0,0,0,0,0,0,40,7.2,10,10,8047.0,274,0,919999999,12,0.1200,0,88,0.097,0.0,0.0 +2008,3,16,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.0,2.0,93,101279,124,641,302,2,0,2,194,0,196,84,30,7.2,10,10,9656.0,335,0,919999999,12,0.1200,0,88,0.097,0.0,0.0 +2008,3,16,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,2.8,1.1,89,100444,378,1382,300,6,0,6,596,0,600,281,20,9.3,10,10,4800.0,335,0,919099999,11,0.1200,0,88,0.097,0.0,0.0 +2008,3,16,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.0,1.0,93,101279,605,1382,296,28,0,28,2834,0,2857,1384,20,8.2,10,10,4023.0,244,0,919099999,11,0.1200,0,88,0.097,0.0,0.0 +2008,3,16,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.0,1.0,93,101279,788,1382,296,65,0,65,6677,0,6736,3294,20,9.3,10,10,4828.0,244,0,919099999,11,0.1200,0,88,0.097,0.0,0.0 +2008,3,16,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,2.2,1.1,92,100554,914,1382,297,219,41,192,25838,3070,22761,8939,20,9.3,10,10,8000.0,244,0,919099999,11,0.1200,0,88,0.097,0.0,0.0 +2008,3,16,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.0,2.0,93,101279,975,1382,302,171,4,168,20568,283,20297,8235,20,9.3,10,10,8000.0,366,0,919099999,12,0.1200,0,88,0.097,0.0,0.0 +2008,3,16,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,1.7,92,100584,967,1382,300,142,2,141,17289,136,17237,7072,30,9.8,10,10,8000.0,366,0,919099999,12,0.1200,0,88,0.097,0.0,0.0 +2008,3,16,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,1.7,92,100584,891,1382,300,74,0,74,7663,0,7733,3857,30,9.8,10,10,8000.0,366,0,919099999,12,0.1200,0,88,0.097,0.0,0.0 +2008,3,16,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,2.2,96,100954,751,1382,301,59,0,59,6040,0,6093,2968,10,6.2,10,10,8000.0,366,0,919099999,12,0.1200,0,88,0.097,0.0,0.0 +2008,3,16,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,2.2,96,100924,558,1382,301,64,0,64,6449,0,6502,2910,20,6.2,10,10,8000.0,366,0,919099999,12,0.1200,0,88,0.097,0.0,0.0 +2008,3,16,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,2.2,96,100924,323,1382,301,49,0,49,4842,0,4878,1945,20,6.2,10,10,8000.0,366,0,919099999,12,0.1200,0,88,0.097,0.0,0.0 +2008,3,16,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-0.6,78,100884,64,1382,298,20,0,20,1935,0,1948,616,50,5.7,10,10,8000.0,640,0,919099999,9,0.1200,0,88,0.097,0.0,0.0 +2008,3,16,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-1.1,75,100954,0,334,297,0,0,0,0,0,0,0,40,5.1,10,10,8000.0,579,0,919099999,9,0.1200,0,88,0.097,0.0,0.0 +2008,3,16,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,-1.1,75,100954,0,0,297,0,0,0,0,0,0,0,40,5.1,10,10,8000.0,579,9,999999999,9,0.1200,0,88,0.097,0.0,0.0 +2008,3,16,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-1.1,78,101104,0,0,295,0,0,0,0,0,0,0,40,4.6,10,10,8000.0,518,9,999999999,9,0.1200,0,88,0.097,0.0,0.0 +2008,3,16,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-1.1,78,101194,0,0,295,0,0,0,0,0,0,0,20,3.6,10,10,8000.0,518,9,999999999,9,0.1200,0,88,0.097,0.0,0.0 +2008,3,16,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.2,-1.1,78,101194,0,0,295,0,0,0,0,0,0,0,20,3.6,10,10,8000.0,518,9,999999999,9,0.1200,0,88,0.097,0.0,0.0 +2008,3,16,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-0.6,81,101144,0,0,295,0,0,0,0,0,0,0,20,2.1,10,10,8000.0,457,9,999999999,9,0.1200,0,88,0.097,4.0,0.0 +2008,3,17,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-0.6,81,101084,0,0,295,0,0,0,0,0,0,0,30,3.6,10,10,8000.0,457,9,999999999,9,0.1210,0,88,0.097,0.1,0.0 +2008,3,17,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.2,-0.6,81,101084,0,0,295,0,0,0,0,0,0,0,30,3.6,10,10,8000.0,457,9,999999999,9,0.1210,0,88,0.097,0.0,0.0 +2008,3,17,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-0.6,81,101114,0,0,295,0,0,0,0,0,0,0,50,2.6,10,10,8000.0,488,9,999999999,9,0.1210,0,88,0.097,0.0,0.0 +2008,3,17,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-0.6,81,101124,0,0,295,0,0,0,0,0,0,0,30,4.6,10,10,8000.0,488,9,999999999,9,0.1210,0,88,0.097,0.0,0.0 +2008,3,17,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.2,-0.6,81,101124,0,0,295,0,0,0,0,0,0,0,30,4.6,10,10,8000.0,488,9,999999999,9,0.1210,0,88,0.097,0.0,0.0 +2008,3,17,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-0.6,81,101144,0,0,295,0,0,0,0,0,0,0,50,3.6,10,10,8000.0,488,9,999999999,9,0.1210,0,88,0.097,0.0,0.0 +2008,3,17,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-0.6,78,101204,131,681,298,14,0,14,1362,0,1372,540,20,4.1,10,10,8000.0,488,9,999999999,9,0.1210,0,88,0.097,0.0,0.0 +2008,3,17,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,-0.6,78,101204,386,1381,298,12,0,12,1193,0,1202,556,20,4.1,10,10,8000.0,488,9,999999999,9,0.1210,0,88,0.097,0.0,0.0 +2008,3,17,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-0.6,78,101264,612,1381,298,31,0,31,3141,0,3167,1530,360,3.6,10,10,8000.0,549,9,999999999,9,0.1210,0,88,0.097,0.0,0.0 +2008,3,17,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-1.1,72,101304,795,1381,300,87,0,87,8948,0,9026,4311,360,3.1,10,10,8000.0,549,9,999999999,9,0.1210,0,88,0.097,0.0,0.0 +2008,3,17,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,-1.1,72,101304,920,1381,300,129,1,128,15724,67,15661,6390,360,3.1,10,10,8000.0,549,9,999999999,9,0.1210,0,88,0.097,0.0,0.0 +2008,3,17,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-0.6,75,101374,981,1381,300,96,0,96,10021,0,10115,5043,30,2.6,10,10,8000.0,549,9,999999999,9,0.1210,0,88,0.097,0.0,0.0 +2008,3,17,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,0.0,79,101354,973,1381,301,167,4,164,20131,284,19856,8066,70,2.6,10,10,8000.0,792,0,919999999,10,0.1210,0,88,0.097,0.0,0.0 +2008,3,17,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,0.0,79,101354,897,1381,301,195,5,192,22954,377,22708,8863,70,2.6,10,10,8000.0,792,0,919999999,10,0.1210,0,88,0.097,0.0,0.0 +2008,3,17,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.0,1.0,81,101279,757,1381,305,185,4,182,21359,301,21111,7815,40,2.1,10,10,8000.0,1524,0,919999999,11,0.1210,0,88,0.097,0.0,0.0 +2008,3,17,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,1.1,82,101404,563,1381,305,203,42,182,22564,3192,20328,6549,90,3.6,10,10,8000.0,2438,0,919999999,11,0.1210,0,88,0.097,0.0,0.0 +2008,3,17,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.9,1.1,82,101404,328,1381,305,86,30,71,9717,1102,8048,2617,90,3.6,10,10,8000.0,2438,0,919999999,11,0.1210,0,88,0.097,0.0,0.0 +2008,3,17,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,0.6,89,101573,69,1381,288,15,0,15,1451,0,1461,511,110,2.1,9,9,8000.0,2591,0,919999999,11,0.1210,0,88,0.097,0.0,0.0 +2008,3,17,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,0.6,85,101643,0,360,299,0,0,0,0,0,0,0,333,0.0,10,10,8000.0,2743,0,919999999,11,0.1210,0,88,0.097,0.0,0.0 +2008,3,17,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,0.6,85,101643,0,0,299,0,0,0,0,0,0,0,329,0.0,10,10,8000.0,2743,9,999999999,11,0.1210,0,88,0.097,0.0,0.0 +2008,3,17,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-2.8,60,101824,0,0,300,0,0,0,0,0,0,0,330,6.7,10,10,8000.0,2743,9,999999999,8,0.1210,0,88,0.097,0.0,0.0 +2008,3,17,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-4.4,55,101873,0,0,296,0,0,0,0,0,0,0,330,7.2,10,10,8000.0,2743,9,999999999,6,0.1210,0,88,0.097,0.0,0.0 +2008,3,17,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,-4.4,55,101873,0,0,296,0,0,0,0,0,0,0,330,7.2,10,10,8000.0,2743,9,999999999,6,0.1210,0,88,0.097,0.0,0.0 +2008,3,17,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-6.7,52,101993,0,0,276,0,0,0,0,0,0,0,320,7.7,9,9,8000.0,2743,9,999999999,5,0.1210,0,88,0.097,0.0,0.0 +2008,3,18,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-7.2,52,102063,0,0,255,0,0,0,0,0,0,0,320,6.2,3,3,8000.0,77777,9,999999999,5,0.1220,0,88,0.097,0.0,0.0 +2008,3,18,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-7.2,52,102063,0,0,255,0,0,0,0,0,0,0,320,6.2,3,3,8000.0,77777,9,999999999,5,0.1220,0,88,0.097,0.0,0.0 +2008,3,18,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-7.2,54,102193,0,0,252,0,0,0,0,0,0,0,320,7.7,3,3,8000.0,77777,9,999999999,5,0.1220,0,88,0.097,0.0,0.0 +2008,3,18,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-8.3,49,102313,0,0,278,0,0,0,0,0,0,0,320,7.7,10,10,8000.0,2134,9,999999999,4,0.1220,0,88,0.097,0.0,0.0 +2008,3,18,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.0,-8.3,49,102313,0,0,255,0,0,0,0,0,0,0,320,7.7,5,5,8000.0,2134,9,999999999,4,0.1220,0,88,0.097,0.0,0.0 +2008,3,18,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-9.4,52,102562,0,0,244,0,0,0,0,0,0,0,330,8.2,3,3,8000.0,77777,9,999999999,4,0.1220,0,88,0.097,0.0,0.0 +2008,3,18,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-10.6,46,102692,139,720,243,39,200,17,4582,0,1999,646,320,10.8,3,3,8000.0,77777,9,999999999,4,0.1220,0,88,0.097,0.0,0.0 +2008,3,18,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-10.6,46,102692,393,1380,233,179,508,44,21443,18917,5280,1881,320,10.8,0,0,8000.0,77777,9,999999999,4,0.1220,0,88,0.097,0.0,0.0 +2008,3,18,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-10.0,43,102832,619,1380,239,370,777,69,45006,44231,8413,3221,320,9.3,0,0,8000.0,77777,9,999999999,4,0.1220,0,88,0.097,0.0,0.0 +2008,3,18,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-10.0,39,102843,801,1380,243,547,887,81,57498,88117,11691,1811,330,5.7,0,0,8000.0,77777,9,999999999,4,0.1220,0,88,0.097,0.0,0.0 +2008,3,18,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-10.0,39,102843,927,1380,243,685,940,89,71835,94212,12515,2187,330,5.7,0,0,8000.0,77777,9,999999999,4,0.1220,0,88,0.097,0.0,0.0 +2008,3,18,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-9.4,35,102823,988,1380,252,770,969,92,80699,97424,12776,2423,320,7.7,0,0,8000.0,77777,9,999999999,4,0.1220,0,88,0.097,0.0,0.0 +2008,3,18,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-9.4,33,102753,979,1380,256,794,979,92,83214,98391,12795,2391,340,6.2,0,0,8000.0,77777,9,999999999,4,0.1220,0,88,0.097,0.0,0.0 +2008,3,18,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-9.4,33,102753,902,1380,256,755,968,91,79147,96884,12835,2128,340,6.2,0,0,8000.0,77777,9,999999999,4,0.1220,0,88,0.097,0.0,0.0 +2008,3,18,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-10.6,26,102774,762,1380,261,657,939,86,68893,92807,12448,1740,320,6.7,0,0,8000.0,77777,9,999999999,3,0.1220,0,88,0.097,0.0,0.0 +2008,3,18,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-11.1,25,102774,568,1380,260,508,878,78,60613,50139,9332,3481,340,6.2,0,0,8000.0,77777,9,999999999,3,0.1220,0,88,0.097,0.0,0.0 +2008,3,18,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-11.1,25,102774,334,1380,260,323,753,65,36905,28453,7448,2465,340,6.2,0,0,8000.0,77777,9,999999999,3,0.1220,0,88,0.097,0.0,0.0 +2008,3,18,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-12.2,24,102903,75,1380,255,133,467,39,13953,0,4108,880,330,6.2,0,0,8000.0,77777,9,999999999,3,0.1220,0,88,0.097,0.0,0.0 +2008,3,18,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-12.8,24,103003,0,387,252,0,0,0,0,0,0,0,330,5.7,0,0,8000.0,77777,9,999999999,3,0.1220,0,88,0.097,0.0,0.0 +2008,3,18,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-12.8,24,103003,0,0,252,0,0,0,0,0,0,0,330,5.7,0,0,8000.0,77777,9,999999999,3,0.1220,0,88,0.097,0.0,0.0 +2008,3,18,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-12.8,27,103043,0,0,247,0,0,0,0,0,0,0,340,5.7,0,0,8000.0,77777,9,999999999,3,0.1220,0,88,0.097,0.0,0.0 +2008,3,18,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-11.7,32,103103,0,0,244,0,0,0,0,0,0,0,340,5.1,0,0,8000.0,77777,9,999999999,3,0.1220,0,88,0.097,0.0,0.0 +2008,3,18,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-11.7,32,103103,0,0,244,0,0,0,0,0,0,0,340,5.1,0,0,8000.0,77777,9,999999999,3,0.1220,0,88,0.097,0.0,0.0 +2008,3,18,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-11.7,37,103072,0,0,238,0,0,0,0,0,0,0,340,3.6,0,0,8000.0,77777,9,999999999,3,0.1220,0,88,0.097,0.0,0.0 +2008,3,19,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-11.7,38,103142,0,0,236,0,0,0,0,0,0,0,330,4.6,0,0,8000.0,77777,9,999999999,3,0.1230,0,88,0.097,0.0,0.0 +2008,3,19,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-11.7,38,103142,0,0,236,0,0,0,0,0,0,0,330,4.6,0,0,8000.0,77777,9,999999999,3,0.1230,0,88,0.097,0.0,0.0 +2008,3,19,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-12.2,38,103192,0,0,234,0,0,0,0,0,0,0,330,4.6,0,0,8000.0,77777,9,999999999,3,0.1230,0,88,0.097,0.0,0.0 +2008,3,19,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-12.2,40,103182,0,0,232,0,0,0,0,0,0,0,340,3.1,0,0,8000.0,77777,9,999999999,3,0.1230,0,88,0.097,0.0,0.0 +2008,3,19,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-12.2,40,103182,0,0,242,0,0,0,0,0,0,0,340,3.1,3,3,8000.0,77777,9,999999999,3,0.1230,0,88,0.097,0.0,0.0 +2008,3,19,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-12.8,40,103242,0,0,257,0,0,0,0,0,0,0,340,3.6,9,9,8000.0,7620,9,999999999,3,0.1230,0,88,0.097,0.0,0.0 +2008,3,19,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-12.8,35,103242,146,760,263,24,37,20,2797,0,2334,750,350,3.1,9,9,8000.0,7620,9,999999999,3,0.1230,0,88,0.097,0.0,0.0 +2008,3,19,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-0.6,-12.8,35,103242,401,1379,263,107,106,77,12298,5078,8876,3021,350,3.1,9,9,8000.0,7620,9,999999999,3,0.1230,0,88,0.097,0.0,0.0 +2008,3,19,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-11.7,32,103263,627,1379,274,354,632,83,42530,37933,10000,3805,50,3.6,9,9,8000.0,7620,9,999999999,3,0.1230,0,88,0.097,0.0,0.0 +2008,3,19,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-10.0,36,103203,808,1379,277,492,698,132,58891,48758,15860,6243,70,2.6,9,9,8000.0,7620,9,999999999,4,0.1230,0,88,0.097,0.0,0.0 +2008,3,19,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.2,-10.0,36,103203,934,1379,277,577,617,193,68418,47626,22993,9068,70,2.6,9,9,8000.0,7620,9,999999999,4,0.1230,0,88,0.097,0.0,0.0 +2008,3,19,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-7.8,42,103033,994,1379,282,619,542,238,72853,44111,28159,10983,140,4.1,9,9,8000.0,6706,9,999999999,5,0.1230,0,88,0.097,0.0,0.0 +2008,3,19,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-7.8,41,102913,985,1379,284,632,524,254,73909,43736,29865,11484,110,3.6,9,9,8000.0,6706,9,999999999,5,0.1230,0,88,0.097,0.0,0.0 +2008,3,19,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,-7.8,41,102913,908,1379,292,583,458,265,67142,39629,30688,11327,110,3.6,10,10,8000.0,6706,9,999999999,5,0.1230,0,88,0.097,0.0,0.0 +2008,3,19,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-14.4,22,102773,767,1379,287,481,378,248,54432,33341,28216,9752,130,4.1,10,10,8000.0,6096,9,999999999,2,0.1230,0,88,0.097,0.0,0.0 +2008,3,19,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-13.9,24,102713,573,1379,286,303,182,203,33549,15156,22591,7058,100,4.1,10,10,8000.0,4267,9,999999999,3,0.1230,0,88,0.097,0.0,0.0 +2008,3,19,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,-13.9,24,102713,339,1379,286,154,53,130,16652,3233,14121,3827,100,4.1,10,10,8000.0,4267,9,999999999,3,0.1230,0,88,0.097,0.0,0.0 +2008,3,19,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-8.9,38,102693,80,1379,289,57,14,52,5854,21,5366,903,130,3.6,10,10,8000.0,4267,9,999999999,4,0.1230,0,88,0.097,0.0,0.0 +2008,3,19,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-10.6,33,102653,0,413,287,0,0,0,0,0,0,0,160,3.6,10,10,8000.0,3353,9,999999999,3,0.1230,0,88,0.097,0.0,0.0 +2008,3,19,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,-10.6,33,102653,0,0,287,0,0,0,0,0,0,0,160,3.6,10,10,8000.0,3353,9,999999999,3,0.1230,0,88,0.097,0.0,0.0 +2008,3,19,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-7.2,43,102653,0,0,293,0,0,0,0,0,0,0,190,4.1,10,10,8000.0,3353,9,999999999,5,0.1230,0,88,0.097,0.0,0.0 +2008,3,19,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-6.1,47,102543,0,0,294,0,0,0,0,0,0,0,160,4.1,10,10,8000.0,2438,9,999999999,5,0.1230,0,88,0.097,0.0,0.0 +2008,3,19,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,-6.1,47,102543,0,0,294,0,0,0,0,0,0,0,160,4.1,10,10,8000.0,2438,9,999999999,5,0.1230,0,88,0.097,0.0,0.0 +2008,3,19,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-5.0,52,102443,0,0,295,0,0,0,0,0,0,0,220,5.1,10,10,8000.0,975,0,919099999,6,0.1230,0,88,0.097,0.0,0.0 +2008,3,20,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.0,-3.0,67,101279,0,0,292,0,0,0,0,0,0,0,200,4.1,10,10,3219.0,1006,0,919099999,7,0.1240,0,88,0.097,0.0,0.0 +2008,3,20,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,0.6,-1.7,83,102433,0,0,287,0,0,0,0,0,0,0,180,3.1,10,10,9000.0,1006,0,919099999,8,0.1240,0,88,0.097,0.0,0.0 +2008,3,20,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-1.1,81,102143,0,0,293,0,0,0,0,0,0,0,130,4.1,10,10,9000.0,3048,0,919099999,9,0.1240,0,88,0.097,0.0,0.0 +2008,3,20,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-1.1,78,102073,0,0,295,0,0,0,0,0,0,0,170,4.6,10,10,9000.0,1981,0,919099999,9,0.1240,0,88,0.097,0.0,0.0 +2008,3,20,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.2,-1.1,78,102073,0,0,295,0,0,0,0,0,0,0,170,4.6,10,10,9000.0,1981,0,919099999,9,0.1240,0,88,0.097,0.0,0.0 +2008,3,20,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-2.8,65,102013,0,0,296,0,0,0,0,0,0,0,170,6.7,10,10,9000.0,1676,0,919099999,8,0.1240,0,88,0.097,0.0,0.0 +2008,3,20,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.0,-2.0,79,101278,154,799,289,3,0,3,293,0,295,128,160,5.1,10,10,2414.0,1311,0,919099999,8,0.1240,0,88,0.097,0.0,0.0 +2008,3,20,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,1.1,-1.7,80,101953,408,1379,290,15,0,15,1495,0,1506,697,160,5.1,10,10,2400.0,1311,0,919099999,8,0.1240,0,88,0.097,0.0,0.0 +2008,3,20,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.0,-1.0,86,101278,634,1379,290,72,0,72,7309,0,7370,3372,130,5.7,10,10,2414.0,1006,0,919099999,9,0.1240,0,88,0.097,0.0,0.0 +2008,3,20,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.0,-1.0,80,101279,815,1379,294,94,0,94,9684,0,9770,4664,140,7.2,10,10,4023.0,914,0,919099999,9,0.1240,0,88,0.097,0.0,0.0 +2008,3,20,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,1.7,-0.6,84,101643,940,1379,293,144,2,143,17460,138,17409,7091,140,7.7,10,10,4000.0,914,0,919099999,9,0.1240,0,88,0.097,0.0,0.0 +2008,3,20,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.0,1.0,93,101279,1000,1379,296,124,0,124,12959,0,13081,6391,130,5.7,10,10,9656.0,335,0,919099999,11,0.1240,0,88,0.097,0.0,0.0 +2008,3,20,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,1.1,89,101274,991,1379,300,118,1,117,14625,65,14553,6051,130,6.7,10,10,9656.0,335,0,919099999,11,0.1240,0,88,0.097,0.0,0.0 +2008,3,20,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.3,1.7,89,101134,913,1379,303,119,1,118,14571,65,14501,5937,120,5.7,10,10,6437.0,335,0,919099999,12,0.1240,0,88,0.097,0.0,0.0 +2008,3,20,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.0,2.0,93,101279,773,1379,302,54,0,54,5539,0,5588,2758,120,5.7,10,10,4023.0,274,0,919099999,12,0.1240,0,88,0.097,0.0,0.0 +2008,3,20,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.0,2.0,93,101279,578,1379,302,36,0,36,3634,0,3664,1737,110,6.2,10,10,2414.0,213,0,919099999,12,0.1240,0,88,0.097,0.0,0.0 +2008,3,20,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,3.9,2.8,93,100784,344,1379,306,33,0,33,3266,0,3291,1406,100,6.2,10,10,2400.0,213,0,919099999,13,0.1240,0,88,0.097,0.0,0.0 +2008,3,20,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,4.0,3.0,93,101279,85,1379,307,13,0,13,1258,0,1267,472,80,3.1,10,10,6437.0,213,0,919099999,13,0.1240,0,88,0.097,0.0,0.0 +2008,3,20,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,4.4,3.3,93,100424,0,440,309,0,0,0,0,0,0,0,50,1.5,10,10,8047.0,213,0,919099999,14,0.1240,0,88,0.097,0.0,0.0 +2008,3,20,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,4.4,3.3,93,100424,0,0,309,0,0,0,0,0,0,0,50,1.5,10,10,8000.0,213,0,919999999,14,0.1240,0,88,0.097,5.0,0.0 +2008,3,20,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,5.0,3.9,93,100184,0,0,312,0,0,0,0,0,0,0,113,0.0,10,10,4828.0,152,0,919999999,15,0.1240,0,88,0.097,5.0,0.0 +2008,3,20,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,5.0,4.0,93,101279,0,0,313,0,0,0,0,0,0,0,40,1.5,10,10,3219.0,152,0,919999999,15,0.1240,0,88,0.097,5.0,0.0 +2008,3,20,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,5.0,3.9,93,99975,0,0,312,0,0,0,0,0,0,0,90,2.1,10,10,3200.0,152,0,919999999,14,0.1240,0,88,0.097,4.1,0.0 +2008,3,20,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,5.0,4.0,93,101279,0,0,313,0,0,0,0,0,0,0,20,1.5,10,10,1609.0,91,0,919999999,15,0.1240,0,88,0.097,0.0,0.0 +2008,3,21,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,5.0,4.0,93,101279,0,0,313,0,0,0,0,0,0,0,167,0.0,10,10,1609.0,152,0,919999999,15,0.1250,0,88,0.097,0.0,0.0 +2008,3,21,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,5.0,3.9,93,99525,0,0,312,0,0,0,0,0,0,0,185,0.0,10,10,3200.0,152,0,919999999,14,0.1250,0,88,0.097,0.0,0.0 +2008,3,21,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,5.0,4.0,93,101279,0,0,313,0,0,0,0,0,0,0,202,0.0,10,10,3219.0,152,0,919999999,15,0.1250,0,88,0.097,0.0,0.0 +2008,3,21,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,5.0,3.9,93,99145,0,0,312,0,0,0,0,0,0,0,330,1.5,10,10,3219.0,213,0,919999999,14,0.1250,0,88,0.097,0.0,0.0 +2008,3,21,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,5.0,3.9,93,99145,0,0,312,0,0,0,0,0,0,0,330,1.5,10,10,3200.0,213,0,919999999,14,0.1250,0,88,0.097,0.0,0.0 +2008,3,21,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,4.4,2.8,89,99225,0,0,309,0,0,0,0,0,0,0,330,4.6,10,10,3219.0,152,0,919999999,13,0.1250,0,88,0.097,0.0,0.0 +2008,3,21,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,4.0,2.0,87,101279,162,839,306,2,0,2,195,0,196,86,350,3.1,10,10,9656.0,152,0,919999999,12,0.1250,0,88,0.097,0.0,0.0 +2008,3,21,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.9,2.2,89,99205,416,1378,306,8,0,8,797,0,803,379,350,4.1,10,10,9656.0,152,0,919999999,12,0.1250,0,88,0.097,0.0,0.0 +2008,3,21,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,2.2,86,99355,641,1378,308,121,30,107,14258,1852,12652,4763,310,3.6,10,10,9656.0,274,0,919999999,12,0.1250,0,88,0.097,0.0,0.0 +2008,3,21,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.0,2.0,87,101279,822,1378,306,72,0,72,7415,0,7481,3672,320,4.6,10,10,9656.0,610,0,919999999,12,0.1250,0,88,0.097,0.0,0.0 +2008,3,21,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.0,1.7,79,99375,946,1378,310,146,4,143,17710,273,17416,7110,320,6.7,10,10,9656.0,610,0,919999999,12,0.1250,0,88,0.097,0.0,0.0 +2008,3,21,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,0.6,65,99375,1006,1378,316,99,1,99,12450,63,12490,5225,310,10.3,10,10,9656.0,1829,0,919999999,10,0.1250,0,88,0.097,0.0,0.0 +2008,3,21,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,0.0,62,99395,997,1378,316,101,1,101,12668,63,12710,5308,290,9.8,10,10,9656.0,1981,0,919999999,10,0.1250,0,88,0.097,0.0,0.0 +2008,3,21,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.7,0.0,62,99395,919,1378,316,103,0,103,10698,0,10796,5272,290,9.8,10,10,9656.0,1981,0,919999999,10,0.1250,0,88,0.097,0.0,0.0 +2008,3,21,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,-0.6,57,99525,778,1378,317,95,0,95,9757,0,9843,4632,300,11.3,10,10,9656.0,1280,0,919999999,9,0.1250,0,88,0.097,0.0,0.0 +2008,3,21,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-1.1,57,99605,583,1378,315,99,0,99,10009,0,10091,4299,300,12.9,10,10,9656.0,1189,0,919999999,9,0.1250,0,88,0.097,0.0,0.0 +2008,3,21,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.7,-1.1,57,99605,349,1378,306,78,0,78,7733,0,7791,2879,300,12.9,9,9,9656.0,1189,0,919999999,9,0.1250,0,88,0.097,0.0,0.0 +2008,3,21,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-1.7,56,99825,90,1378,286,56,92,49,5823,0,5118,1028,290,9.3,5,5,9656.0,77777,0,919999999,8,0.1250,0,88,0.097,0.0,0.0 +2008,3,21,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-2.8,51,99935,0,466,280,0,0,0,0,0,0,0,290,8.8,3,3,9656.0,77777,0,919999999,7,0.1250,0,88,0.097,0.0,0.0 +2008,3,21,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-2.8,51,99935,0,0,280,0,0,0,0,0,0,0,290,8.7,3,3,9656.0,77777,9,999999999,7,0.1250,0,88,0.101,0.0,0.0 +2008,3,21,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-2.2,63,100124,0,0,272,0,0,0,0,0,0,0,280,8.2,3,3,9656.0,77777,9,999999999,8,0.1250,0,88,0.101,6.9,0.0 +2008,3,21,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-2.8,63,100194,0,0,269,0,0,0,0,0,0,0,270,8.2,3,3,9656.0,77777,9,999999999,7,0.1250,0,88,0.101,0.0,0.0 +2008,3,21,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-2.8,63,100194,0,0,273,0,0,0,0,0,0,0,270,8.2,5,5,9656.0,77777,9,999999999,7,0.1250,0,88,0.101,0.0,0.0 +2008,3,21,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-4.4,59,100274,0,0,263,0,0,0,0,0,0,0,270,9.8,3,3,9656.0,77777,9,999999999,6,0.1250,0,88,0.101,0.0,0.0 +2008,3,22,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-5.0,58,100314,0,0,261,0,0,0,0,0,0,0,270,9.3,3,3,9656.0,77777,9,999999999,6,0.1270,0,88,0.101,0.0,0.0 +2008,3,22,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-5.0,58,100314,0,0,261,0,0,0,0,0,0,0,270,9.3,3,3,9656.0,77777,9,999999999,6,0.1270,0,88,0.101,0.0,0.0 +2008,3,22,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-6.1,57,100374,0,0,260,0,0,0,0,0,0,0,290,8.2,5,5,9656.0,77777,9,999999999,5,0.1270,0,88,0.101,0.0,0.0 +2008,3,22,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-9.4,45,100444,0,0,254,0,0,0,0,0,0,0,300,10.3,5,5,9656.0,77777,9,999999999,4,0.1270,0,88,0.101,0.0,0.0 +2008,3,22,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-9.4,45,100444,0,0,250,0,0,0,0,0,0,0,300,10.3,3,3,9656.0,77777,9,999999999,4,0.1270,0,88,0.101,0.0,0.0 +2008,3,22,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-11.1,42,100573,0,0,235,0,0,0,0,0,0,0,300,10.8,0,0,9656.0,77777,9,999999999,3,0.1270,0,88,0.101,0.0,0.0 +2008,3,22,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-11.7,40,100613,169,878,244,55,272,23,6413,0,2686,871,290,11.3,3,3,9656.0,77777,9,999999999,3,0.1270,0,88,0.101,0.0,0.0 +2008,3,22,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-11.7,40,100613,423,1377,244,203,567,50,24271,23802,5990,2151,290,11.3,3,3,9656.0,77777,9,999999999,3,0.1270,0,88,0.101,0.0,0.0 +2008,3,22,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-11.7,37,100633,648,1377,248,394,788,73,47998,46303,8915,3441,290,11.3,3,3,9656.0,77777,9,999999999,3,0.1270,0,88,0.101,0.0,0.0 +2008,3,22,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-11.7,34,100634,829,1377,252,569,885,86,59658,88039,12312,1905,290,12.4,3,3,9656.0,77777,9,999999999,3,0.1270,0,88,0.101,0.0,0.0 +2008,3,22,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-11.7,34,100634,953,1377,252,704,931,96,73594,93318,13374,2338,290,12.3,3,3,9656.0,77777,9,999999999,3,0.1270,0,88,0.101,0.0,0.0 +2008,3,22,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-11.1,30,100594,1012,1377,261,787,957,99,82218,96188,13623,2608,310,10.8,3,3,9656.0,77777,9,999999999,3,0.1270,0,88,0.101,0.0,0.0 +2008,3,22,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-10.6,31,100584,1002,1377,264,810,966,100,84619,97068,13777,2573,300,12.9,3,3,9656.0,77777,9,999999999,3,0.1270,0,88,0.101,0.0,0.0 +2008,3,22,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-10.6,31,100584,924,1377,264,770,951,101,80415,95178,14102,2263,300,12.9,3,3,9656.0,77777,9,999999999,3,0.1270,0,88,0.101,0.0,0.0 +2008,3,22,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-11.7,28,100584,783,1377,263,673,926,93,82411,59479,11422,4557,280,12.4,3,3,9656.0,77777,9,999999999,3,0.1270,0,88,0.101,0.0,0.0 +2008,3,22,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-13.3,24,100604,588,1377,250,525,876,82,62689,51633,9819,3683,280,12.4,0,0,9656.0,77777,9,999999999,3,0.1270,0,88,0.101,0.0,0.0 +2008,3,22,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-13.3,24,100604,354,1377,250,340,759,68,38959,31266,7814,2613,280,12.3,0,0,9656.0,77777,9,999999999,3,0.1270,0,88,0.101,0.0,0.0 +2008,3,22,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-15.6,21,100674,95,1377,244,146,477,43,15455,0,4570,1051,290,10.8,0,0,9656.0,77777,9,999999999,2,0.1270,0,88,0.101,0.0,0.0 +2008,3,22,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-16.1,21,100754,0,492,241,0,0,0,0,0,0,0,290,11.8,0,0,9656.0,77777,9,999999999,2,0.1270,0,88,0.101,0.0,0.0 +2008,3,22,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-16.1,21,100754,0,0,241,0,0,0,0,0,0,0,290,11.8,0,0,9656.0,77777,9,999999999,2,0.1270,0,88,0.101,0.0,0.0 +2008,3,22,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-16.7,21,100884,0,0,237,0,0,0,0,0,0,0,290,10.3,0,0,9656.0,77777,9,999999999,2,0.1270,0,88,0.101,0.0,0.0 +2008,3,22,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-15.6,24,100923,0,0,236,0,0,0,0,0,0,0,290,8.2,0,0,9656.0,77777,9,999999999,2,0.1270,0,88,0.101,0.0,0.0 +2008,3,22,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-15.6,24,100923,0,0,236,0,0,0,0,0,0,0,290,8.2,0,0,9656.0,77777,9,999999999,2,0.1270,0,88,0.101,0.0,0.0 +2008,3,22,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-15.0,28,100953,0,0,243,0,0,0,0,0,0,0,280,7.2,3,3,9656.0,77777,9,999999999,2,0.1270,0,88,0.101,0.0,0.0 +2008,3,23,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-14.4,31,100993,0,0,232,0,0,0,0,0,0,0,270,7.7,0,0,9656.0,77777,9,999999999,2,0.1280,0,88,0.101,0.0,0.0 +2008,3,23,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-14.4,31,100993,0,0,242,0,0,0,0,0,0,0,270,7.7,3,3,9656.0,77777,9,999999999,2,0.1280,0,88,0.101,0.0,0.0 +2008,3,23,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-13.9,33,100933,0,0,242,0,0,0,0,0,0,0,270,7.7,3,3,9656.0,77777,9,999999999,2,0.1280,0,88,0.101,0.0,0.0 +2008,3,23,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-13.9,33,100963,0,0,232,0,0,0,0,0,0,0,270,8.8,0,0,9656.0,77777,9,999999999,2,0.1280,0,88,0.101,0.0,0.0 +2008,3,23,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-13.9,33,100963,0,0,242,0,0,0,0,0,0,0,270,8.7,3,3,9656.0,77777,9,999999999,2,0.1280,0,88,0.101,0.0,0.0 +2008,3,23,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-13.9,33,100953,0,0,246,0,0,0,0,0,0,0,270,5.1,5,5,9656.0,77777,9,999999999,2,0.1280,0,88,0.101,0.0,0.0 +2008,3,23,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-13.9,31,100973,177,917,244,56,213,27,6473,0,3126,1006,270,6.7,3,3,9656.0,77777,9,999999999,2,0.1280,0,88,0.101,0.0,0.0 +2008,3,23,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-13.9,31,100973,430,1376,244,205,503,58,24282,22667,6886,2459,270,6.7,3,3,9656.0,77777,9,999999999,2,0.1280,0,88,0.101,0.0,0.0 +2008,3,23,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-13.9,28,100934,655,1376,250,397,762,82,48017,46351,9945,3828,270,7.2,3,3,9656.0,77777,9,999999999,2,0.1280,0,88,0.101,0.0,0.0 +2008,3,23,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-14.4,23,100914,835,1376,256,574,865,96,70735,56489,11866,4795,280,8.2,3,3,9656.0,77777,9,999999999,2,0.1280,0,88,0.101,0.0,0.0 +2008,3,23,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-14.4,23,100914,959,1376,256,709,911,109,73740,91141,15054,2440,280,8.2,3,3,9656.0,77777,9,999999999,2,0.1280,0,88,0.101,0.0,0.0 +2008,3,23,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-12.8,22,100834,1018,1376,257,792,938,113,82339,94124,15410,2755,280,6.7,0,0,9656.0,77777,9,999999999,3,0.1280,0,88,0.101,0.0,0.0 +2008,3,23,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,-11.7,22,100755,1008,1376,280,752,785,171,91041,57968,20794,8471,310,5.7,5,5,9656.0,77777,9,999999999,3,0.1280,0,88,0.101,0.0,0.0 +2008,3,23,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,-11.7,22,100755,929,1376,280,737,840,143,89404,59743,17416,7066,310,5.7,5,5,9656.0,77777,9,999999999,3,0.1280,0,88,0.101,0.0,0.0 +2008,3,23,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,-11.7,21,100725,788,1376,278,635,805,137,75575,57025,16369,6378,300,7.2,3,3,9656.0,77777,9,999999999,3,0.1280,0,88,0.101,0.0,0.0 +2008,3,23,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,-12.2,20,100755,593,1376,277,521,836,94,61617,51287,11152,4149,300,7.7,3,3,9656.0,77777,9,999999999,3,0.1280,0,88,0.101,0.0,0.0 +2008,3,23,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,-12.2,20,100755,359,1376,277,336,709,79,38093,31988,8985,2943,300,7.7,3,3,9656.0,77777,9,999999999,3,0.1280,0,88,0.101,0.0,0.0 +2008,3,23,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-13.9,19,100894,100,1376,269,144,431,49,15127,0,5169,1119,300,6.2,3,3,9656.0,77777,9,999999999,2,0.1280,0,88,0.101,0.0,0.0 +2008,3,23,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-12.8,23,100974,0,518,270,0,0,0,0,0,0,0,280,4.6,5,5,9656.0,77777,9,999999999,3,0.1280,0,88,0.101,0.0,0.0 +2008,3,23,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-12.8,23,100974,0,0,270,0,0,0,0,0,0,0,280,4.6,5,5,9656.0,77777,9,999999999,3,0.1280,0,88,0.101,0.0,0.0 +2008,3,23,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-12.2,28,101144,0,0,260,0,0,0,0,0,0,0,310,4.6,3,3,9656.0,77777,9,999999999,3,0.1280,0,88,0.101,0.0,0.0 +2008,3,23,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-12.2,29,101204,0,0,247,0,0,0,0,0,0,0,300,5.1,0,0,9656.0,77777,9,999999999,3,0.1280,0,88,0.101,0.0,0.0 +2008,3,23,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-12.2,29,101204,0,0,247,0,0,0,0,0,0,0,300,5.1,0,0,9656.0,77777,9,999999999,3,0.1280,0,88,0.101,0.0,0.0 +2008,3,23,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-13.9,29,101383,0,0,238,0,0,0,0,0,0,0,340,5.7,0,0,9656.0,77777,9,999999999,2,0.1280,0,88,0.101,0.0,0.0 +2008,3,24,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-15.0,27,101413,0,0,235,0,0,0,0,0,0,0,330,5.1,0,0,9656.0,77777,9,999999999,2,0.1290,0,88,0.101,0.0,0.0 +2008,3,24,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-15.0,27,101413,0,0,235,0,0,0,0,0,0,0,330,5.1,0,0,9656.0,77777,9,999999999,2,0.1290,0,88,0.101,0.0,0.0 +2008,3,24,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-15.6,27,101443,0,0,232,0,0,0,0,0,0,0,300,5.7,0,0,9656.0,77777,9,999999999,2,0.1290,0,88,0.101,0.0,0.0 +2008,3,24,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-16.1,26,101493,0,0,232,0,0,0,0,0,0,0,290,5.7,0,0,9656.0,77777,9,999999999,2,0.1290,0,88,0.101,0.0,0.0 +2008,3,24,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-16.1,26,101493,0,0,232,0,0,0,0,0,0,0,290,5.7,0,0,9656.0,77777,9,999999999,2,0.1290,0,88,0.101,0.0,0.0 +2008,3,24,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-15.6,28,101623,0,0,230,0,0,0,0,0,0,0,290,5.7,0,0,9656.0,77777,9,999999999,2,0.1290,0,88,0.101,0.0,0.0 +2008,3,24,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-15.0,30,101693,184,957,231,61,277,27,7078,0,3138,1016,280,4.6,0,0,9656.0,77777,9,999999999,2,0.1290,0,88,0.101,0.0,0.0 +2008,3,24,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-15.0,30,101693,438,1375,231,215,569,57,25551,25893,6789,2436,280,4.6,0,0,9656.0,77777,9,999999999,2,0.1290,0,88,0.101,0.0,0.0 +2008,3,24,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-15.6,24,101773,662,1375,246,410,788,80,49757,47923,9735,3761,300,5.7,3,3,9656.0,77777,9,999999999,2,0.1290,0,88,0.101,0.0,0.0 +2008,3,24,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-14.4,25,101803,842,1375,252,587,886,94,61308,88077,13357,1973,270,5.7,3,3,9656.0,77777,9,999999999,2,0.1290,0,88,0.101,0.0,0.0 +2008,3,24,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-14.4,25,101803,965,1375,252,719,921,108,74801,92182,14905,2466,270,5.7,3,3,9656.0,77777,9,999999999,2,0.1290,0,88,0.101,0.0,0.0 +2008,3,24,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-13.9,22,101804,1024,1375,262,799,939,116,82958,94184,15775,2810,320,4.1,3,3,9656.0,77777,9,999999999,2,0.1290,0,88,0.101,0.0,0.0 +2008,3,24,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-13.9,20,101764,1013,1375,267,818,936,120,84845,93813,16318,2765,310,3.6,3,3,9656.0,77777,9,999999999,2,0.1290,0,88,0.101,0.0,0.0 +2008,3,24,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-13.9,20,101764,935,1375,267,775,925,117,95541,62974,14474,5944,310,3.6,3,3,9656.0,77777,9,999999999,2,0.1290,0,88,0.101,0.0,0.0 +2008,3,24,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-13.9,19,101764,793,1375,258,673,888,110,81542,59585,13373,5308,250,3.6,0,0,9656.0,77777,9,999999999,2,0.1290,0,88,0.101,0.0,0.0 +2008,3,24,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-15.6,17,101784,598,1375,256,522,821,99,61573,51600,11715,4346,220,3.6,0,0,9656.0,77777,9,999999999,2,0.1290,0,88,0.101,0.0,0.0 +2008,3,24,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-15.6,17,101784,363,1375,256,338,703,80,38351,32514,9106,2988,220,3.6,0,0,9656.0,77777,9,999999999,2,0.1290,0,88,0.101,0.0,0.0 +2008,3,24,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-15.0,18,101914,105,1375,255,147,444,48,15531,0,5092,1156,290,4.6,0,0,9656.0,77777,9,999999999,2,0.1290,0,88,0.101,0.0,0.0 +2008,3,24,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-14.4,20,101984,0,544,253,0,0,0,0,0,0,0,290,4.6,0,0,9656.0,77777,9,999999999,2,0.1290,0,88,0.101,0.0,0.0 +2008,3,24,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-14.4,20,101984,0,0,253,0,0,0,0,0,0,0,290,4.6,0,0,9656.0,77777,9,999999999,2,0.1290,0,88,0.101,0.0,0.0 +2008,3,24,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-13.9,24,102133,0,0,246,0,0,0,0,0,0,0,360,2.6,0,0,9656.0,77777,9,999999999,2,0.1290,0,88,0.101,0.0,0.0 +2008,3,24,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-5.6,53,102183,0,0,251,0,0,0,0,0,0,0,360,2.1,0,0,9656.0,77777,9,999999999,6,0.1290,0,88,0.101,0.0,0.0 +2008,3,24,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-5.6,53,102183,0,0,251,0,0,0,0,0,0,0,360,2.1,0,0,9656.0,77777,9,999999999,6,0.1290,0,88,0.101,0.0,0.0 +2008,3,24,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-12.8,32,102243,0,0,239,0,0,0,0,0,0,0,300,3.6,0,0,9656.0,77777,9,999999999,3,0.1290,0,88,0.101,0.0,0.0 +2008,3,25,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-13.3,30,102273,0,0,249,0,0,0,0,0,0,0,330,4.1,3,3,9656.0,77777,9,999999999,3,0.1300,0,88,0.101,0.0,0.0 +2008,3,25,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-13.3,30,102273,0,0,249,0,0,0,0,0,0,0,330,4.1,3,3,9656.0,77777,9,999999999,3,0.1300,0,88,0.101,0.0,0.0 +2008,3,25,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-12.8,35,102283,0,0,249,0,0,0,0,0,0,0,340,3.1,5,5,9656.0,77777,9,999999999,3,0.1300,0,88,0.101,0.0,0.0 +2008,3,25,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-12.2,40,102312,0,0,245,0,0,0,0,0,0,0,10,3.6,5,5,9656.0,77777,9,999999999,3,0.1300,0,88,0.101,0.0,0.0 +2008,3,25,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-12.2,40,102312,0,0,245,0,0,0,0,0,0,0,10,3.6,5,5,9656.0,77777,9,999999999,3,0.1300,0,88,0.101,0.0,0.0 +2008,3,25,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-12.2,42,102412,0,0,230,0,0,0,0,0,0,0,360,2.6,0,0,9656.0,77777,9,999999999,3,0.1300,0,88,0.101,0.0,0.0 +2008,3,25,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-11.7,40,102472,192,996,234,62,260,28,7196,0,3255,1058,350,3.1,0,0,9656.0,77777,9,999999999,3,0.1300,0,88,0.101,0.0,0.0 +2008,3,25,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-11.7,40,102472,445,1375,234,214,541,60,25369,25148,7129,2560,350,3.1,0,0,9656.0,77777,9,999999999,3,0.1300,0,88,0.101,0.0,0.0 +2008,3,25,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-6.1,47,102483,669,1375,255,405,751,86,48891,45578,10412,4023,30,3.6,0,0,9656.0,77777,9,999999999,5,0.1300,0,88,0.101,0.0,0.0 +2008,3,25,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-5.0,50,102513,848,1375,269,578,845,103,70926,54836,12680,5136,60,2.6,3,3,9656.0,77777,9,999999999,6,0.1300,0,88,0.101,0.0,0.0 +2008,3,25,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-5.0,50,102513,971,1375,269,715,907,108,74804,91262,14899,2497,60,2.6,3,3,9656.0,77777,9,999999999,6,0.1300,0,88,0.101,0.0,0.0 +2008,3,25,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-5.0,46,102423,1030,1375,278,740,784,168,89917,56558,20504,8408,278,3.1,5,5,9656.0,77777,9,999999999,6,0.1300,0,88,0.101,0.0,0.0 +2008,3,25,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-5.0,44,102334,1019,1375,280,722,692,205,86278,52955,24618,9883,80,4.6,5,5,9656.0,77777,9,999999999,6,0.1300,0,88,0.101,0.0,0.0 +2008,3,25,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-5.0,44,102334,940,1375,280,646,584,229,75639,47123,26952,10404,80,4.6,5,5,9656.0,77777,9,999999999,6,0.1300,0,88,0.101,0.0,0.0 +2008,3,25,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-2.8,55,102254,798,1375,280,635,781,144,75317,54865,17149,6685,80,5.1,5,5,9656.0,77777,9,999999999,8,0.1300,0,88,0.101,0.0,0.0 +2008,3,25,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-2.8,58,102213,603,1375,278,516,790,106,60496,49205,12470,4614,90,6.2,5,5,9656.0,77777,9,999999999,8,0.1300,0,88,0.101,0.0,0.0 +2008,3,25,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-2.8,58,102213,368,1375,278,333,658,88,37477,31017,9938,3220,90,6.2,5,5,9656.0,77777,9,999999999,8,0.1300,0,88,0.101,0.0,0.0 +2008,3,25,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-3.3,62,102263,110,1375,271,145,390,54,15191,909,5682,1222,120,5.1,5,5,9656.0,77777,9,999999999,7,0.1300,0,88,0.101,0.0,0.0 +2008,3,25,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-3.9,62,102263,0,570,268,0,0,0,0,0,0,0,140,3.1,5,5,9656.0,77777,9,999999999,7,0.1300,0,88,0.101,0.0,0.0 +2008,3,25,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-3.9,62,102263,0,0,264,0,0,0,0,0,0,0,140,3.1,3,3,9656.0,77777,9,999999999,7,0.1300,0,88,0.101,0.0,0.0 +2008,3,25,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-3.3,62,102333,0,0,267,0,0,0,0,0,0,0,29,0.0,3,3,9656.0,77777,9,999999999,7,0.1300,0,88,0.101,0.0,0.0 +2008,3,25,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-3.9,59,102313,0,0,266,0,0,0,0,0,0,0,180,1.5,3,3,9656.0,77777,9,999999999,7,0.1300,0,88,0.101,0.0,0.0 +2008,3,25,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-3.9,59,102313,0,0,266,0,0,0,0,0,0,0,180,1.5,3,3,9656.0,77777,9,999999999,7,0.1300,0,88,0.101,0.0,0.0 +2008,3,25,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-3.3,73,102313,0,0,262,0,0,0,0,0,0,0,10,1.5,5,5,9656.0,77777,9,999999999,7,0.1300,0,88,0.101,0.0,0.0 +2008,3,26,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-3.3,76,102293,0,0,260,0,0,0,0,0,0,0,10,3.6,5,5,9656.0,77777,9,999999999,7,0.1310,0,88,0.101,0.0,0.0 +2008,3,26,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-3.3,76,102293,0,0,260,0,0,0,0,0,0,0,10,3.6,5,5,9656.0,77777,9,999999999,7,0.1310,0,88,0.101,0.0,0.0 +2008,3,26,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-6.1,63,102393,0,0,255,0,0,0,0,0,0,0,10,6.2,5,5,9656.0,77777,9,999999999,5,0.1310,0,88,0.101,0.0,0.0 +2008,3,26,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-7.2,60,102422,0,0,252,0,0,0,0,0,0,0,10,5.7,5,5,9656.0,77777,9,999999999,5,0.1310,0,88,0.101,0.0,0.0 +2008,3,26,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-7.2,60,102422,0,0,267,0,0,0,0,0,0,0,10,5.7,9,9,9656.0,77777,9,999999999,5,0.1310,0,88,0.101,0.0,0.0 +2008,3,26,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-10.0,51,102592,0,0,260,0,0,0,0,0,0,0,20,4.6,9,9,9656.0,9144,9,999999999,4,0.1310,0,88,0.101,0.0,0.0 +2008,3,26,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-12.8,38,102682,199,1036,259,64,285,24,7544,0,2833,937,20,5.1,9,9,9656.0,8534,9,999999999,3,0.1310,0,88,0.101,0.0,0.0 +2008,3,26,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-1.7,-12.8,38,102682,452,1374,245,188,426,63,22246,20423,7473,2684,20,5.1,5,5,9656.0,8534,9,999999999,3,0.1310,0,88,0.101,0.0,0.0 +2008,3,26,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-12.2,35,102703,676,1374,248,378,610,101,45172,39278,12109,4640,40,6.2,3,3,9656.0,77777,9,999999999,3,0.1310,0,88,0.101,0.0,0.0 +2008,3,26,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-12.8,32,102693,855,1374,249,571,790,109,69921,52918,13392,5415,60,4.6,3,3,9656.0,77777,9,999999999,3,0.1310,0,88,0.101,0.0,0.0 +2008,3,26,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-12.8,32,102693,978,1374,239,732,933,104,76295,93535,14352,2504,60,4.6,0,0,9656.0,77777,9,999999999,3,0.1310,0,88,0.101,0.0,0.0 +2008,3,26,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-10.6,39,102573,1035,1374,241,813,953,109,84707,95826,14846,2835,90,5.7,0,0,9656.0,77777,9,999999999,3,0.1310,0,88,0.101,0.0,0.0 +2008,3,26,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-11.1,37,102543,1024,1374,240,831,952,113,86466,95631,15389,2801,120,4.1,0,0,9656.0,77777,9,999999999,3,0.1310,0,88,0.101,0.0,0.0 +2008,3,26,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-11.1,37,102543,945,1374,240,786,932,114,81766,93269,15742,2394,120,4.1,0,0,9656.0,77777,9,999999999,3,0.1310,0,88,0.101,0.0,0.0 +2008,3,26,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-10.6,37,102393,803,1374,243,682,889,111,82693,59449,13505,5377,90,4.6,0,0,9656.0,77777,9,999999999,3,0.1310,0,88,0.101,0.0,0.0 +2008,3,26,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-9.4,41,102313,608,1374,244,528,812,103,62175,51240,12169,4522,110,5.7,0,0,9656.0,77777,9,999999999,4,0.1310,0,88,0.101,0.0,0.0 +2008,3,26,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-9.4,41,102313,373,1374,254,302,487,101,33696,25735,11312,3560,110,5.7,3,3,9656.0,77777,9,999999999,4,0.1310,0,88,0.101,0.0,0.0 +2008,3,26,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-7.2,52,102203,115,1374,259,128,229,57,13405,1416,5995,1274,140,7.7,5,5,9656.0,77777,9,999999999,5,0.1310,0,88,0.101,0.0,0.0 +2008,3,26,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-6.7,54,102143,0,596,282,0,0,0,0,0,0,0,150,7.7,10,10,9656.0,6096,9,999999999,5,0.1310,0,88,0.101,0.0,0.0 +2008,3,26,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.6,-6.7,54,102143,0,0,282,0,0,0,0,0,0,0,150,7.7,10,10,9656.0,6096,9,999999999,5,0.1310,0,88,0.101,0.0,0.0 +2008,3,26,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-4.4,59,102133,0,0,291,0,0,0,0,0,0,0,200,8.8,10,10,9656.0,3353,9,999999999,6,0.1310,0,88,0.101,0.0,0.0 +2008,3,26,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-3.3,62,102043,0,0,295,0,0,0,0,0,0,0,210,8.2,10,10,9656.0,3353,9,999999999,7,0.1310,0,88,0.101,0.0,0.0 +2008,3,26,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,-3.3,62,102043,0,0,295,0,0,0,0,0,0,0,210,8.2,10,10,9656.0,3353,9,999999999,7,0.1310,0,88,0.101,0.0,0.0 +2008,3,26,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-2.2,66,101993,0,0,298,0,0,0,0,0,0,0,210,6.7,10,10,9656.0,1676,9,999999999,8,0.1310,0,88,0.101,0.0,0.0 +2008,3,27,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.0,-1.0,74,101279,0,0,298,0,0,0,0,0,0,0,200,7.2,10,10,9656.0,884,0,919999999,9,0.1320,0,88,0.101,0.0,0.0 +2008,3,27,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,-1.7,69,101843,0,0,299,0,0,0,0,0,0,0,210,8.7,10,10,9656.0,884,0,919999999,8,0.1320,0,88,0.101,0.0,0.0 +2008,3,27,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-2.2,61,101564,0,0,303,0,0,0,0,0,0,0,210,8.8,10,10,9656.0,2134,0,919999999,8,0.1320,0,88,0.101,0.0,0.0 +2008,3,27,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-2.2,61,101464,0,0,278,0,0,0,0,0,0,0,220,8.8,5,5,9656.0,77777,0,919999999,8,0.1320,0,88,0.101,0.0,0.0 +2008,3,27,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-2.2,61,101464,0,0,278,0,0,0,0,0,0,0,220,8.7,5,5,9656.0,77777,0,919999999,8,0.1320,0,88,0.101,0.0,0.0 +2008,3,27,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,0.0,70,101384,0,0,283,0,0,0,0,0,0,0,220,7.2,5,5,9656.0,77777,0,919999999,10,0.1320,0,88,0.101,0.0,0.0 +2008,3,27,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,0.6,68,101344,207,1075,305,11,0,11,1077,0,1085,463,220,8.8,9,9,9656.0,7925,0,919999999,11,0.1320,0,88,0.101,0.0,0.0 +2008,3,27,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.1,0.6,68,101344,459,1373,314,91,40,77,10595,1973,8991,3191,220,8.7,10,10,9656.0,7925,0,919999999,11,0.1320,0,88,0.101,0.0,0.0 +2008,3,27,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,1.7,65,101234,683,1373,323,96,17,89,11569,1011,10758,4177,240,8.8,10,10,9656.0,4800,0,919999999,12,0.1320,0,88,0.101,0.0,0.0 +2008,3,27,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,1.1,50,101195,861,1373,328,369,209,246,42375,17309,28403,10463,260,8.8,9,9,9656.0,1829,0,919999999,11,0.1320,0,88,0.101,0.0,0.0 +2008,3,27,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.1,1.1,50,101195,984,1373,328,480,325,268,55817,26963,31340,11960,260,8.7,9,9,9656.0,1829,0,919999999,11,0.1320,0,88,0.101,0.0,0.0 +2008,3,27,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,-1.1,39,101135,1041,1373,331,520,288,314,60268,25213,36612,13755,280,8.2,9,9,9656.0,2134,0,919999999,9,0.1320,0,88,0.101,0.0,0.0 +2008,3,27,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,-2.2,36,101115,1029,1373,339,446,119,355,51115,11045,40944,14815,270,8.2,10,10,9656.0,2134,0,919999999,8,0.1320,0,88,0.101,0.0,0.0 +2008,3,27,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.2,-2.2,36,101115,950,1373,311,587,404,296,67430,35603,34202,12569,270,8.2,5,5,9656.0,2134,0,919999999,8,0.1320,0,88,0.101,0.0,0.0 +2008,3,27,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,-2.8,30,101105,808,1373,313,552,520,219,63469,42179,25309,9293,260,9.8,3,3,9656.0,77777,0,919999999,7,0.1320,0,88,0.101,0.0,0.0 +2008,3,27,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,-5.0,25,101145,613,1373,310,475,604,161,54009,44400,18387,6396,270,9.8,3,3,9656.0,77777,0,919999999,6,0.1320,0,88,0.101,0.0,0.0 +2008,3,27,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,-5.0,25,101145,378,1373,310,322,548,115,35571,31057,12756,3889,270,9.8,3,3,9656.0,77777,0,919999999,6,0.1320,0,88,0.101,0.0,0.0 +2008,3,27,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,-8.9,21,101365,120,1373,297,144,330,64,14984,4271,6690,1327,270,9.8,3,3,9656.0,77777,0,919999999,4,0.1320,0,88,0.101,0.0,0.0 +2008,3,27,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,-9.4,21,101465,0,621,279,0,0,0,0,0,0,0,290,7.2,0,0,9656.0,77777,0,919999999,4,0.1320,0,88,0.101,0.0,0.0 +2008,3,27,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,-9.4,21,101465,0,0,279,0,0,0,0,0,0,0,290,7.2,0,0,9656.0,77777,9,999999999,4,0.1320,0,88,0.101,0.0,0.0 +2008,3,27,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,-7.8,28,101625,0,0,274,0,0,0,0,0,0,0,300,5.1,0,0,9656.0,77777,9,999999999,5,0.1320,0,88,0.101,0.0,0.0 +2008,3,27,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,-8.3,28,101624,0,0,272,0,0,0,0,0,0,0,300,4.6,0,0,9656.0,77777,9,999999999,4,0.1320,0,88,0.101,0.0,0.0 +2008,3,27,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,-8.3,28,101624,0,0,272,0,0,0,0,0,0,0,300,4.6,0,0,9656.0,77777,9,999999999,4,0.1320,0,88,0.101,0.0,0.0 +2008,3,27,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-8.9,29,101654,0,0,265,0,0,0,0,0,0,0,293,0.0,0,0,9656.0,77777,9,999999999,4,0.1320,0,88,0.101,0.0,0.0 +2008,3,28,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-7.8,35,101654,0,0,262,0,0,0,0,0,0,0,240,2.6,0,0,9656.0,77777,9,999999999,5,0.1330,0,88,0.101,0.0,0.0 +2008,3,28,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-7.8,35,101654,0,0,273,0,0,0,0,0,0,0,240,2.6,3,3,9656.0,77777,9,999999999,5,0.1330,0,88,0.101,0.0,0.0 +2008,3,28,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-8.3,33,101684,0,0,273,0,0,0,0,0,0,0,280,4.6,3,3,9656.0,77777,9,999999999,4,0.1330,0,88,0.101,0.0,0.0 +2008,3,28,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-7.8,36,101714,0,0,275,0,0,0,0,0,0,0,270,3.1,5,5,9656.0,77777,9,999999999,5,0.1330,0,88,0.101,0.0,0.0 +2008,3,28,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-7.8,36,101714,0,0,271,0,0,0,0,0,0,0,270,3.1,3,3,9656.0,77777,9,999999999,5,0.1330,0,88,0.101,0.0,0.0 +2008,3,28,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-6.7,40,101774,0,0,293,0,0,0,0,0,0,0,260,2.1,9,9,9656.0,7620,9,999999999,5,0.1330,0,88,0.101,0.0,0.0 +2008,3,28,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-5.6,41,101814,214,1114,298,56,150,33,6473,842,3822,1248,260,4.1,9,9,9656.0,7620,9,999999999,6,0.1330,0,88,0.101,0.0,0.0 +2008,3,28,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.1,-5.6,41,101814,467,1372,298,201,445,62,23874,21169,7381,2676,260,4.1,9,9,9656.0,7620,9,999999999,6,0.1330,0,88,0.101,0.0,0.0 +2008,3,28,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,-5.0,37,101854,689,1372,309,308,373,159,35586,27332,18450,6753,260,4.6,9,9,9656.0,6706,9,999999999,6,0.1330,0,88,0.101,0.0,0.0 +2008,3,28,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,-5.0,35,101824,868,1372,320,442,395,216,51414,31681,25252,9572,280,6.7,10,10,9656.0,6706,9,999999999,6,0.1330,0,88,0.101,0.0,0.0 +2008,3,28,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.9,-5.0,35,101824,990,1372,320,501,277,307,57776,24660,35614,13191,280,6.7,10,10,9656.0,6706,9,999999999,6,0.1330,0,88,0.101,0.0,0.0 +2008,3,28,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,-6.7,25,101615,1047,1372,331,635,462,287,74270,39558,33761,12949,250,4.6,10,10,9656.0,6706,9,999999999,5,0.1330,0,88,0.101,0.0,0.0 +2008,3,28,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,-6.1,27,101645,1035,1372,332,580,304,349,66673,28217,40371,14705,270,3.6,10,10,9656.0,3048,9,999999999,5,0.1330,0,88,0.101,0.0,0.0 +2008,3,28,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,-6.1,27,101645,955,1372,332,409,146,300,47010,13043,34684,12725,270,3.6,10,10,9656.0,3048,9,999999999,5,0.1330,0,88,0.101,0.0,0.0 +2008,3,28,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,-6.1,27,101545,813,1372,332,261,81,201,30261,6411,23418,8765,230,5.1,10,10,9656.0,4267,9,999999999,5,0.1330,0,88,0.101,0.0,0.0 +2008,3,28,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,-6.1,28,101505,617,1372,329,189,41,167,21453,3070,19042,6591,300,5.7,10,10,9656.0,4267,9,999999999,5,0.1330,0,88,0.101,0.0,0.0 +2008,3,28,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.1,-6.1,28,101505,383,1372,329,129,37,109,14337,2047,12162,3792,300,5.7,10,10,9656.0,4267,9,999999999,5,0.1330,0,88,0.101,0.0,0.0 +2008,3,28,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,-3.3,39,101475,125,1372,324,31,0,31,3017,0,3038,1010,280,4.1,10,10,9656.0,2134,9,999999999,7,0.1330,0,88,0.101,0.0,0.0 +2008,3,28,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,-2.8,42,101475,0,647,323,0,0,0,0,0,0,0,250,3.1,10,10,9656.0,2896,9,999999999,7,0.1330,0,88,0.101,0.0,0.0 +2008,3,28,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.9,-2.8,42,101475,0,0,323,0,0,0,0,0,0,0,250,3.1,10,10,9656.0,2896,9,999999999,7,0.1330,0,88,0.101,0.0,0.0 +2008,3,28,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,-2.2,46,101584,0,0,321,0,0,0,0,0,0,0,250,5.7,10,10,9656.0,1829,9,999999999,8,0.1330,0,88,0.101,0.0,0.0 +2008,3,28,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,-2.2,46,101564,0,0,321,0,0,0,0,0,0,0,270,4.1,10,10,9656.0,1676,0,919999999,8,0.1330,0,88,0.101,0.0,0.0 +2008,3,28,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.3,-2.2,46,101564,0,0,321,0,0,0,0,0,0,0,270,4.1,10,10,9656.0,1676,0,919999999,8,0.1330,0,88,0.101,0.0,0.0 +2008,3,28,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,0.6,68,101434,0,0,314,0,0,0,0,0,0,0,170,3.1,10,10,9656.0,1280,0,919999999,11,0.1330,0,88,0.101,0.0,0.0 +2008,3,29,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,1.7,73,101414,0,0,315,0,0,0,0,0,0,0,140,1.5,10,10,9656.0,1676,0,919999999,12,0.1350,0,88,0.101,0.0,0.0 +2008,3,29,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.1,1.7,73,101414,0,0,315,0,0,0,0,0,0,0,140,1.5,10,10,9656.0,1676,0,919999999,12,0.1350,0,88,0.101,0.0,0.0 +2008,3,29,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,1.7,83,101334,0,0,307,0,0,0,0,0,0,0,30,4.1,10,10,9656.0,1219,0,919999999,12,0.1350,0,88,0.101,3.0,0.0 +2008,3,29,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.0,2.0,87,101279,0,0,306,0,0,0,0,0,0,0,40,7.2,10,10,9656.0,610,0,919999999,12,0.1350,0,88,0.101,0.3,0.0 +2008,3,29,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.9,1.7,86,101224,0,0,305,0,0,0,0,0,0,0,40,6.7,10,10,9656.0,610,0,919999999,12,0.1350,0,88,0.101,0.0,0.0 +2008,3,29,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,1.7,89,101184,0,0,303,0,0,0,0,0,0,0,70,5.7,10,10,9656.0,244,0,919999999,12,0.1350,0,88,0.101,0.0,0.0 +2008,3,29,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,1.7,92,101134,222,1153,300,2,0,2,196,0,197,89,60,6.7,10,10,9656.0,183,0,919999999,12,0.1350,0,88,0.101,0.0,0.0 +2008,3,29,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,1.7,92,101134,474,1371,300,10,0,10,1001,0,1009,484,60,6.7,10,10,9656.0,183,0,919999999,12,0.1350,0,88,0.101,0.0,0.0 +2008,3,29,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,1.1,89,101064,696,1371,300,16,0,16,1632,0,1646,833,50,5.7,10,10,9656.0,183,0,919999999,11,0.1350,0,88,0.101,0.0,0.0 +2008,3,29,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,1.1,89,101084,874,1371,300,59,0,59,6106,0,6161,3111,40,5.7,10,10,9656.0,183,0,919999999,11,0.1350,0,88,0.101,0.0,0.0 +2008,3,29,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,1.1,89,101084,995,1371,300,66,0,66,6898,0,6962,3578,40,5.7,10,10,9656.0,183,0,919099999,11,0.1350,0,88,0.101,0.0,0.0 +2008,3,29,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.0,1.0,87,101279,1052,1371,301,70,0,70,7349,0,7419,3828,20,5.1,10,10,6437.0,183,0,919099999,11,0.1350,0,88,0.101,0.0,0.0 +2008,3,29,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,0.6,85,100994,1040,1371,299,149,2,148,18288,137,18241,7566,20,6.7,10,10,6437.0,244,0,919099999,11,0.1350,0,88,0.101,0.0,0.0 +2008,3,29,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,0.6,85,100994,960,1371,299,133,0,133,13862,0,13991,6720,20,6.7,10,10,6437.0,244,0,919099999,11,0.1350,0,88,0.101,0.0,0.0 +2008,3,29,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,0.6,85,101054,817,1371,299,88,0,88,9067,0,9147,4407,30,8.2,10,10,6437.0,244,0,919099999,11,0.1350,0,88,0.101,0.0,0.0 +2008,3,29,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.0,1.0,93,101279,622,1371,296,83,0,83,8415,0,8485,3803,20,6.7,10,10,2414.0,244,0,919099999,11,0.1350,0,88,0.101,0.0,0.0 +2008,3,29,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,2.2,0.6,89,101174,387,1371,297,34,0,34,3380,0,3406,1490,20,5.1,10,10,2400.0,244,0,919099999,11,0.1350,0,88,0.101,0.0,0.0 +2008,3,29,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.0,1.0,93,101279,129,1371,296,7,0,7,681,0,685,285,10,4.1,10,10,4828.0,274,0,919099999,11,0.1350,0,88,0.101,0.0,0.0 +2008,3,29,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.0,0.0,87,101279,0,672,295,0,0,0,0,0,0,0,350,3.6,10,10,4828.0,274,0,919099999,10,0.1350,0,88,0.101,0.0,0.0 +2008,3,29,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,1.7,0.0,88,101473,0,0,294,0,0,0,0,0,0,0,350,3.6,10,10,4800.0,274,9,999999999,10,0.1350,0,88,0.100,4.0,0.0 +2008,3,29,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.0,0.0,87,101279,0,0,295,0,0,0,0,0,0,0,340,3.6,10,10,4800.0,2134,9,999999999,10,0.1350,0,88,0.100,0.0,0.0 +2008,3,29,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-1.1,81,101643,0,0,285,0,0,0,0,0,0,0,340,1.5,9,9,4800.0,1981,9,999999999,9,0.1350,0,88,0.100,0.0,0.0 +2008,3,29,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.7,-1.1,81,101643,0,0,293,0,0,0,0,0,0,0,340,1.5,10,10,4800.0,1981,9,999999999,9,0.1350,0,88,0.100,0.0,0.0 +2008,3,29,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.0,-1.0,80,101279,0,0,294,0,0,0,0,0,0,0,310,3.1,10,10,4800.0,366,9,999999999,9,0.1350,0,88,0.100,0.0,0.0 +2008,3,30,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.0,-1.0,80,101279,0,0,294,0,0,0,0,0,0,0,310,2.6,10,10,4800.0,1250,0,999099999,9,0.1360,0,88,0.100,0.0,0.0 +2008,3,30,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,1.7,-0.6,84,101773,0,0,293,0,0,0,0,0,0,0,300,5.1,10,10,4800.0,1250,0,999099999,9,0.1360,0,88,0.100,0.0,0.0 +2008,3,30,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-5.6,62,101923,0,0,254,0,0,0,0,0,0,0,320,4.6,3,3,4800.0,77777,0,999099999,6,0.1360,0,88,0.100,0.0,0.0 +2008,3,30,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-6.1,60,102013,0,0,253,0,0,0,0,0,0,0,320,6.7,3,3,4800.0,77777,0,999099999,5,0.1360,0,88,0.100,0.0,0.0 +2008,3,30,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-6.1,60,102013,0,0,243,0,0,0,0,0,0,0,320,6.7,0,0,4800.0,77777,0,999099999,5,0.1360,0,88,0.100,0.0,0.0 +2008,3,30,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-6.7,60,102223,0,0,240,0,0,0,0,0,0,0,310,4.6,0,0,4800.0,77777,0,999099999,5,0.1360,0,88,0.100,0.0,0.0 +2008,3,30,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-6.7,60,102283,229,1192,240,83,320,33,9655,2832,3846,1271,300,5.7,0,0,4800.0,77777,0,999099999,5,0.1360,0,88,0.100,0.0,0.0 +2008,3,30,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-6.7,60,102283,481,1371,251,246,606,62,29324,29530,7408,2703,300,5.7,3,3,4800.0,77777,0,999099999,5,0.1360,0,88,0.100,0.0,0.0 +2008,3,30,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-7.8,48,102373,703,1371,260,441,792,86,53593,48819,10481,4099,330,7.7,5,5,4800.0,77777,0,999099999,5,0.1360,0,88,0.100,0.0,0.0 +2008,3,30,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-8.3,46,102403,880,1371,275,614,868,105,75674,57138,12984,5297,310,5.7,9,9,4800.0,1311,0,999099999,4,0.1360,0,88,0.100,0.0,0.0 +2008,3,30,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.1,-8.3,46,102403,1001,1371,275,452,303,263,52896,25495,30948,11911,310,5.7,9,9,4800.0,1311,0,999099999,4,0.1360,0,88,0.100,0.0,0.0 +2008,3,30,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-8.3,47,102483,1057,1371,273,576,304,347,66504,28051,40315,14833,330,9.8,9,9,4800.0,1311,0,999099999,4,0.1360,0,88,0.100,0.0,0.0 +2008,3,30,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-8.9,45,102523,1045,1371,272,596,324,347,68691,30048,40243,14741,310,7.2,9,9,4800.0,1311,0,999099999,4,0.1360,0,88,0.100,0.0,0.0 +2008,3,30,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.6,-8.9,45,102523,965,1371,257,660,586,238,77420,48053,28065,10863,310,7.2,5,5,4800.0,1311,0,999099999,4,0.1360,0,88,0.100,0.0,0.0 +2008,3,30,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-11.1,36,102583,822,1371,253,647,755,164,76406,56285,19451,7537,300,8.8,3,3,4800.0,77777,0,999099999,3,0.1360,0,88,0.100,0.0,0.0 +2008,3,30,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-11.7,32,102633,627,1371,254,555,853,97,65937,53514,11561,4358,340,7.2,3,3,4800.0,77777,0,999099999,3,0.1360,0,88,0.100,0.0,0.0 +2008,3,30,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-11.7,32,102633,392,1371,254,368,749,79,42132,35867,9073,3062,340,7.2,3,3,4800.0,77777,0,999099999,3,0.1360,0,88,0.100,0.0,0.0 +2008,3,30,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-12.8,33,102822,134,1371,237,172,518,51,18442,1916,5489,1385,320,6.2,0,0,4800.0,77777,0,999099999,3,0.1360,0,88,0.100,0.0,0.0 +2008,3,30,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-13.3,32,102942,0,698,236,0,0,0,0,0,0,0,330,5.1,0,0,4800.0,77777,0,999099999,3,0.1360,0,88,0.100,0.0,0.0 +2008,3,30,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-13.3,32,102942,0,0,236,0,0,0,0,0,0,0,330,5.1,0,0,4800.0,77777,9,999999999,3,0.1360,0,88,0.100,0.0,0.0 +2008,3,30,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-14.4,30,103202,0,0,233,0,0,0,0,0,0,0,320,6.7,0,0,4800.0,77777,9,999999999,2,0.1360,0,88,0.100,0.0,0.0 +2008,3,30,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-15.0,31,103262,0,0,229,0,0,0,0,0,0,0,340,6.7,0,0,4800.0,77777,9,999999999,2,0.1360,0,88,0.100,0.0,0.0 +2008,3,30,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-15.0,31,103262,0,0,229,0,0,0,0,0,0,0,340,6.7,0,0,4800.0,77777,9,999999999,2,0.1360,0,88,0.100,0.0,0.0 +2008,3,30,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-14.4,34,103392,0,0,228,0,0,0,0,0,0,0,330,5.7,0,0,4800.0,77777,9,999999999,2,0.1360,0,88,0.100,0.0,0.0 +2008,3,31,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-14.4,36,103402,0,0,226,0,0,0,0,0,0,0,340,5.1,0,0,4800.0,77777,9,999999999,2,0.1370,0,88,0.100,0.0,0.0 +2008,3,31,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-14.4,36,103402,0,0,226,0,0,0,0,0,0,0,340,5.1,0,0,4800.0,77777,9,999999999,2,0.1370,0,88,0.100,0.0,0.0 +2008,3,31,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-14.4,38,103412,0,0,224,0,0,0,0,0,0,0,330,3.6,0,0,4800.0,77777,9,999999999,2,0.1370,0,88,0.100,0.0,0.0 +2008,3,31,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-14.4,38,103452,0,0,224,0,0,0,0,0,0,0,330,5.1,0,0,4800.0,77777,9,999999999,2,0.1370,0,88,0.100,0.0,0.0 +2008,3,31,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-14.4,38,103452,0,0,224,0,0,0,0,0,0,0,330,5.1,0,0,4800.0,77777,9,999999999,2,0.1370,0,88,0.100,0.0,0.0 +2008,3,31,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-14.4,36,103592,0,0,226,0,0,0,0,0,0,0,320,6.7,0,0,4800.0,77777,9,999999999,2,0.1370,0,88,0.100,0.0,0.0 +2008,3,31,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-14.4,33,103672,237,1231,230,90,372,31,10562,3887,3644,1216,340,5.1,0,0,4800.0,77777,9,999999999,2,0.1370,0,88,0.100,0.0,0.0 +2008,3,31,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-14.4,33,103672,488,1370,230,257,656,59,30831,32513,7093,2602,340,5.1,0,0,4800.0,77777,9,999999999,2,0.1370,0,88,0.100,0.0,0.0 +2008,3,31,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-13.3,29,103782,709,1370,240,455,832,79,55753,51066,9706,3814,310,4.6,0,0,4800.0,77777,9,999999999,3,0.1370,0,88,0.100,0.0,0.0 +2008,3,31,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-12.8,26,103833,887,1370,248,632,914,91,66132,91277,12852,2101,20,2.6,0,0,4800.0,77777,9,999999999,3,0.1370,0,88,0.100,0.0,0.0 +2008,3,31,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-12.8,26,103833,1007,1370,248,765,955,100,79827,95908,13750,2620,20,2.6,0,0,4800.0,77777,9,999999999,3,0.1370,0,88,0.100,0.0,0.0 +2008,3,31,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-10.0,32,103833,1063,1370,253,844,973,105,88059,97999,14251,2977,120,3.6,0,0,4800.0,77777,9,999999999,4,0.1370,0,88,0.100,0.0,0.0 +2008,3,31,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-9.4,33,103813,1050,1370,256,861,971,109,89766,97756,14798,2941,130,4.1,0,0,4800.0,77777,9,999999999,4,0.1370,0,88,0.100,0.0,0.0 +2008,3,31,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-9.4,33,103813,969,1370,256,816,953,110,85061,95620,15149,2512,130,4.1,0,0,4800.0,77777,9,999999999,4,0.1370,0,88,0.100,0.0,0.0 +2008,3,31,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-8.9,33,103823,827,1370,258,712,916,107,86913,60565,13105,5269,120,5.1,0,0,4800.0,77777,9,999999999,4,0.1370,0,88,0.100,0.0,0.0 +2008,3,31,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-8.3,36,103843,631,1370,257,558,849,99,66223,53242,11787,4447,120,4.6,0,0,4800.0,77777,9,999999999,4,0.1370,0,88,0.100,0.0,0.0 +2008,3,31,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-8.3,36,103843,397,1370,257,369,728,84,42076,35830,9609,3224,120,4.6,0,0,4800.0,77777,9,999999999,4,0.1370,0,88,0.100,0.0,0.0 +2008,3,31,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-4.4,57,103842,139,1370,255,173,486,56,18432,3332,5990,1468,120,4.1,0,0,4800.0,77777,9,999999999,7,0.1370,0,88,0.100,0.0,0.0 +2008,3,31,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-7.3,46,103885,0,723,253,0,0,0,0,0,0,0,157,3.3,0,0,4800.0,77777,9,999999999,5,0.1370,0,88,0.100,0.0,0.0 +2008,3,31,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.8,-7.9,45,103900,0,0,253,0,0,0,0,0,0,0,175,3.3,0,0,4800.0,77777,9,999999999,5,0.1370,0,88,0.100,0.0,0.0 +2008,3,31,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.4,-8.1,46,103910,0,0,248,0,0,0,0,0,0,0,197,3.3,0,0,4800.0,77777,9,999999999,5,0.1370,0,88,0.100,0.0,0.0 +2008,3,31,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.4,-8.9,43,103133,0,0,245,0,0,0,0,0,0,0,235,3.6,0,0,4800.0,77777,9,999999999,4,0.1370,0,88,0.100,0.0,0.0 +2008,3,31,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-9.9,38,102368,0,0,245,0,0,0,0,0,0,0,275,4.1,0,0,4800.0,77777,9,999999999,4,0.1370,0,88,0.100,0.0,0.0 +2008,3,31,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.5,-10.8,35,101641,0,0,246,0,0,0,0,0,0,0,315,4.6,0,0,4800.0,77777,9,999999999,3,0.1370,0,88,0.100,0.0,0.0 +2015,4,1,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-12.3,32,100946,0,0,245,0,0,0,0,0,0,0,347,4.5,0,0,4023.0,77777,9,999999999,3,0.1390,0,88,0.100,0.0,0.0 +2015,4,1,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.4,-12.5,33,101011,0,0,245,0,0,0,0,0,0,0,345,3.8,0,0,4023.0,77777,9,999999999,3,0.1390,0,88,0.100,0.0,0.0 +2015,4,1,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.4,-12.8,34,101131,0,0,239,0,0,0,0,0,0,0,340,3.3,0,0,4023.0,77777,9,999999999,3,0.1390,0,88,0.100,0.0,0.0 +2015,4,1,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-13.2,33,101238,0,0,235,0,0,0,0,0,0,0,337,3.0,0,0,4023.0,77777,9,999999999,3,0.1390,0,88,0.100,0.0,0.0 +2015,4,1,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-0.4,-13.5,32,101318,0,0,235,0,0,0,0,0,0,0,337,3.2,0,0,4023.0,77777,9,999999999,3,0.1390,0,88,0.100,0.0,0.0 +2015,4,1,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.3,-13.6,30,101416,0,0,243,0,0,0,0,0,0,0,340,3.7,3,3,4023.0,77777,9,999999999,3,0.1390,0,88,0.100,0.0,0.0 +2015,4,1,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-13.9,30,101423,251,1308,246,95,389,31,11210,5153,3663,1235,340,3.6,3,3,4023.0,77777,9,999999999,2,0.1390,0,88,0.100,0.0,0.0 +2015,4,1,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.0,-13.9,30,101423,502,1368,250,263,674,56,31777,33484,6780,2508,340,3.6,5,5,4023.0,77777,9,999999999,2,0.1390,0,88,0.100,0.0,0.0 +2015,4,1,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-13.3,27,101493,722,1368,259,428,722,97,51765,46578,11768,4604,350,4.6,5,5,4023.0,77777,9,999999999,3,0.1390,0,88,0.100,0.0,0.0 +2015,4,1,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-13.3,24,101494,899,1368,261,603,800,108,74430,53534,13375,5473,330,3.6,3,3,4023.0,77777,9,999999999,3,0.1390,0,88,0.100,0.0,0.0 +2015,4,1,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.9,-13.3,24,101494,1018,1368,261,767,959,93,80191,96392,12812,2597,330,3.6,3,3,4023.0,77777,9,999999999,3,0.1390,0,88,0.100,0.0,0.0 +2015,4,1,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-13.3,21,101494,1073,1368,269,845,975,98,88194,98143,13322,2954,310,8.2,3,3,4023.0,77777,9,999999999,3,0.1390,0,88,0.100,0.0,0.0 +2015,4,1,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-13.9,19,101514,1060,1368,275,862,976,101,89866,98157,13740,2915,310,7.7,5,5,4023.0,77777,9,999999999,2,0.1390,0,88,0.100,0.0,0.0 +2015,4,1,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.7,-13.9,19,101514,979,1368,275,818,963,99,85343,96563,13687,2489,310,7.7,5,5,4023.0,77777,9,999999999,2,0.1390,0,88,0.100,0.0,0.0 +2015,4,1,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,-13.9,17,101544,836,1368,280,716,938,93,74821,93259,13228,1965,310,5.7,5,5,4023.0,77777,9,999999999,2,0.1390,0,88,0.100,0.0,0.0 +2015,4,1,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,-14.4,16,101574,640,1368,281,565,888,82,68202,53837,9926,3805,320,6.2,5,5,4023.0,77777,9,999999999,2,0.1390,0,88,0.100,0.0,0.0 +2015,4,1,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.3,-14.4,16,101574,406,1368,281,379,786,70,43994,36720,8148,2824,320,6.2,5,5,4023.0,77777,9,999999999,2,0.1390,0,88,0.100,0.0,0.0 +2015,4,1,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-15.0,17,101814,149,1368,270,181,564,48,19682,2129,5237,1423,300,7.7,3,3,4023.0,77777,9,999999999,2,0.1390,0,88,0.100,0.0,0.0 +2015,4,1,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-17.2,15,101954,0,774,263,0,0,0,0,0,0,0,310,5.1,3,3,4023.0,77777,9,999999999,2,0.1390,0,88,0.100,0.0,0.0 +2015,4,1,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.6,-17.2,15,101954,0,0,252,0,0,0,0,0,0,0,310,5.1,0,0,4023.0,77777,9,999999999,2,0.1390,0,88,0.866,0.0,0.0 +2015,4,1,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-15.0,22,102063,0,0,245,0,0,0,0,0,0,0,10,1.5,0,0,4023.0,77777,9,999999999,2,0.1390,0,88,0.866,0.0,0.0 +2015,4,1,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-15.0,22,102113,0,0,245,0,0,0,0,0,0,0,337,0.0,0,0,4023.0,77777,9,999999999,2,0.1390,0,88,0.866,0.0,0.0 +2015,4,1,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,-15.0,22,102113,0,0,245,0,0,0,0,0,0,0,331,0.0,0,0,4023.0,77777,9,999999999,2,0.1390,0,88,0.866,0.0,0.0 +2015,4,1,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-13.3,26,102123,0,0,246,0,0,0,0,0,0,0,290,2.1,0,0,4023.0,77777,9,999999999,3,0.1390,0,88,0.866,0.0,0.0 +2015,4,2,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-12.8,28,102173,0,0,245,0,0,0,0,0,0,0,280,2.6,0,0,4023.0,77777,9,999999999,3,0.1400,0,88,0.866,0.0,0.0 +2015,4,2,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.2,-12.8,28,102173,0,0,245,0,0,0,0,0,0,0,280,2.6,0,0,4023.0,77777,9,999999999,3,0.1400,0,88,0.866,0.0,0.0 +2015,4,2,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-12.2,31,102203,0,0,243,0,0,0,0,0,0,0,290,3.6,0,0,4023.0,77777,9,999999999,3,0.1400,0,88,0.866,0.0,0.0 +2015,4,2,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-11.7,34,102243,0,0,242,0,0,0,0,0,0,0,270,2.1,0,0,4023.0,77777,9,999999999,3,0.1400,0,88,0.866,0.0,0.0 +2015,4,2,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.1,-11.7,34,102243,0,0,252,0,0,0,0,0,0,0,270,2.1,3,3,4023.0,77777,9,999999999,3,0.1400,0,88,0.866,0.0,0.0 +2015,4,2,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-8.9,49,102363,0,0,267,0,0,0,0,0,0,0,210,2.1,9,9,4023.0,7620,9,999999999,4,0.1400,0,88,0.866,0.0,0.0 +2015,4,2,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-9.4,43,102383,258,1347,272,77,237,36,9000,3846,4215,1413,170,1.5,9,9,4023.0,3658,9,999999999,4,0.1400,0,88,0.866,0.0,0.0 +2015,4,2,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.6,-9.4,43,102383,508,1367,279,135,123,108,15516,7553,12457,4356,170,1.5,10,10,4023.0,3658,9,999999999,4,0.1400,0,88,0.866,0.0,0.0 +2015,4,2,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-10.6,31,102353,729,1367,292,291,216,189,33449,17060,21827,7913,220,4.1,10,10,4023.0,2896,9,999999999,3,0.1400,0,88,0.866,0.0,0.0 +2015,4,2,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-11.7,25,102294,905,1367,298,346,120,274,39792,10580,31688,11622,210,4.1,10,10,4023.0,2438,9,999999999,3,0.1400,0,88,0.866,0.0,0.0 +2015,4,2,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.6,-11.7,25,102294,1024,1367,298,550,370,278,64353,31755,32712,12548,210,4.1,10,10,4023.0,2438,9,999999999,3,0.1400,0,88,0.866,0.0,0.0 +2015,4,2,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,-5.6,29,101955,1078,1367,320,615,386,314,71783,33782,36871,14007,220,6.2,9,9,4023.0,1981,9,999999999,6,0.1400,0,88,0.866,0.0,0.0 +2015,4,2,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,-3.9,29,101765,1065,1367,332,722,547,292,84556,46547,34397,13229,220,8.2,9,9,4023.0,6096,9,999999999,7,0.1400,0,88,0.866,0.0,0.0 +2015,4,2,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,-3.9,29,101765,983,1367,314,764,699,242,89713,56712,28568,11112,220,8.2,5,5,4023.0,6096,9,999999999,7,0.1400,0,88,0.866,0.0,0.0 +2015,4,2,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,-0.6,35,101455,840,1367,323,702,743,205,81585,57955,23942,9068,190,10.3,5,5,4023.0,77777,9,999999999,9,0.1400,0,88,0.866,0.0,0.0 +2015,4,2,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,0.6,40,101455,645,1367,322,554,712,165,63222,51904,18914,6709,190,7.2,5,5,4023.0,77777,9,999999999,10,0.1400,0,88,0.866,0.0,0.0 +2015,4,2,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.9,0.6,40,101455,410,1367,322,371,628,120,41177,36640,13374,4200,190,7.2,5,5,4023.0,77777,9,999999999,10,0.1400,0,88,0.866,0.0,0.0 +2015,4,2,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,-1.7,36,101345,153,1367,314,176,416,71,18519,7770,7504,1684,220,10.8,5,5,4023.0,77777,9,999999999,8,0.1400,0,88,0.866,0.0,0.0 +2015,4,2,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,-1.7,39,101315,0,799,328,0,0,0,0,0,0,0,220,7.7,9,9,4023.0,9144,9,999999999,8,0.1400,0,88,0.866,0.0,0.0 +2015,4,2,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,-1.7,39,101315,0,0,321,0,0,0,0,0,0,0,220,7.7,8,8,4023.0,9144,9,999999999,8,0.1400,0,88,0.866,0.0,0.0 +2015,4,2,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,-3.3,35,101205,0,0,332,0,0,0,0,0,0,0,210,7.2,10,10,4023.0,6096,9,999999999,7,0.1400,0,88,0.866,0.0,0.0 +2015,4,2,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,-2.2,39,101175,0,0,334,0,0,0,0,0,0,0,220,8.8,10,10,4023.0,2896,9,999999999,8,0.1400,0,88,0.866,0.0,0.0 +2015,4,2,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.1,-2.2,39,101175,0,0,334,0,0,0,0,0,0,0,220,8.8,10,10,4023.0,2896,9,999999999,8,0.1400,0,88,0.866,0.0,0.0 +2015,4,2,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,3.9,66,101075,0,0,336,0,0,0,0,0,0,0,220,8.2,10,10,4023.0,2134,9,999999999,14,0.1400,0,88,0.866,0.0,0.0 +2015,4,3,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,5.6,74,100885,0,0,338,0,0,0,0,0,0,0,230,6.7,10,10,4023.0,2134,9,999999999,17,0.1420,0,88,0.866,0.0,0.0 +2015,4,3,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.0,5.6,74,100885,0,0,338,0,0,0,0,0,0,0,230,6.7,10,10,4023.0,2134,9,999999999,17,0.1420,0,88,0.866,0.0,0.0 +2015,4,3,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,5.0,66,100715,0,0,333,0,0,0,0,0,0,0,220,8.2,9,9,4023.0,3048,9,999999999,16,0.1420,0,88,0.866,0.0,0.0 +2015,4,3,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,4.4,61,100705,0,0,344,0,0,0,0,0,0,0,230,9.8,10,10,4023.0,3353,9,999999999,15,0.1420,0,88,0.866,0.0,0.0 +2015,4,3,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,4.4,61,100705,0,0,344,0,0,0,0,0,0,0,230,9.8,10,10,4023.0,3353,9,999999999,15,0.1420,0,88,0.866,0.0,0.0 +2015,4,3,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,5.6,69,100805,4,19,343,0,0,0,0,0,0,0,230,7.7,10,10,4023.0,4877,9,999999999,17,0.1420,0,88,0.866,0.0,0.0 +2015,4,3,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,5.6,66,100805,266,1367,346,53,62,44,6091,1046,5068,1681,230,6.7,10,10,4023.0,4877,9,999999999,17,0.1420,0,88,0.866,0.0,0.0 +2015,4,3,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,5.6,66,100805,515,1367,346,95,66,84,11115,3443,9858,3587,230,6.7,10,10,4023.0,4877,9,999999999,17,0.1420,0,88,0.866,0.0,0.0 +2015,4,3,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,6.7,74,100855,735,1367,344,172,36,158,19993,2493,18446,6953,230,4.6,10,10,4023.0,3048,0,919999999,19,0.1420,0,88,0.866,0.0,0.0 +2015,4,3,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,6.7,71,100875,911,1367,347,170,5,167,20256,347,19988,8009,220,4.1,10,10,4023.0,3048,0,919999999,19,0.1420,0,88,0.866,0.0,0.0 +2015,4,3,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,6.7,71,100875,1029,1367,347,347,85,283,40405,6916,33145,12745,220,4.1,10,10,4023.0,3048,0,919999999,19,0.1420,0,88,0.866,0.0,0.0 +2015,4,3,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,8.9,70,100846,1084,1367,363,490,211,322,56873,17559,37605,14287,230,5.1,10,10,4023.0,3048,0,919999999,24,0.1420,0,88,0.866,0.0,0.0 +2015,4,3,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,7.8,65,100846,1069,1367,362,487,131,383,55664,11901,44068,15899,240,4.1,10,10,4023.0,3353,0,919999999,21,0.1420,0,88,0.866,0.0,0.0 +2015,4,3,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,14.4,7.8,65,100846,988,1367,362,418,92,347,47565,8223,39738,14287,240,4.1,10,10,4023.0,3353,0,919999999,21,0.1420,0,88,0.866,0.0,0.0 +2015,4,3,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,8.3,69,100746,844,1367,360,309,42,280,34946,3562,31851,11288,210,5.1,10,10,4023.0,1981,0,919999999,22,0.1420,0,88,0.866,0.0,0.0 +2015,4,3,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,8.9,72,100726,649,1367,360,246,43,222,27343,3426,24807,8176,210,3.6,10,10,4023.0,3048,0,919999999,24,0.1420,0,88,0.866,0.0,0.0 +2015,4,3,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.9,8.9,72,100726,415,1367,360,167,44,150,18158,2792,16388,4794,210,3.6,10,10,4023.0,3048,0,919999999,24,0.1420,0,88,0.866,0.0,0.0 +2015,4,3,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,8.9,77,100785,158,1367,355,92,37,81,9557,808,8455,1753,200,3.6,10,10,4023.0,3353,0,919999999,24,0.1420,0,88,0.866,0.0,0.0 +2015,4,3,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,8.9,89,100675,0,824,344,0,0,0,0,0,0,0,190,3.6,10,10,4023.0,3353,0,919999999,24,0.1420,0,88,0.866,0.0,0.0 +2015,4,3,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.6,8.9,89,100675,0,0,335,0,0,0,0,0,0,0,190,3.6,9,9,4023.0,3353,9,999999999,24,0.1420,0,88,0.100,5.0,0.0 +2015,4,3,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,10.0,96,100585,0,0,336,0,0,0,0,0,0,0,230,2.1,9,9,4023.0,3048,9,999999999,27,0.1420,0,88,0.100,5.0,0.0 +2015,4,3,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,8.3,8.3,100,100465,0,0,323,0,0,0,0,0,0,0,170,2.6,9,9,8047.0,3048,9,999999999,22,0.1420,0,88,0.100,0.7,0.0 +2015,4,3,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,8.3,8.3,100,100465,0,0,332,0,0,0,0,0,0,0,170,2.6,10,10,8000.0,3048,9,999999999,22,0.1420,0,88,0.100,0.0,0.0 +2015,4,3,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,8.0,8.0,100,101280,0,0,331,0,0,0,0,0,0,0,224,0.0,10,10,4023.0,1402,9,999999999,22,0.1420,0,88,0.100,0.0,0.0 +2015,4,4,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,8.0,8.0,100,101280,0,0,331,0,0,0,0,0,0,0,160,4.1,10,10,1207.0,610,0,919999999,22,0.1430,0,88,0.100,0.0,0.0 +2015,4,4,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,7.8,7.8,100,100075,0,0,330,0,0,0,0,0,0,0,170,2.6,10,10,800.0,610,0,919999999,21,0.1430,0,88,0.100,0.0,0.0 +2015,4,4,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,8.0,8.0,100,101280,0,0,331,0,0,0,0,0,0,0,181,0.0,10,10,805.0,152,0,919999999,22,0.1430,0,88,0.100,0.0,0.0 +2015,4,4,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.8,7.8,100,99595,0,0,291,0,0,0,0,0,0,0,119,1.0,1,1,402.0,61,0,919999999,21,0.1430,0,88,0.100,0.0,0.0 +2015,4,4,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,8.0,8.0,100,101280,0,0,322,0,0,0,0,0,0,0,304,2.1,9,9,805.0,122,0,019999999,22,0.1430,0,88,0.100,0.0,0.0 +2015,4,4,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,9.0,9.0,100,101280,11,58,337,0,0,0,0,0,0,0,220,3.1,10,10,4828.0,396,0,019999999,24,0.1430,0,88,0.100,0.0,0.0 +2015,4,4,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.0,8.0,93,101280,273,1366,335,16,6,15,1999,28,1874,649,300,4.6,10,10,4828.0,1067,0,019999999,22,0.1430,0,88,0.100,0.0,0.0 +2015,4,4,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.9,7.8,93,99675,522,1366,335,68,6,67,8102,286,8003,2975,290,5.7,10,10,4828.0,1067,0,019999999,21,0.1430,0,88,0.100,0.0,0.0 +2015,4,4,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,5.6,74,99935,741,1366,328,199,50,173,23004,3605,20090,7487,280,7.7,9,9,4828.0,1676,0,019999999,17,0.1430,0,88,0.100,0.0,0.0 +2015,4,4,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,3.3,63,99965,916,1366,326,489,429,214,57285,32926,25196,9792,280,9.3,9,9,4828.0,3048,0,019999999,14,0.1430,0,88,0.100,0.0,0.0 +2015,4,4,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.0,3.3,63,99965,1035,1366,326,558,376,302,64782,31886,35270,13384,280,9.3,9,9,4828.0,3048,0,019999999,14,0.1430,0,88,0.100,0.0,0.0 +2015,4,4,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,0.0,50,100175,1089,1366,322,514,180,375,59183,16634,43460,15841,310,11.3,9,9,4828.0,1676,0,019999999,10,0.1430,0,88,0.100,0.0,0.0 +2015,4,4,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,-3.3,41,100375,1074,1366,291,790,768,181,96112,55781,22123,9087,300,11.3,3,3,4828.0,77777,0,019999999,7,0.1430,0,88,0.100,0.0,0.0 +2015,4,4,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.9,-3.3,41,100375,992,1366,296,813,928,110,85134,93597,15088,2639,300,11.3,5,5,4828.0,77777,0,019999999,7,0.1430,0,88,0.100,0.0,0.0 +2015,4,4,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,-5.6,36,100695,849,1366,289,717,913,100,88265,58995,12349,5014,300,13.4,5,5,4828.0,77777,0,019999999,6,0.1430,0,88,0.100,0.0,0.0 +2015,4,4,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,-7.2,33,100855,653,1366,280,570,868,89,68501,53120,10727,4119,290,13.4,3,3,4828.0,77777,0,019999999,5,0.1430,0,88,0.100,0.0,0.0 +2015,4,4,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.2,-7.2,33,100855,419,1366,280,386,774,74,44735,37075,8601,2991,290,13.4,3,3,4828.0,77777,0,019999999,5,0.1430,0,88,0.100,0.0,0.0 +2015,4,4,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-9.4,30,101154,163,1366,271,190,573,50,20742,3893,5476,1524,320,9.8,3,3,4828.0,77777,0,019999999,4,0.1430,0,88,0.100,0.0,0.0 +2015,4,4,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-10.0,31,101334,0,849,255,0,0,0,0,0,0,0,330,6.2,0,0,4828.0,77777,0,019999999,4,0.1430,0,88,0.100,0.0,0.0 +2015,4,4,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,4.4,-10.0,31,101334,0,0,255,0,0,0,0,0,0,0,330,6.2,0,0,4828.0,77777,9,999999999,4,0.1430,0,88,0.100,0.0,0.0 +2015,4,4,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-8.9,37,101634,0,0,252,0,0,0,0,0,0,0,300,4.1,0,0,4828.0,77777,9,999999999,4,0.1430,0,88,0.100,0.0,0.0 +2015,4,4,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-10.6,32,101724,0,0,251,0,0,0,0,0,0,0,280,4.1,0,0,4828.0,77777,9,999999999,3,0.1430,0,88,0.100,0.0,0.0 +2015,4,4,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,-10.6,32,101724,0,0,251,0,0,0,0,0,0,0,280,4.1,0,0,4828.0,77777,9,999999999,3,0.1430,0,88,0.100,0.0,0.0 +2015,4,4,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-9.4,38,101833,0,0,248,0,0,0,0,0,0,0,260,4.6,0,0,4828.0,77777,9,999999999,4,0.1430,0,88,0.100,0.0,0.0 +2015,4,5,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-8.9,40,101863,0,0,248,0,0,0,0,0,0,0,260,4.6,0,0,4828.0,77777,9,999999999,4,0.1440,0,88,0.100,4.9,0.0 +2015,4,5,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.2,-8.9,40,101863,0,0,248,0,0,0,0,0,0,0,260,4.6,0,0,4828.0,77777,9,999999999,4,0.1440,0,88,0.100,0.0,0.0 +2015,4,5,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-7.8,49,101843,0,0,254,0,0,0,0,0,0,0,230,4.6,3,3,4828.0,77777,9,999999999,5,0.1440,0,88,0.100,0.0,0.0 +2015,4,5,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-7.2,54,101883,0,0,252,0,0,0,0,0,0,0,220,5.7,3,3,4828.0,77777,9,999999999,5,0.1440,0,88,0.100,0.0,0.0 +2015,4,5,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.0,-7.2,54,101883,0,0,252,0,0,0,0,0,0,0,220,5.7,3,3,4828.0,77777,9,999999999,5,0.1440,0,88,0.100,0.0,0.0 +2015,4,5,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-7.2,52,101853,18,98,259,0,0,0,0,0,0,0,220,4.6,5,5,4828.0,77777,9,999999999,5,0.1440,0,88,0.100,0.0,0.0 +2015,4,5,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-7.2,46,101883,280,1365,265,104,345,40,12144,7312,4680,1579,220,7.2,5,5,4828.0,77777,9,999999999,5,0.1440,0,88,0.100,0.0,0.0 +2015,4,5,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.2,-7.2,46,101883,529,1365,261,272,603,74,32342,32722,8822,3256,220,7.2,3,3,4828.0,77777,9,999999999,5,0.1440,0,88,0.100,0.0,0.0 +2015,4,5,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-8.3,33,101924,748,1365,273,464,762,99,56259,49079,12041,4750,270,10.8,3,3,4828.0,77777,9,999999999,4,0.1440,0,88,0.100,0.0,0.0 +2015,4,5,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-9.4,28,101934,922,1365,276,631,831,119,77588,56307,14685,6022,250,9.3,3,3,4828.0,77777,9,999999999,4,0.1440,0,88,0.100,0.0,0.0 +2015,4,5,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.7,-9.4,28,101934,1040,1365,280,745,812,161,91102,58428,19773,8150,250,9.3,5,5,4828.0,77777,9,999999999,4,0.1440,0,88,0.100,0.0,0.0 +2015,4,5,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,-11.7,19,101874,1093,1365,306,626,385,331,73006,34612,38839,14623,260,8.2,9,9,4828.0,7620,9,999999999,3,0.1440,0,88,0.100,0.0,0.0 +2015,4,5,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,-8.9,28,101904,1079,1365,299,527,168,392,60490,16212,45291,16207,270,9.8,9,9,4828.0,2134,9,999999999,4,0.1440,0,88,0.100,0.0,0.0 +2015,4,5,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.2,-8.9,28,101904,997,1365,308,434,97,359,49552,9263,41249,14676,270,9.8,10,10,4828.0,2134,9,999999999,4,0.1440,0,88,0.100,0.0,0.0 +2015,4,5,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-6.1,37,101914,853,1365,309,331,66,286,37595,5951,32671,11525,260,7.7,10,10,4828.0,2134,9,999999999,5,0.1440,0,88,0.100,0.0,0.0 +2015,4,5,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-4.4,43,101934,658,1365,311,247,59,215,27700,4900,24235,8103,250,7.7,10,10,4828.0,1829,9,999999999,6,0.1440,0,88,0.100,0.0,0.0 +2015,4,5,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.7,-4.4,43,101934,424,1365,311,107,36,87,12251,1844,9993,3411,250,7.7,10,10,4828.0,1829,9,999999999,6,0.1440,0,88,0.100,0.0,0.0 +2015,4,5,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-2.2,58,102014,167,1365,306,49,48,42,5434,42,4671,1384,240,4.1,10,10,4828.0,1402,9,999999999,8,0.1440,0,88,0.100,0.0,0.0 +2015,4,5,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-2.2,61,102044,0,874,295,0,0,0,0,0,0,0,230,6.2,9,9,4828.0,1676,9,999999999,8,0.1440,0,88,0.100,5.0,0.0 +2015,4,5,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,4.4,-2.2,61,102044,0,0,278,0,0,0,0,0,0,0,230,6.2,5,5,4828.0,1676,9,999999999,8,0.1440,0,88,0.100,0.0,0.0 +2015,4,5,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-1.1,72,102243,0,0,291,0,0,0,0,0,0,0,240,5.7,9,9,4828.0,2896,9,999999999,9,0.1440,0,88,0.100,0.0,0.0 +2015,4,5,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-1.1,72,102313,0,0,291,0,0,0,0,0,0,0,230,6.2,9,9,4828.0,3048,9,999999999,9,0.1440,0,88,0.100,0.0,0.0 +2015,4,5,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,-1.1,72,102313,0,0,300,0,0,0,0,0,0,0,230,6.2,10,10,4828.0,3048,9,999999999,9,0.1440,0,88,0.100,0.0,0.0 +2015,4,5,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-2.2,66,102473,0,0,298,0,0,0,0,0,0,0,240,4.1,10,10,4828.0,7620,9,999999999,8,0.1440,0,88,0.100,0.0,0.0 +2015,4,6,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-2.2,66,102503,0,0,298,0,0,0,0,0,0,0,250,2.6,10,10,4828.0,7620,9,999999999,8,0.1450,0,88,0.100,0.0,0.0 +2015,4,6,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,-2.2,66,102503,0,0,298,0,0,0,0,0,0,0,250,2.6,10,10,4828.0,7620,9,999999999,8,0.1450,0,88,0.100,0.0,0.0 +2015,4,6,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-1.7,71,102583,0,0,297,0,0,0,0,0,0,0,200,3.1,10,10,4828.0,3048,9,999999999,8,0.1450,0,88,0.100,0.0,0.0 +2015,4,6,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-1.7,71,102703,0,0,297,0,0,0,0,0,0,0,250,2.1,10,10,4828.0,3353,9,999999999,8,0.1450,0,88,0.100,0.0,0.0 +2015,4,6,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,-1.7,71,102703,0,0,297,0,0,0,0,0,0,0,250,2.1,10,10,4828.0,3353,9,999999999,8,0.1450,0,88,0.100,0.0,0.0 +2015,4,6,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-2.8,60,102833,26,137,300,2,0,2,193,0,194,79,209,0.0,10,10,4828.0,3658,9,999999999,8,0.1450,0,88,0.100,0.0,0.0 +2015,4,6,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-2.8,60,102863,287,1364,300,64,77,48,7378,1893,5547,1849,40,1.5,10,10,4828.0,2743,9,999999999,8,0.1450,0,88,0.100,0.0,0.0 +2015,4,6,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.9,-2.8,60,102863,535,1364,300,230,272,129,26196,17841,14751,5100,40,1.5,10,10,4828.0,2743,9,999999999,8,0.1450,0,88,0.100,0.0,0.0 +2015,4,6,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-3.3,53,102883,754,1364,296,413,437,198,47467,34427,22867,8347,80,3.6,9,9,4828.0,6096,9,999999999,7,0.1450,0,88,0.100,0.0,0.0 +2015,4,6,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-3.3,55,102863,928,1364,302,426,249,281,49026,21649,32523,12016,80,4.6,10,10,4828.0,3353,9,999999999,7,0.1450,0,88,0.100,0.0,0.0 +2015,4,6,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-1.7,61,102793,1045,1364,306,608,426,292,70996,36194,34296,13137,80,5.1,10,10,4828.0,6096,9,999999999,8,0.1450,0,88,0.100,0.0,0.0 +2015,4,6,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-2.8,55,102733,1098,1364,297,651,403,330,75891,35481,38707,14622,70,5.7,9,9,4828.0,7620,9,999999999,8,0.1450,0,88,0.100,0.0,0.0 +2015,4,6,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-2.8,55,102623,1083,1364,297,764,620,269,90300,50760,31973,12542,80,5.7,9,9,4828.0,6096,9,999999999,8,0.1450,0,88,0.100,0.0,0.0 +2015,4,6,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.0,-2.8,55,102623,1001,1364,297,676,514,284,78608,43891,33214,12616,80,5.7,9,9,4828.0,6096,9,999999999,8,0.1450,0,88,0.100,0.0,0.0 +2015,4,6,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-0.6,67,102413,857,1364,299,608,557,225,70365,44809,26174,9830,80,6.7,9,9,4828.0,9754,9,999999999,9,0.1450,0,88,0.100,0.0,0.0 +2015,4,6,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,0.6,73,102334,662,1364,300,434,391,207,48807,31391,23397,7952,70,6.7,9,9,4828.0,9754,9,999999999,11,0.1450,0,88,0.100,0.0,0.0 +2015,4,6,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.0,0.6,73,102334,428,1364,309,295,341,145,32395,22470,15996,4823,70,6.7,10,10,4828.0,9754,9,999999999,11,0.1450,0,88,0.100,0.0,0.0 +2015,4,6,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,1.1,79,102353,172,1364,307,148,210,80,15564,5299,8451,1903,60,5.1,10,10,4828.0,9754,9,999999999,11,0.1450,0,88,0.100,0.0,0.0 +2015,4,6,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,1.7,86,102273,0,899,305,0,0,0,0,0,0,0,110,5.1,10,10,4828.0,6096,9,999999999,12,0.1450,0,88,0.100,0.0,0.0 +2015,4,6,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.9,1.7,86,102273,0,0,280,0,0,0,0,0,0,0,110,5.1,5,5,4828.0,6096,9,999999999,12,0.1450,0,88,0.097,0.0,0.0 +2015,4,6,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,2.2,89,102313,0,0,281,0,0,0,0,0,0,0,70,3.1,5,5,4828.0,77777,9,999999999,12,0.1450,0,88,0.097,0.0,0.0 +2015,4,6,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,2.8,93,102303,0,0,306,0,0,0,0,0,0,0,50,2.1,10,10,4828.0,3353,9,999999999,13,0.1450,0,88,0.097,0.0,0.0 +2015,4,6,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.9,2.8,93,102303,0,0,306,0,0,0,0,0,0,0,50,2.1,10,10,4828.0,3353,9,999999999,13,0.1450,0,88,0.097,0.0,0.0 +2015,4,6,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.0,3.0,93,101279,0,0,307,0,0,0,0,0,0,0,30,2.6,10,10,4828.0,3353,9,999999999,13,0.1450,0,88,0.097,0.0,0.0 +2015,4,7,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,2.8,89,102273,0,0,309,0,0,0,0,0,0,0,10,2.1,10,10,4828.0,274,9,999999999,13,0.1460,0,88,0.097,0.0,0.0 +2015,4,7,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,4.4,2.8,89,102273,0,0,309,0,0,0,0,0,0,0,10,2.1,10,10,4828.0,274,9,999999999,13,0.1460,0,88,0.097,0.0,0.0 +2015,4,7,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,2.2,89,102243,0,0,306,0,0,0,0,0,0,0,360,3.1,10,10,4828.0,274,9,999999999,12,0.1460,0,88,0.097,0.0,0.0 +2015,4,7,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,2.2,89,102303,0,0,306,0,0,0,0,0,0,0,20,4.6,10,10,4828.0,213,9,999999999,12,0.1460,0,88,0.097,0.0,0.0 +2015,4,7,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.9,2.2,89,102303,0,0,306,0,0,0,0,0,0,0,20,4.6,10,10,4828.0,213,0,919999999,12,0.1460,0,88,0.097,0.0,0.0 +2015,4,7,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,2.2,92,102383,33,176,303,1,0,1,96,0,97,40,350,3.1,10,10,4828.0,213,0,919999999,12,0.1460,0,88,0.097,0.0,0.0 +2015,4,7,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,2.2,89,102463,294,1363,306,50,29,44,5810,655,5124,1735,360,3.6,10,10,4828.0,213,0,919999999,12,0.1460,0,88,0.097,0.0,0.0 +2015,4,7,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.9,2.2,89,102463,542,1363,306,130,45,112,14977,2729,12951,4616,360,3.6,10,10,4828.0,213,0,919999999,12,0.1460,0,88,0.097,0.0,0.0 +2015,4,7,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,2.8,89,102553,760,1363,309,104,1,103,12570,62,12490,4949,30,5.1,10,10,4828.0,244,0,919999999,13,0.1460,0,88,0.097,0.0,0.0 +2015,4,7,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.0,2.0,87,101279,933,1363,306,112,0,112,11648,0,11756,5731,20,5.7,10,10,4828.0,305,0,919999999,12,0.1460,0,88,0.097,0.0,0.0 +2015,4,7,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.0,2.2,82,102603,1050,1363,311,199,6,194,23978,437,23488,9574,30,5.1,10,10,4828.0,305,0,919999999,12,0.1460,0,88,0.097,0.0,0.0 +2015,4,7,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,2.0,81,101279,1103,1363,310,191,5,188,23240,357,22985,9448,30,5.1,10,10,4828.0,427,0,919999999,12,0.1460,0,88,0.097,0.0,0.0 +2015,4,7,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.0,3.0,93,101279,1088,1363,307,246,10,237,29338,766,28416,11386,30,6.2,10,10,4828.0,457,0,919999999,13,0.1460,0,88,0.097,0.0,0.0 +2015,4,7,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,4.4,2.8,89,102633,1005,1363,309,234,9,226,27679,692,26872,10658,30,6.2,10,10,4828.0,457,0,919999999,13,0.1460,0,88,0.097,0.0,0.0 +2015,4,7,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,2.2,86,102643,861,1363,308,185,5,182,21770,368,21516,8388,40,4.1,10,10,4828.0,1067,0,919999999,12,0.1460,0,88,0.097,0.0,0.0 +2015,4,7,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,1.7,86,102693,666,1363,305,97,0,97,9871,0,9954,4471,30,4.1,10,10,4828.0,1158,0,919999999,12,0.1460,0,88,0.097,0.0,0.0 +2015,4,7,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.9,1.7,86,102693,433,1363,305,65,0,65,6486,0,6537,2721,30,4.1,10,10,4828.0,1158,0,919999999,12,0.1460,0,88,0.097,0.0,0.0 +2015,4,7,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,1.1,85,102693,177,1363,302,52,0,52,5078,0,5113,1623,80,3.1,10,10,4828.0,2134,0,919999999,11,0.1460,0,88,0.097,0.0,0.0 +2015,4,7,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,1.7,89,102753,0,924,294,0,0,0,0,0,0,0,80,2.1,9,9,4828.0,2743,0,919999999,12,0.1460,0,88,0.097,0.0,0.0 +2015,4,7,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,1.7,89,102773,0,0,294,0,0,0,0,0,0,0,70,2.1,9,9,4828.0,3048,9,999999999,12,0.1460,0,88,0.097,1.0,0.0 +2015,4,7,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,1.7,89,102873,0,0,294,0,0,0,0,0,0,0,98,0.0,9,9,4828.0,3353,9,999999999,12,0.1460,0,88,0.097,0.0,0.0 +2015,4,7,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,1.7,89,102863,0,0,303,0,0,0,0,0,0,0,40,1.5,10,10,4828.0,2591,9,999999999,12,0.1460,0,88,0.097,0.0,0.0 +2015,4,7,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,1.1,89,102863,0,0,275,0,0,0,0,0,0,0,50,0.0,5,5,4828.0,77777,9,999999999,11,0.1460,0,88,0.097,0.0,0.0 +2015,4,7,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,1.1,92,102843,0,0,257,0,0,0,0,0,0,0,30,2.6,0,0,4828.0,77777,9,999999999,11,0.1460,0,88,0.097,0.0,0.0 +2015,4,8,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,1.1,89,102863,0,0,260,0,0,0,0,0,0,0,20,3.1,0,0,4828.0,77777,9,999999999,11,0.1470,0,88,0.097,0.0,0.0 +2015,4,8,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,1.1,96,102903,0,0,267,0,0,0,0,0,0,0,10,3.1,3,3,4828.0,77777,9,999999999,11,0.1470,0,88,0.097,0.0,0.0 +2015,4,8,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,0.6,92,102943,0,0,270,0,0,0,0,0,0,0,20,3.6,5,5,4828.0,77777,9,999999999,11,0.1470,0,88,0.097,0.0,0.0 +2015,4,8,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,1.1,96,102983,0,0,256,0,0,0,0,0,0,0,20,5.1,0,0,4828.0,77777,9,999999999,11,0.1470,0,88,0.097,0.0,0.0 +2015,4,8,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,0.6,92,103033,0,0,270,0,0,0,0,0,0,0,20,5.7,5,5,4828.0,77777,9,999999999,11,0.1470,0,88,0.097,0.0,0.0 +2015,4,8,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-1.7,74,103073,40,215,270,6,0,6,579,0,583,223,50,7.2,5,5,4828.0,77777,9,999999999,9,0.1470,0,88,0.097,0.0,0.0 +2015,4,8,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-3.3,60,103113,301,1362,289,99,237,50,11431,6506,5787,1941,50,9.3,9,9,4828.0,975,9,999999999,7,0.1470,0,88,0.097,0.0,0.0 +2015,4,8,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-3.9,53,103253,548,1362,277,263,482,90,30918,27898,10613,3894,50,8.2,5,5,4828.0,77777,9,999999999,7,0.1470,0,88,0.097,0.0,0.0 +2015,4,8,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-2.2,63,103233,766,1362,293,347,337,194,40028,26202,22486,8302,60,9.3,9,9,4828.0,4877,9,999999999,8,0.1470,0,88,0.097,0.0,0.0 +2015,4,8,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-2.2,63,103233,939,1362,293,486,360,253,56492,29843,29569,11243,60,9.8,9,9,4828.0,5486,9,999999999,8,0.1470,0,88,0.097,0.0,0.0 +2015,4,8,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-2.2,63,103183,1055,1362,293,454,199,315,52792,17385,36850,13927,50,10.8,9,9,4828.0,4267,9,999999999,8,0.1470,0,88,0.097,0.0,0.0 +2015,4,8,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-2.8,63,103183,1108,1362,298,407,112,321,47622,9723,37788,14393,60,8.8,10,10,4828.0,2743,9,999999999,8,0.1470,0,88,0.097,0.0,0.0 +2015,4,8,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-2.2,68,103153,1092,1362,296,228,11,219,27413,838,26465,10700,60,7.2,10,10,4828.0,2438,9,999999999,8,0.1470,0,88,0.097,0.0,0.0 +2015,4,8,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.0,-2.0,73,101279,1009,1362,293,192,5,188,23080,369,22706,9205,50,8.2,10,10,4828.0,1676,0,919099999,8,0.1470,0,88,0.097,0.0,0.0 +2015,4,8,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.0,-2.0,73,101279,866,1362,293,133,1,132,16071,68,16011,6446,50,7.7,10,10,9656.0,1981,0,919099999,8,0.1470,0,88,0.097,0.0,0.0 +2015,4,8,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.0,-1.0,80,101279,670,1362,294,96,0,96,9781,0,9864,4443,50,8.2,10,10,9656.0,579,0,919099999,9,0.1470,0,88,0.097,0.0,0.0 +2015,4,8,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.2,0.6,89,102913,437,1362,297,100,15,94,11405,789,10758,3668,60,8.8,10,10,8047.0,457,0,919099999,11,0.1470,0,88,0.097,0.0,0.0 +2015,4,8,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.0,1.0,93,101279,181,1362,296,57,15,51,6259,123,5618,1624,60,7.2,10,10,9656.0,518,0,919099999,11,0.1470,0,88,0.097,0.0,0.0 +2015,4,8,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.0,1.0,93,101279,0,948,296,0,0,0,0,0,0,0,70,8.8,10,10,9656.0,396,0,919099999,11,0.1470,0,88,0.097,0.0,0.0 +2015,4,8,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,0.6,89,102873,0,0,297,0,0,0,0,0,0,0,80,8.2,10,10,9656.0,1524,0,919999999,11,0.1470,0,88,0.097,4.0,0.0 +2015,4,8,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.0,1.0,93,101279,0,0,296,0,0,0,0,0,0,0,70,7.7,10,10,9656.0,549,0,919999999,11,0.1470,0,88,0.097,4.0,0.0 +2015,4,8,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,0.0,88,102793,0,0,294,0,0,0,0,0,0,0,60,7.7,10,10,9656.0,457,0,919999999,10,0.1470,0,88,0.097,0.6,0.0 +2015,4,8,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.0,1.0,93,101279,0,0,296,0,0,0,0,0,0,0,60,9.3,10,10,6437.0,335,0,919999999,11,0.1470,0,88,0.097,0.0,0.0 +2015,4,8,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.7,0.6,92,102793,0,0,294,0,0,0,0,0,0,0,60,9.8,10,10,8047.0,335,0,919999999,11,0.1470,0,88,0.097,0.0,0.0 +2015,4,9,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.7,0.0,88,102733,0,0,294,0,0,0,0,0,0,0,60,9.8,10,10,9656.0,335,0,919999999,10,0.1490,0,88,0.097,0.0,0.0 +2015,4,9,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.1,0.0,92,102713,0,0,291,0,0,0,0,0,0,0,60,10.3,10,10,8047.0,335,0,919999999,10,0.1490,0,88,0.097,0.0,0.0 +2015,4,9,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.1,0.0,92,102703,0,0,291,0,0,0,0,0,0,0,50,8.8,10,10,8047.0,305,0,919999999,10,0.1490,0,88,0.097,0.0,0.0 +2015,4,9,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.1,0.0,92,102733,0,0,291,0,0,0,0,0,0,0,50,8.2,10,10,4828.0,305,0,919999999,10,0.1490,0,88,0.097,0.0,0.0 +2015,4,9,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.0,0.0,93,101278,0,0,291,0,0,0,0,0,0,0,50,7.7,10,10,4828.0,213,0,919999999,10,0.1490,0,88,0.097,0.0,0.0 +2015,4,9,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.0,0.0,93,101278,47,253,291,8,0,8,773,0,778,290,40,6.7,10,10,4023.0,213,0,919999999,10,0.1490,0,88,0.097,0.0,0.0 +2015,4,9,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.0,1.0,100,101278,308,1362,292,103,217,58,11768,6550,6644,2201,50,6.7,10,10,2816.0,213,0,919999999,11,0.1490,0,88,0.097,0.0,0.0 +2015,4,9,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.7,1.1,96,102803,555,1362,295,262,428,109,30348,25997,12671,4569,50,9.3,10,10,3219.0,213,0,919999999,11,0.1490,0,88,0.097,0.0,0.0 +2015,4,9,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.0,1.0,93,101279,772,1362,296,216,267,104,26157,16875,12636,5022,50,9.3,10,10,4828.0,213,0,919999999,11,0.1490,0,88,0.097,0.0,0.0 +2015,4,9,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.2,1.7,96,102903,944,1362,298,267,162,186,31786,11886,22247,8893,50,8.8,10,10,4828.0,213,0,919999999,12,0.1490,0,88,0.097,0.0,0.0 +2015,4,9,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.0,2.0,93,101279,1060,1362,302,142,1,141,17553,67,17501,7302,50,7.2,10,10,4023.0,274,0,919999999,12,0.1490,0,88,0.097,0.0,0.0 +2015,4,9,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.0,2.0,93,101279,1112,1362,302,166,3,163,20444,206,20164,8375,50,6.7,10,10,2414.0,213,0,919999999,12,0.1490,0,88,0.097,0.0,0.0 +2015,4,9,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.8,1.7,92,102833,1096,1362,300,496,408,166,60876,28286,20465,8485,60,7.2,10,10,2414.0,152,0,919999999,12,0.1490,0,88,0.097,0.0,0.0 +2015,4,9,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.8,1.7,92,102843,1013,1362,300,614,590,166,74489,41419,20228,8305,50,6.2,10,10,2414.0,213,0,919999999,12,0.1490,0,88,0.097,0.0,0.0 +2015,4,9,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.8,2.2,96,102853,870,1362,301,457,389,168,54191,27890,20010,7904,50,6.7,10,10,2414.0,152,0,919999999,13,0.1490,0,88,0.097,0.0,0.0 +2015,4,9,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.0,2.0,93,101279,674,1362,302,538,687,144,62427,47273,16778,6216,60,5.7,10,10,2414.0,122,0,919999999,12,0.1490,0,88,0.097,0.0,0.0 +2015,4,9,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.0,2.0,93,101279,441,1362,302,360,546,125,40149,33058,13999,4503,50,6.7,10,10,2414.0,183,0,919999999,12,0.1490,0,88,0.097,0.0,0.0 +2015,4,9,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.0,2.0,100,101279,186,1362,297,176,316,85,18541,9150,8995,2063,70,6.7,10,10,2012.0,122,0,919999999,12,0.1490,0,88,0.097,0.0,0.0 +2015,4,9,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.0,2.0,100,101279,0,973,297,0,0,0,0,0,0,0,60,7.2,10,10,2414.0,183,0,919999999,12,0.1490,0,88,0.097,0.0,0.0 +2015,4,9,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.0,2.0,100,101279,0,0,297,0,0,0,0,0,0,0,70,7.7,10,10,2414.0,183,0,919999999,12,0.1490,0,88,0.097,2.0,0.0 +2015,4,9,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.0,2.0,100,101279,0,0,297,0,0,0,0,0,0,0,70,7.2,10,10,2414.0,366,0,919999999,12,0.1490,0,88,0.097,0.3,0.0 +2015,4,9,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.0,2.0,100,101279,0,0,297,0,0,0,0,0,0,0,70,6.2,10,10,3219.0,183,0,919999999,12,0.1490,0,88,0.097,0.0,0.0 +2015,4,9,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.0,2.0,100,101279,0,0,297,0,0,0,0,0,0,0,80,4.6,10,10,3219.0,122,0,919999999,12,0.1490,0,88,0.097,0.0,0.0 +2015,4,9,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.0,2.0,100,101279,0,0,297,0,0,0,0,0,0,0,80,5.1,10,10,3219.0,122,0,919999999,12,0.1490,0,88,0.097,0.0,0.0 +2015,4,10,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.2,2.2,100,102283,0,0,298,0,0,0,0,0,0,0,90,5.1,10,10,2414.0,122,0,919999999,12,0.1500,0,88,0.097,0.0,0.0 +2015,4,10,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.8,2.8,100,102223,0,0,302,0,0,0,0,0,0,0,90,2.6,10,10,2414.0,122,0,919999999,13,0.1500,0,88,0.097,0.0,0.0 +2015,4,10,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.8,2.8,100,101953,0,0,302,0,0,0,0,0,0,0,110,6.2,10,10,2414.0,122,0,919999999,13,0.1500,0,88,0.097,0.0,0.0 +2015,4,10,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.8,2.8,100,101953,0,0,302,0,0,0,0,0,0,0,110,1.5,10,10,2414.0,122,0,919999999,13,0.1500,0,88,0.097,0.0,0.0 +2015,4,10,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.0,3.0,100,101279,0,0,303,0,0,0,0,0,0,0,136,0.0,10,10,2414.0,122,0,919999999,13,0.1500,0,88,0.097,0.0,0.0 +2015,4,10,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.0,3.0,100,101279,55,291,303,1,0,1,97,0,97,41,40,1.5,10,10,3219.0,183,0,919999999,13,0.1500,0,88,0.097,0.0,0.0 +2015,4,10,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.0,3.0,100,101279,314,1361,303,61,64,46,7110,1662,5373,1838,70,1.5,10,10,3219.0,122,0,919999999,13,0.1500,0,88,0.097,0.0,0.0 +2015,4,10,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.0,3.0,100,101279,561,1361,303,162,112,120,18638,7005,13858,4950,140,2.1,10,10,4023.0,122,0,919999999,13,0.1500,0,88,0.097,0.0,0.0 +2015,4,10,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,4.0,4.0,100,101279,778,1361,308,187,64,164,21869,4554,19264,7368,140,2.1,10,10,1609.0,122,0,919999999,15,0.1500,0,88,0.097,0.0,0.0 +2015,4,10,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,4.0,4.0,100,101279,950,1361,308,203,14,195,24083,1030,23246,9264,120,1.5,10,10,3219.0,122,0,919999999,15,0.1500,0,88,0.097,0.0,0.0 +2015,4,10,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,5.0,5.0,100,101279,1065,1361,314,259,15,248,30670,1161,29528,11726,140,1.5,10,10,3219.0,244,0,919999999,16,0.1500,0,88,0.097,0.0,0.0 +2015,4,10,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.0,6.0,100,101279,1117,1361,319,564,391,242,67377,29465,29067,11664,120,2.1,10,10,3219.0,244,0,919999999,18,0.1500,0,88,0.097,0.0,0.0 +2015,4,10,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,6.0,5.0,93,101279,1100,1361,318,310,23,292,36429,1872,34517,13418,90,3.1,10,10,3219.0,244,0,919999999,16,0.1500,0,88,0.097,0.0,0.0 +2015,4,10,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,5.6,5.0,96,100884,1017,1361,316,281,19,265,32873,1525,31176,12105,60,1.5,10,10,1207.0,122,0,919999999,16,0.1500,0,88,0.097,0.0,0.0 +2015,4,10,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,6.0,5.0,93,101279,874,1361,318,216,8,210,25166,609,24590,9443,80,2.6,10,10,1609.0,122,0,919999999,16,0.1500,0,88,0.097,0.0,0.0 +2015,4,10,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,10.6,10.0,96,100565,678,1361,345,266,119,206,29919,9020,23289,8065,180,4.1,10,10,4828.0,213,0,919999999,27,0.1500,0,88,0.097,0.0,0.0 +2015,4,10,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,11.0,10.0,94,101280,445,1361,347,193,134,136,21328,8029,15096,4776,190,5.1,10,10,9656.0,213,0,919999999,27,0.1500,0,88,0.097,0.0,0.0 +2015,4,10,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,11.1,96,100366,190,1361,352,89,130,34,10105,0,3869,1239,210,6.7,10,10,9656.0,213,0,919999999,30,0.1500,0,88,0.097,0.0,0.0 +2015,4,10,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,11.1,93,100436,0,998,355,0,0,0,0,0,0,0,220,7.2,10,10,9656.0,274,0,919999999,29,0.1500,0,88,0.097,0.0,0.0 +2015,4,10,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.0,11.0,94,101280,0,0,353,0,0,0,0,0,0,0,230,5.7,10,10,9656.0,3048,9,999999999,29,0.1500,0,88,0.097,0.0,0.0 +2015,4,10,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.0,11.0,88,101280,0,0,349,0,0,0,0,0,0,0,240,6.2,9,9,9656.0,396,9,999999999,29,0.1500,0,88,0.097,0.0,0.0 +2015,4,10,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.0,11.0,94,101280,0,0,325,0,0,0,0,0,0,0,240,7.2,5,5,9656.0,77777,9,999999999,29,0.1500,0,88,0.097,0.0,0.0 +2015,4,10,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,10.0,86,100526,0,0,324,0,0,0,0,0,0,0,260,5.7,5,5,9656.0,77777,9,999999999,26,0.1500,0,88,0.097,0.0,0.0 +2015,4,10,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,10.0,86,100595,0,0,306,0,0,0,0,0,0,0,270,5.1,0,0,9656.0,77777,9,999999999,26,0.1500,0,88,0.097,0.0,0.0 +2015,4,11,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,8.9,83,100595,0,0,303,0,0,0,0,0,0,0,270,6.7,0,0,9656.0,77777,9,999999999,24,0.1510,0,88,0.097,0.0,0.0 +2015,4,11,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,3.9,61,100635,0,0,295,0,0,0,0,0,0,0,280,7.7,0,0,9656.0,77777,9,999999999,14,0.1510,0,88,0.097,0.0,0.0 +2015,4,11,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,2.2,58,100645,0,0,289,0,0,0,0,0,0,0,260,6.2,0,0,9656.0,77777,9,999999999,12,0.1510,0,88,0.097,0.0,0.0 +2015,4,11,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,1.7,59,100635,0,0,286,0,0,0,0,0,0,0,260,8.2,0,0,9656.0,77777,9,999999999,12,0.1510,0,88,0.097,0.0,0.0 +2015,4,11,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,1.1,56,100605,0,0,286,0,0,0,0,0,0,0,260,5.1,0,0,9656.0,77777,9,999999999,11,0.1510,0,88,0.097,0.0,0.0 +2015,4,11,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,1.1,58,100665,62,329,283,12,0,12,1160,0,1168,421,250,7.7,0,0,9656.0,77777,9,999999999,11,0.1510,0,88,0.097,0.0,0.0 +2015,4,11,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,1.7,56,100705,321,1360,324,90,178,56,10354,5500,6459,2174,240,6.2,9,9,9656.0,6096,9,999999999,12,0.1510,0,88,0.097,0.0,0.0 +2015,4,11,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,1.7,52,100735,567,1360,329,284,569,80,33787,31272,9544,3573,260,6.2,9,9,9656.0,6096,9,999999999,12,0.1510,0,88,0.097,0.0,0.0 +2015,4,11,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,1.7,49,100805,783,1360,334,435,591,128,51950,39364,15344,6039,280,6.7,9,9,9656.0,1494,9,999999999,12,0.1510,0,88,0.097,0.0,0.0 +2015,4,11,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,-1.1,39,100865,955,1360,312,616,717,133,75409,48479,16345,6727,270,11.8,5,5,9656.0,77777,9,999999999,9,0.1510,0,88,0.097,0.0,0.0 +2015,4,11,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,-1.7,39,100945,1070,1360,309,786,911,106,82511,92312,14353,3084,290,9.8,5,5,9656.0,77777,9,999999999,8,0.1510,0,88,0.097,0.0,0.0 +2015,4,11,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,-1.7,37,100985,1121,1360,312,860,933,107,90236,94664,14338,3496,280,9.3,5,5,9656.0,77777,9,999999999,8,0.1510,0,88,0.097,0.0,0.0 +2015,4,11,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,-2.2,34,101025,1105,1360,309,874,933,110,91589,94562,14762,3401,310,8.2,3,3,9656.0,77777,9,999999999,8,0.1510,0,88,0.097,0.0,0.0 +2015,4,11,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,-3.3,30,101085,1021,1360,310,829,919,109,86829,92822,14867,2813,300,8.8,3,3,9656.0,77777,9,999999999,7,0.1510,0,88,0.097,0.0,0.0 +2015,4,11,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,-2.2,33,101105,877,1360,311,725,879,110,89002,57340,13550,5528,300,8.8,3,3,9656.0,77777,9,999999999,8,0.1510,0,88,0.097,0.0,0.0 +2015,4,11,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,-2.2,34,101165,682,1360,309,574,806,107,68350,51410,12784,4911,290,8.8,3,3,9656.0,77777,9,999999999,8,0.1510,0,88,0.097,0.0,0.0 +2015,4,11,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,-1.7,39,101265,450,1360,305,390,682,96,44582,37185,11012,3777,280,8.8,3,3,9656.0,77777,9,999999999,8,0.1510,0,88,0.097,0.0,0.0 +2015,4,11,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,-3.3,36,101435,195,1360,298,196,455,70,21123,10255,7573,2006,270,6.2,3,3,9656.0,77777,9,999999999,7,0.1510,0,88,0.097,0.0,0.0 +2015,4,11,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,-3.3,39,101595,0,1022,281,0,0,0,0,0,0,0,270,5.7,0,0,9656.0,77777,9,999999999,7,0.1510,0,88,0.097,0.0,0.0 +2015,4,11,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,-2.8,44,101694,0,0,277,0,0,0,0,0,0,0,270,8.2,0,0,9656.0,77777,9,999999999,7,0.1510,0,88,0.097,0.0,0.0 +2015,4,11,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,-2.8,48,101784,0,0,273,0,0,0,0,0,0,0,270,7.7,0,0,9656.0,77777,9,999999999,7,0.1510,0,88,0.097,0.0,0.0 +2015,4,11,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-2.8,49,101814,0,0,271,0,0,0,0,0,0,0,270,8.8,0,0,9656.0,77777,9,999999999,7,0.1510,0,88,0.097,0.0,0.0 +2015,4,11,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-3.3,51,101884,0,0,266,0,0,0,0,0,0,0,280,5.1,0,0,9656.0,77777,9,999999999,7,0.1510,0,88,0.097,0.0,0.0 +2015,4,11,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-3.3,51,101944,0,0,266,0,0,0,0,0,0,0,270,4.6,0,0,9656.0,77777,9,999999999,7,0.1510,0,88,0.097,0.0,0.0 +2015,4,12,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-3.3,53,101964,0,0,264,0,0,0,0,0,0,0,280,5.7,0,0,9656.0,77777,9,999999999,7,0.1520,0,88,0.097,0.0,0.0 +2015,4,12,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-3.9,53,101984,0,0,261,0,0,0,0,0,0,0,280,4.6,0,0,9656.0,77777,9,999999999,7,0.1520,0,88,0.097,0.0,0.0 +2015,4,12,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-3.9,51,102054,0,0,263,0,0,0,0,0,0,0,280,4.6,0,0,9656.0,77777,9,999999999,7,0.1520,0,88,0.097,0.0,0.0 +2015,4,12,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-3.9,53,102124,0,0,261,0,0,0,0,0,0,0,270,3.6,0,0,9656.0,77777,9,999999999,7,0.1520,0,88,0.097,0.0,0.0 +2015,4,12,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-3.3,55,102213,0,0,262,0,0,0,0,0,0,0,260,3.1,0,0,9656.0,77777,9,999999999,7,0.1520,0,88,0.097,0.0,0.0 +2015,4,12,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-2.8,58,102313,69,367,262,15,75,11,1738,0,1276,398,220,2.6,0,0,9656.0,77777,9,999999999,8,0.1520,0,88,0.097,0.0,0.0 +2015,4,12,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-2.8,49,102394,327,1359,271,127,379,44,14939,10911,5186,1793,230,2.6,0,0,9656.0,77777,9,999999999,8,0.1520,0,88,0.097,0.0,0.0 +2015,4,12,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,-2.8,44,102414,573,1359,277,303,638,74,36351,35255,8901,3354,240,2.6,0,0,9656.0,77777,9,999999999,8,0.1520,0,88,0.097,0.0,0.0 +2015,4,12,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,-2.8,39,102404,789,1359,284,495,784,94,60641,49305,11551,4633,270,2.6,0,0,9656.0,77777,9,999999999,7,0.1520,0,88,0.097,0.0,0.0 +2015,4,12,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,-2.8,33,102395,960,1359,295,663,855,108,69498,86173,14906,2492,280,2.6,0,0,9656.0,77777,9,999999999,7,0.1520,0,88,0.097,0.0,0.0 +2015,4,12,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,-2.2,32,102355,1075,1359,301,793,910,110,83110,92156,14846,3172,240,3.1,0,0,9656.0,77777,9,999999999,8,0.1520,0,88,0.097,0.0,0.0 +2015,4,12,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,-2.2,28,102305,1125,1359,310,868,933,113,90878,94593,15077,3642,270,3.6,0,0,9656.0,77777,9,999999999,8,0.1520,0,88,0.097,0.0,0.0 +2015,4,12,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,-2.2,26,102236,1109,1359,315,883,937,112,92480,94965,15001,3470,260,4.6,0,0,9656.0,77777,9,999999999,8,0.1520,0,88,0.097,0.0,0.0 +2015,4,12,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,-2.8,22,102196,1025,1359,361,833,908,119,87057,91691,16136,2910,270,5.7,9,9,9656.0,7620,9,999999999,7,0.1520,0,88,0.097,0.0,0.0 +2015,4,12,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,-1.7,24,102166,881,1359,365,729,872,116,89188,57459,14242,5804,260,3.6,9,9,9656.0,7620,9,999999999,8,0.1520,0,88,0.097,0.0,0.0 +2015,4,12,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,-3.9,19,102146,686,1359,339,579,813,106,69074,52092,12688,4884,310,4.6,3,3,9656.0,77777,9,999999999,7,0.1520,0,88,0.097,0.0,0.0 +2015,4,12,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,-3.3,20,102176,454,1359,340,396,706,91,45528,38034,10497,3641,300,4.1,3,3,9656.0,77777,9,999999999,7,0.1520,0,88,0.097,0.0,0.0 +2015,4,12,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,-3.9,20,102226,199,1359,334,203,502,65,22065,10246,7091,1961,280,3.6,3,3,9656.0,77777,9,999999999,7,0.1520,0,88,0.097,0.0,0.0 +2015,4,12,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,1.1,43,102305,0,1047,315,0,0,0,0,0,0,0,170,7.2,3,3,9656.0,77777,9,999999999,11,0.1520,0,88,0.097,0.0,0.0 +2015,4,12,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,1.7,49,102425,0,0,310,0,0,0,0,0,0,0,210,4.1,3,3,9656.0,77777,9,999999999,12,0.1520,0,88,0.097,0.0,0.0 +2015,4,12,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,0.6,43,102455,0,0,312,0,0,0,0,0,0,0,220,5.7,3,3,9656.0,77777,9,999999999,10,0.1520,0,88,0.097,0.0,0.0 +2015,4,12,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,0.0,41,102495,0,0,311,0,0,0,0,0,0,0,230,6.2,3,3,9656.0,77777,9,999999999,10,0.1520,0,88,0.097,0.0,0.0 +2015,4,12,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,-0.6,41,102515,0,0,308,0,0,0,0,0,0,0,270,4.1,3,3,9656.0,77777,9,999999999,9,0.1520,0,88,0.097,0.0,0.0 +2015,4,12,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,-1.1,41,102525,0,0,305,0,0,0,0,0,0,0,260,1.5,3,3,9656.0,77777,9,999999999,9,0.1520,0,88,0.097,0.0,0.0 +2015,4,13,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,0.0,56,102524,0,0,280,0,0,0,0,0,0,0,140,2.1,0,0,9656.0,77777,9,999999999,10,0.1530,0,88,0.097,0.0,0.0 +2015,4,13,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,0.0,60,102514,0,0,288,0,0,0,0,0,0,0,200,3.1,3,3,9656.0,77777,9,999999999,10,0.1530,0,88,0.097,0.0,0.0 +2015,4,13,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,-1.1,53,102564,0,0,277,0,0,0,0,0,0,0,200,4.1,0,0,9656.0,77777,9,999999999,9,0.1530,0,88,0.097,0.0,0.0 +2015,4,13,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-1.1,59,102594,0,0,282,0,0,0,0,0,0,0,170,2.1,3,3,9656.0,77777,9,999999999,9,0.1530,0,88,0.097,0.0,0.0 +2015,4,13,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-1.1,59,102614,0,0,282,0,0,0,0,0,0,0,200,2.6,3,3,9656.0,77777,9,999999999,9,0.1530,0,88,0.097,0.0,0.0 +2015,4,13,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,0.0,60,102684,76,404,288,15,80,11,1747,0,1282,403,170,2.1,3,3,9656.0,77777,9,999999999,10,0.1530,0,88,0.097,0.0,0.0 +2015,4,13,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,0.6,56,102744,334,1359,295,128,378,44,15075,10854,5192,1803,170,2.6,3,3,9656.0,77777,9,999999999,11,0.1530,0,88,0.097,0.0,0.0 +2015,4,13,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,0.0,40,102725,579,1359,313,304,631,76,36420,34791,9129,3446,220,2.1,3,3,9656.0,77777,9,999999999,10,0.1530,0,88,0.097,0.0,0.0 +2015,4,13,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,0.6,36,102745,794,1359,324,496,772,97,60632,48199,11895,4777,190,4.6,3,3,9656.0,77777,9,999999999,10,0.1530,0,88,0.097,0.0,0.0 +2015,4,13,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,2.8,37,102685,965,1359,342,664,842,114,82273,53916,14175,5890,180,4.1,5,5,9656.0,77777,9,999999999,13,0.1530,0,88,0.097,0.0,0.0 +2015,4,13,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,0.0,27,102556,1079,1359,346,793,888,123,83025,90040,16479,3349,190,5.7,5,5,9656.0,77777,9,999999999,10,0.1530,0,88,0.097,0.0,0.0 +2015,4,13,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,0.0,25,102456,1130,1359,352,868,911,127,90770,92470,16816,3891,190,7.7,5,5,9656.0,77777,9,999999999,10,0.1530,0,88,0.097,0.0,0.0 +2015,4,13,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,-2.8,20,102396,1113,1359,343,882,918,124,92037,92922,16491,3670,190,7.2,3,3,9656.0,77777,9,999999999,7,0.1530,0,88,0.097,0.0,0.0 +2015,4,13,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,1.1,27,102316,1029,1359,348,834,911,116,87599,92375,15749,2920,190,6.7,3,3,9656.0,77777,9,999999999,11,0.1530,0,88,0.097,0.0,0.0 +2015,4,13,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,2.2,31,102226,885,1359,346,726,871,111,89085,55792,13668,5592,190,7.7,3,3,9656.0,77777,9,999999999,12,0.1530,0,88,0.097,0.0,0.0 +2015,4,13,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,2.8,34,102216,690,1359,342,573,802,103,68448,49483,12345,4778,190,8.2,3,3,9656.0,77777,9,999999999,13,0.1530,0,88,0.097,0.0,0.0 +2015,4,13,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,1.7,35,102206,458,1359,368,352,513,111,39821,29622,12605,4241,200,7.7,10,10,9656.0,7620,9,999999999,12,0.1530,0,88,0.097,0.0,0.0 +2015,4,13,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,-0.6,34,102165,204,1359,354,184,379,69,19926,8476,7501,2049,200,7.2,10,10,9656.0,7620,9,999999999,9,0.1530,0,88,0.097,0.0,0.0 +2015,4,13,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,-1.1,35,102195,0,1071,348,0,0,0,0,0,0,0,200,7.2,10,10,9656.0,7620,9,999999999,9,0.1530,0,88,0.097,0.0,0.0 +2015,4,13,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,5.0,61,102175,0,0,319,0,0,0,0,0,0,0,190,7.2,5,5,9656.0,77777,9,999999999,16,0.1530,0,88,0.097,0.0,0.0 +2015,4,13,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,5.0,61,102155,0,0,319,0,0,0,0,0,0,0,200,5.7,5,5,9656.0,77777,9,999999999,16,0.1530,0,88,0.097,0.0,0.0 +2015,4,13,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,4.4,59,102085,0,0,318,0,0,0,0,0,0,0,210,6.7,5,5,9656.0,77777,9,999999999,15,0.1530,0,88,0.097,0.0,0.0 +2015,4,13,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,5.6,64,102025,0,0,320,0,0,0,0,0,0,0,220,8.8,5,5,9656.0,77777,9,999999999,17,0.1530,0,88,0.097,0.0,0.0 +2015,4,13,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,6.1,66,101915,0,0,302,0,0,0,0,0,0,0,210,8.2,0,0,9656.0,77777,9,999999999,18,0.1530,0,88,0.097,0.0,0.0 +2015,4,14,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,6.7,66,101805,0,0,305,0,0,0,0,0,0,0,220,9.3,0,0,9656.0,77777,9,999999999,19,0.1540,0,88,0.097,0.0,0.0 +2015,4,14,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,7.8,69,101725,0,0,346,0,0,0,0,0,0,0,210,8.2,9,9,9656.0,6096,9,999999999,21,0.1540,0,88,0.097,0.0,0.0 +2015,4,14,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,8.9,75,101645,0,0,348,0,0,0,0,0,0,0,210,6.7,9,9,9656.0,6096,9,999999999,24,0.1540,0,88,0.097,0.0,0.0 +2015,4,14,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,10.6,78,101625,0,0,355,0,0,0,0,0,0,0,210,9.8,9,9,9656.0,6096,9,999999999,28,0.1540,0,88,0.097,0.0,0.0 +2015,4,14,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,11.1,75,101626,0,0,362,0,0,0,0,0,0,0,220,10.8,9,9,9656.0,5486,9,999999999,30,0.1540,0,88,0.097,0.0,0.0 +2015,4,14,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,11.1,77,101755,82,441,359,1,0,1,96,0,97,42,240,7.2,9,9,9656.0,2743,9,999999999,30,0.1540,0,88,0.097,0.0,0.0 +2015,4,14,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,10.6,72,101875,340,1358,371,34,0,34,3352,0,3378,1446,290,6.2,10,10,9656.0,2591,0,919999999,28,0.1540,0,88,0.097,0.0,0.0 +2015,4,14,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,7.2,67,101865,585,1358,355,50,0,50,5043,0,5085,2376,270,4.1,10,10,9656.0,1311,0,919999999,20,0.1540,0,88,0.097,0.0,0.0 +2015,4,14,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,9.4,72,101945,800,1358,364,249,96,192,28814,6960,22326,8446,300,5.1,10,10,9656.0,1829,0,919999999,25,0.1540,0,88,0.097,0.0,0.0 +2015,4,14,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,5.6,55,102055,970,1358,349,351,86,292,40461,7242,33858,12682,310,5.1,9,9,9656.0,2134,0,919999999,17,0.1540,0,88,0.097,0.0,0.0 +2015,4,14,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,3.3,42,101985,1084,1358,355,568,300,334,65954,26061,39025,14692,290,4.1,9,9,9656.0,7620,0,919999999,14,0.1540,0,88,0.097,0.0,0.0 +2015,4,14,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,1.1,35,101936,1134,1358,355,626,298,384,72461,27246,44743,16393,290,4.1,9,9,9656.0,6096,0,919999999,11,0.1540,0,88,0.097,0.0,0.0 +2015,4,14,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,1.7,35,101886,1116,1358,358,579,238,381,66883,21766,44301,16219,260,3.6,9,9,9656.0,6096,0,919999999,12,0.1540,0,88,0.097,0.0,0.0 +2015,4,14,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,0.6,31,101836,1033,1358,360,508,182,360,58244,16769,41539,15067,260,3.6,9,9,9656.0,6096,0,919999999,10,0.1540,0,88,0.097,0.0,0.0 +2015,4,14,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,0.0,29,101776,889,1358,372,478,220,323,54049,20338,36746,12804,270,5.1,10,10,9656.0,4877,0,919999999,10,0.1540,0,88,0.097,0.0,0.0 +2015,4,14,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,-0.6,29,101746,694,1358,368,392,246,236,43930,20923,26590,8925,240,3.6,10,10,9656.0,4877,0,919999999,9,0.1540,0,88,0.097,0.0,0.0 +2015,4,14,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,0.0,31,101736,462,1358,356,217,117,148,24016,7920,16453,5147,220,4.6,9,9,9656.0,4877,0,919999999,10,0.1540,0,88,0.097,0.0,0.0 +2015,4,14,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,-0.6,31,101746,208,1358,353,102,44,92,10800,1552,9785,2323,220,3.6,9,9,9656.0,4877,0,919999999,9,0.1540,0,88,0.097,0.0,0.0 +2015,4,14,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,-0.6,32,101786,0,1096,350,0,0,0,0,0,0,0,220,2.6,9,9,9656.0,4877,0,919999999,9,0.1540,0,88,0.097,0.0,0.0 +2015,4,14,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,-1.1,29,101856,0,0,352,0,0,0,0,0,0,0,245,0.0,9,9,9656.0,4877,9,999999999,9,0.1540,0,88,0.097,0.0,0.0 +2015,4,14,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,-0.6,34,101865,0,0,354,0,0,0,0,0,0,0,258,0.0,10,10,9656.0,3962,9,999999999,9,0.1540,0,88,0.097,0.0,0.0 +2015,4,14,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,2.2,54,101885,0,0,339,0,0,0,0,0,0,0,200,3.1,10,10,9656.0,3962,9,999999999,12,0.1540,0,88,0.097,0.0,0.0 +2015,4,14,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,-0.6,35,101855,0,0,351,0,0,0,0,0,0,0,310,2.1,10,10,9656.0,3962,9,999999999,9,0.1540,0,88,0.097,0.0,0.0 +2015,4,14,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,-1.7,35,101875,0,0,299,0,0,0,0,0,0,0,290,4.1,0,0,9656.0,77777,9,999999999,8,0.1540,0,88,0.097,0.0,0.0 +2015,4,15,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,-2.8,32,101815,0,0,297,0,0,0,0,0,0,0,310,4.1,0,0,9656.0,77777,9,999999999,7,0.1560,0,88,0.097,0.0,0.0 +2015,4,15,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,-2.8,33,101755,0,0,295,0,0,0,0,0,0,0,310,4.1,0,0,9656.0,77777,9,999999999,7,0.1560,0,88,0.097,0.0,0.0 +2015,4,15,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,-2.8,37,101725,0,0,288,0,0,0,0,0,0,0,320,3.6,0,0,9656.0,77777,9,999999999,7,0.1560,0,88,0.097,0.0,0.0 +2015,4,15,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,-2.8,39,101755,0,0,284,0,0,0,0,0,0,0,300,4.6,0,0,9656.0,77777,9,999999999,7,0.1560,0,88,0.097,0.0,0.0 +2015,4,15,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,-3.3,38,101785,0,0,300,0,0,0,0,0,0,0,310,4.6,5,5,9656.0,77777,9,999999999,7,0.1560,0,88,0.097,0.0,0.0 +2015,4,15,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,-3.9,35,101835,89,478,298,20,127,12,2340,0,1405,445,310,4.6,3,3,9656.0,77777,9,999999999,7,0.1560,0,88,0.097,0.0,0.0 +2015,4,15,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,-3.3,33,101855,347,1357,305,141,435,40,16808,13081,4776,1678,320,4.6,3,3,9656.0,77777,9,999999999,7,0.1560,0,88,0.097,0.0,0.0 +2015,4,15,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,-3.3,28,101875,591,1357,315,324,697,67,39316,38102,8149,3107,330,5.1,3,3,9656.0,77777,9,999999999,7,0.1560,0,88,0.097,0.0,0.0 +2015,4,15,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,-3.3,26,101945,805,1357,320,516,826,83,54470,82535,11938,1861,360,6.2,3,3,9656.0,77777,9,999999999,7,0.1560,0,88,0.097,0.0,0.0 +2015,4,15,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,-3.9,23,101946,975,1357,324,684,894,94,71926,90200,13037,2458,360,4.1,3,3,9656.0,77777,9,999999999,7,0.1560,0,88,0.097,0.0,0.0 +2015,4,15,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,-6.1,18,101926,1088,1357,331,813,943,94,85317,95372,12760,3035,320,3.6,5,5,9656.0,77777,9,999999999,5,0.1560,0,88,0.097,0.0,0.0 +2015,4,15,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,-7.2,15,101916,1138,1357,335,885,959,97,92690,97016,13015,3474,330,5.1,5,5,9656.0,77777,9,999999999,5,0.1560,0,88,0.097,0.0,0.0 +2015,4,15,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,-0.6,35,101915,1120,1357,323,897,957,100,94418,97252,13452,3384,130,3.6,5,5,9656.0,77777,9,999999999,9,0.1560,0,88,0.097,0.0,0.0 +2015,4,15,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,-6.7,16,101956,1037,1357,336,851,949,96,89223,95776,13143,2765,300,4.6,5,5,9656.0,77777,9,999999999,5,0.1560,0,88,0.097,0.0,0.0 +2015,4,15,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.0,-7.0,15,101281,893,1357,336,750,924,92,78720,92630,12959,2150,340,7.2,5,5,9656.0,77777,9,999999999,5,0.1560,0,88,0.097,0.0,0.0 +2015,4,15,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,-7.8,15,102066,698,1357,332,599,868,87,72756,53675,10598,4145,340,7.7,5,5,9656.0,77777,9,999999999,4,0.1560,0,88,0.097,0.0,0.0 +2015,4,15,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,-7.8,16,102156,466,1357,327,417,779,75,48873,40116,8815,3153,330,8.8,5,5,9656.0,77777,9,999999999,4,0.1560,0,88,0.097,0.0,0.0 +2015,4,15,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,-7.2,17,102235,213,1357,325,221,601,55,24525,10580,6122,1833,330,7.2,5,5,9656.0,77777,9,999999999,5,0.1560,0,88,0.097,0.0,0.0 +2015,4,15,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,-7.8,18,102355,0,1120,315,0,0,0,0,0,0,0,330,7.2,3,3,9656.0,77777,9,999999999,4,0.1560,0,88,0.097,0.0,0.0 +2015,4,15,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,-7.2,20,102515,0,0,310,0,0,0,0,0,0,0,330,5.7,3,3,9656.0,77777,9,999999999,5,0.1560,0,88,0.097,0.0,0.0 +2015,4,15,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,-7.8,21,102635,0,0,292,0,0,0,0,0,0,0,340,6.2,0,0,9656.0,77777,9,999999999,5,0.1560,0,88,0.097,0.0,0.0 +2015,4,15,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,-8.9,21,102724,0,0,284,0,0,0,0,0,0,0,350,5.1,0,0,9656.0,77777,9,999999999,4,0.1560,0,88,0.097,0.0,0.0 +2015,4,15,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,-8.9,22,102804,0,0,280,0,0,0,0,0,0,0,340,4.6,0,0,9656.0,77777,9,999999999,4,0.1560,0,88,0.097,0.0,0.0 +2015,4,15,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,-7.8,26,102854,0,0,279,0,0,0,0,0,0,0,340,4.1,0,0,9656.0,77777,9,999999999,5,0.1560,0,88,0.097,0.0,0.0 +2015,4,16,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,-7.2,30,102864,0,0,273,0,0,0,0,0,0,0,360,3.6,0,0,9656.0,77777,9,999999999,5,0.1570,0,88,0.097,0.0,0.0 +2015,4,16,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,-7.2,33,102924,0,0,268,0,0,0,0,0,0,0,30,2.1,0,0,9656.0,77777,9,999999999,5,0.1570,0,88,0.097,0.0,0.0 +2015,4,16,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-3.9,47,102963,0,0,268,0,0,0,0,0,0,0,337,0.0,0,0,9656.0,77777,9,999999999,7,0.1570,0,88,0.097,0.0,0.0 +2015,4,16,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,0.0,67,102993,0,0,269,0,0,0,0,0,0,0,333,0.0,0,0,9656.0,77777,9,999999999,10,0.1570,0,88,0.097,0.0,0.0 +2015,4,16,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-2.8,55,103073,0,0,264,0,0,0,0,0,0,0,335,0.0,0,0,9656.0,77777,9,999999999,8,0.1570,0,88,0.097,0.0,0.0 +2015,4,16,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,-3.9,42,103164,96,514,286,23,142,13,2687,0,1520,482,340,0.0,3,3,9656.0,77777,9,999999999,7,0.1570,0,88,0.097,0.0,0.0 +2015,4,16,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,-5.0,34,103184,353,1356,291,147,448,41,17528,14142,4897,1724,360,1.5,3,3,9656.0,77777,9,999999999,6,0.1570,0,88,0.097,0.0,0.0 +2015,4,16,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,-8.3,25,103194,597,1356,290,332,710,68,40324,39806,8279,3158,80,2.1,3,3,9656.0,77777,9,999999999,4,0.1570,0,88,0.097,0.0,0.0 +2015,4,16,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,-8.9,22,103244,810,1356,292,524,834,84,55064,83055,12056,1880,80,3.6,3,3,9656.0,77777,9,999999999,4,0.1570,0,88,0.097,0.0,0.0 +2015,4,16,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,-7.8,25,103224,980,1356,298,690,898,94,72340,90386,13019,2479,130,3.1,5,5,9656.0,77777,9,999999999,5,0.1570,0,88,0.097,0.0,0.0 +2015,4,16,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,-8.3,23,103154,1093,1356,299,815,935,99,85261,94412,13382,3158,110,3.6,5,5,9656.0,77777,9,999999999,4,0.1570,0,88,0.097,0.0,0.0 +2015,4,16,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,-6.1,27,103054,1142,1356,322,793,675,241,95446,52932,29162,11687,100,4.6,9,9,9656.0,7620,9,999999999,5,0.1570,0,88,0.097,0.0,0.0 +2015,4,16,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,-5.0,31,102984,1124,1356,319,787,615,272,93600,50252,32533,12809,110,7.2,9,9,9656.0,7620,9,999999999,6,0.1570,0,88,0.097,0.0,0.0 +2015,4,16,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,-3.3,36,102864,1040,1356,321,797,772,185,96442,56666,22491,9189,100,7.7,9,9,9656.0,7620,9,999999999,7,0.1570,0,88,0.097,0.0,0.0 +2015,4,16,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,-1.1,45,102754,896,1356,321,721,820,140,87183,56424,16996,6881,100,8.2,9,9,9656.0,7620,9,999999999,9,0.1570,0,88,0.097,0.0,0.0 +2015,4,16,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,0.0,46,102664,702,1356,327,549,706,126,64769,46993,14921,5699,110,7.2,9,9,9656.0,7620,9,999999999,10,0.1570,0,88,0.097,0.0,0.0 +2015,4,16,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,-5.0,24,102615,470,1356,336,321,388,135,35914,25582,15168,4919,190,8.8,9,9,9656.0,7620,9,999999999,6,0.1570,0,88,0.097,0.0,0.0 +2015,4,16,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,-6.7,23,102545,217,1356,327,163,230,76,17639,6682,8257,2234,200,8.2,9,9,9656.0,6706,9,999999999,5,0.1570,0,88,0.097,0.0,0.0 +2015,4,16,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,-5.0,31,102544,0,1145,319,0,0,0,0,0,0,0,190,7.7,9,9,9656.0,6096,9,999999999,6,0.1570,0,88,0.097,0.0,0.0 +2015,4,16,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,-6.1,31,102584,0,0,312,0,0,0,0,0,0,0,200,5.7,9,9,9656.0,9754,9,999999999,5,0.1570,0,88,0.097,0.0,0.0 +2015,4,16,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,-6.7,30,102544,0,0,292,0,0,0,0,0,0,0,210,6.2,5,5,9656.0,77777,9,999999999,5,0.1570,0,88,0.097,0.0,0.0 +2015,4,16,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,-6.1,32,102494,0,0,293,0,0,0,0,0,0,0,210,6.7,5,5,9656.0,77777,9,999999999,5,0.1570,0,88,0.097,0.0,0.0 +2015,4,16,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,-5.0,35,102404,0,0,277,0,0,0,0,0,0,0,210,5.1,0,0,9656.0,77777,9,999999999,6,0.1570,0,88,0.097,0.0,0.0 +2015,4,16,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,-1.1,49,102344,0,0,281,0,0,0,0,0,0,0,210,5.1,0,0,9656.0,77777,9,999999999,9,0.1570,0,88,0.097,0.0,0.0 +2015,4,17,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,2.2,63,102214,0,0,285,0,0,0,0,0,0,0,210,6.2,0,0,9656.0,77777,9,999999999,12,0.1580,0,88,0.097,0.0,0.0 +2015,4,17,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,3.3,68,102104,0,0,286,0,0,0,0,0,0,0,210,5.1,0,0,9656.0,77777,9,999999999,14,0.1580,0,88,0.097,0.0,0.0 +2015,4,17,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,3.3,68,102004,0,0,330,0,0,0,0,0,0,0,210,4.6,10,10,9656.0,4877,9,999999999,14,0.1580,0,88,0.097,0.0,0.0 +2015,4,17,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,4.4,68,101885,0,0,336,0,0,0,0,0,0,0,220,6.2,10,10,9656.0,4877,9,999999999,15,0.1580,0,88,0.097,0.0,0.0 +2015,4,17,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,4.4,68,101865,0,0,336,0,0,0,0,0,0,0,220,5.1,10,10,9656.0,4877,9,999999999,15,0.1580,0,88,0.097,0.0,0.0 +2015,4,17,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,6.7,80,101815,102,550,339,2,0,2,194,0,195,84,210,4.6,10,10,9656.0,2438,0,919999999,19,0.1580,0,88,0.097,0.8,0.0 +2015,4,17,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,7.8,86,101755,359,1355,340,9,0,9,890,0,897,416,210,6.7,10,10,9656.0,2134,0,919999999,21,0.1580,0,88,0.097,0.0,0.0 +2015,4,17,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,8.9,86,101645,602,1355,347,108,27,99,12700,1531,11680,4384,220,7.7,10,10,9656.0,1676,0,919999999,24,0.1580,0,88,0.097,0.0,0.0 +2015,4,17,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,10.0,89,101575,816,1355,351,123,27,114,14858,1643,13820,5563,220,7.7,10,10,9656.0,396,0,919999999,27,0.1580,0,88,0.097,0.0,0.0 +2015,4,17,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.0,11.0,94,101280,984,1355,353,99,0,99,10300,0,10398,5217,220,6.7,10,10,9656.0,457,0,919999999,29,0.1580,0,88,0.097,0.0,0.0 +2015,4,17,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,11.7,90,101445,1097,1355,361,131,2,130,16319,121,16259,6845,230,6.7,10,10,9656.0,457,0,919999999,31,0.1580,0,88,0.097,0.0,0.0 +2015,4,17,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,12.2,83,101316,1146,1355,370,308,28,285,36393,2118,33876,13336,230,8.8,10,10,9656.0,518,0,919999999,33,0.1580,0,88,0.097,0.0,0.0 +2015,4,17,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,11.7,75,101246,1128,1355,375,194,6,189,23602,399,23106,9538,240,7.7,10,10,9656.0,549,0,919999999,31,0.1580,0,88,0.097,0.0,0.0 +2015,4,17,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.0,12.0,77,101281,1044,1355,375,228,10,220,27092,708,26279,10607,260,5.7,10,10,9656.0,975,0,919999999,32,0.1580,0,88,0.097,0.0,0.0 +2015,4,17,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,11.1,70,101106,900,1355,377,181,9,174,21441,611,20707,8270,250,6.2,10,10,9656.0,1036,0,919999999,29,0.1580,0,88,0.097,0.0,0.0 +2015,4,17,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,10.6,65,101096,705,1355,369,155,12,148,17997,787,17258,6502,280,6.7,9,9,9656.0,1402,0,919999999,28,0.1580,0,88,0.097,0.0,0.0 +2015,4,17,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,10.6,63,101076,474,1355,372,232,142,177,25267,9992,19375,5777,260,4.1,9,9,9656.0,1097,0,919999999,28,0.1580,0,88,0.097,0.0,0.0 +2015,4,17,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,9.4,58,101076,221,1355,350,160,291,95,16931,9792,10099,2471,270,6.2,5,5,9656.0,77777,0,919999999,25,0.1580,0,88,0.097,0.0,0.0 +2015,4,17,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,9.4,62,101126,0,1169,345,0,0,0,0,0,0,0,280,5.1,5,5,9656.0,77777,0,919999999,25,0.1580,0,88,0.097,0.0,0.0 +2015,4,17,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,9.4,64,101176,0,0,323,0,0,0,0,0,0,0,260,4.1,0,0,9656.0,77777,9,999999999,25,0.1580,0,88,0.097,0.0,0.0 +2015,4,17,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,9.4,64,101196,0,0,323,0,0,0,0,0,0,0,270,4.1,0,0,9656.0,77777,9,999999999,25,0.1580,0,88,0.097,0.0,0.0 +2015,4,17,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,8.3,64,101216,0,0,317,0,0,0,0,0,0,0,270,5.1,0,0,9656.0,77777,9,999999999,22,0.1580,0,88,0.097,0.0,0.0 +2015,4,17,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,8.3,67,101236,0,0,314,0,0,0,0,0,0,0,270,4.6,0,0,9656.0,77777,9,999999999,22,0.1580,0,88,0.097,0.0,0.0 +2015,4,17,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,8.3,72,101255,0,0,309,0,0,0,0,0,0,0,280,4.6,0,0,9656.0,77777,9,999999999,22,0.1580,0,88,0.097,0.0,0.0 +2015,4,18,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,7.8,72,101255,0,0,306,0,0,0,0,0,0,0,280,6.2,0,0,9656.0,77777,9,999999999,21,0.1590,0,88,0.097,0.0,0.0 +2015,4,18,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,7.2,71,101235,0,0,303,0,0,0,0,0,0,0,290,4.6,0,0,9656.0,77777,9,999999999,20,0.1590,0,88,0.097,0.0,0.0 +2015,4,18,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,6.7,71,101225,0,0,301,0,0,0,0,0,0,0,290,5.1,0,0,9656.0,77777,9,999999999,19,0.1590,0,88,0.097,0.0,0.0 +2015,4,18,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,6.7,77,101245,0,0,296,0,0,0,0,0,0,0,300,2.1,0,0,9656.0,77777,9,999999999,19,0.1590,0,88,0.097,0.0,0.0 +2015,4,18,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,6.1,71,101275,0,0,298,0,0,0,0,0,0,0,290,3.6,0,0,9656.0,77777,9,999999999,18,0.1590,0,88,0.097,0.0,0.0 +2015,4,18,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,6.1,68,101335,109,585,300,24,105,15,2790,0,1746,557,280,3.6,0,0,9656.0,77777,9,999999999,18,0.1590,0,88,0.097,0.0,0.0 +2015,4,18,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,6.7,64,101355,365,1355,307,144,378,50,16913,12137,5886,2068,290,2.1,0,0,9656.0,77777,9,999999999,19,0.1590,0,88,0.097,0.0,0.0 +2015,4,18,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,6.7,58,101346,608,1355,315,322,622,83,38466,34165,9944,3788,330,2.6,0,0,9656.0,77777,9,999999999,19,0.1590,0,88,0.097,0.0,0.0 +2015,4,18,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,6.1,57,101395,821,1355,312,510,757,103,62242,46447,12612,5101,70,3.6,0,0,9656.0,77777,9,999999999,18,0.1590,0,88,0.097,0.0,0.0 +2015,4,18,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,3.3,49,101415,989,1355,306,673,830,115,83641,53006,14344,5985,70,7.2,0,0,9656.0,77777,9,999999999,14,0.1590,0,88,0.097,0.0,0.0 +2015,4,18,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,3.9,59,101365,1101,1355,298,802,893,111,84653,91102,14902,3423,70,7.2,0,0,9656.0,77777,9,999999999,14,0.1590,0,88,0.097,0.0,0.0 +2015,4,18,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,4.4,65,101275,1150,1355,294,873,911,116,92075,93073,15386,3995,70,5.7,0,0,9656.0,77777,9,999999999,15,0.1590,0,88,0.097,0.0,0.0 +2015,4,18,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,4.4,68,101205,1131,1355,304,884,908,120,93150,92703,15942,3850,70,6.7,3,3,9656.0,77777,9,999999999,15,0.1590,0,88,0.097,0.0,0.0 +2015,4,18,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,4.4,76,101125,1047,1355,319,580,454,202,69655,33045,24379,9909,70,4.6,9,9,9656.0,3048,9,999999999,15,0.1590,0,88,0.097,0.0,0.0 +2015,4,18,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,5.0,80,101035,903,1355,302,511,447,180,60581,32100,21439,8517,70,4.6,5,5,9656.0,77777,9,999999999,16,0.1590,0,88,0.097,0.8,0.0 +2015,4,18,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,5.0,80,100975,709,1355,302,380,426,149,44244,29221,17422,6554,80,3.6,5,5,9656.0,77777,9,999999999,16,0.1590,0,88,0.097,0.0,0.0 +2015,4,18,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,5.0,82,100985,478,1355,300,352,445,162,38766,30994,17926,5552,60,2.1,5,5,9656.0,77777,9,999999999,16,0.1590,0,88,0.097,0.0,0.0 +2015,4,18,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,5.0,68,101265,226,1355,312,174,230,97,18454,8537,10335,2527,10,5.7,5,5,9656.0,77777,9,999999999,16,0.1590,0,88,0.097,0.0,0.0 +2015,4,18,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,4.4,76,101395,0,1193,297,0,0,0,0,0,0,0,70,2.1,3,3,9656.0,77777,9,999999999,15,0.1590,0,88,0.097,0.0,0.0 +2015,4,18,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,5.0,89,101554,0,0,278,0,0,0,0,0,0,0,60,2.1,0,0,9656.0,77777,9,999999999,16,0.1590,0,88,0.097,0.0,0.0 +2015,4,18,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,4.4,82,101644,0,0,280,0,0,0,0,0,0,0,20,2.6,0,0,9656.0,77777,9,999999999,15,0.1590,0,88,0.097,0.0,0.0 +2015,4,18,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,3.9,86,101734,0,0,275,0,0,0,0,0,0,0,20,3.6,0,0,9656.0,77777,9,999999999,15,0.1590,0,88,0.097,0.0,0.0 +2015,4,18,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,3.9,82,101834,0,0,277,0,0,0,0,0,0,0,340,1.5,0,0,9656.0,77777,9,999999999,15,0.1590,0,88,0.097,0.0,0.0 +2015,4,18,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,3.3,76,101854,0,0,279,0,0,0,0,0,0,0,350,1.5,0,0,9656.0,77777,9,999999999,14,0.1590,0,88,0.097,0.0,0.0 +2015,4,19,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,1.1,60,101914,0,0,281,0,0,0,0,0,0,0,330,6.7,0,0,9656.0,77777,9,999999999,11,0.1600,0,88,0.097,0.0,0.0 +2015,4,19,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,0.0,58,101944,0,0,278,0,0,0,0,0,0,0,330,7.7,0,0,9656.0,77777,9,999999999,10,0.1600,0,88,0.097,0.0,0.0 +2015,4,19,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,0.0,58,102014,0,0,278,0,0,0,0,0,0,0,320,5.1,0,0,9656.0,77777,9,999999999,10,0.1600,0,88,0.097,0.0,0.0 +2015,4,19,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,0.0,60,102114,0,0,276,0,0,0,0,0,0,0,320,4.6,0,0,9656.0,77777,9,999999999,10,0.1600,0,88,0.097,0.0,0.0 +2015,4,19,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,0.0,62,102234,0,0,274,0,0,0,0,0,0,0,330,2.6,0,0,9656.0,77777,9,999999999,10,0.1600,0,88,0.097,0.0,0.0 +2015,4,19,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,0.0,62,102324,115,621,286,29,157,15,3392,0,1756,563,330,4.6,3,3,9656.0,77777,9,999999999,10,0.1600,0,88,0.097,0.0,0.0 +2015,4,19,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,0.0,56,102394,371,1354,280,158,462,43,18849,15308,5139,1823,360,5.1,0,0,9656.0,77777,9,999999999,10,0.1600,0,88,0.097,0.0,0.0 +2015,4,19,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,1.1,58,102434,613,1354,283,347,725,69,42165,39613,8405,3231,40,3.6,0,0,9656.0,77777,9,999999999,11,0.1600,0,88,0.097,0.0,0.0 +2015,4,19,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,1.1,58,102464,826,1354,283,540,846,83,57277,85056,11902,1913,80,4.6,0,0,9656.0,77777,9,999999999,11,0.1600,0,88,0.097,0.0,0.0 +2015,4,19,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,1.1,56,102514,993,1354,298,706,908,92,74674,92133,12737,2520,80,5.1,3,3,9656.0,77777,9,999999999,11,0.1600,0,88,0.097,0.0,0.0 +2015,4,19,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,1.1,56,102524,1105,1354,302,830,943,97,87624,95989,13108,3226,80,6.7,5,5,9656.0,77777,9,999999999,11,0.1600,0,88,0.097,0.0,0.0 +2015,4,19,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,2.2,61,102524,1153,1354,304,899,954,103,94850,97292,13741,3783,120,5.7,5,5,9656.0,77777,9,999999999,12,0.1600,0,88,0.097,0.0,0.0 +2015,4,19,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,2.8,66,102504,1135,1354,302,908,946,108,95752,96474,14422,3692,110,6.2,5,5,9656.0,77777,9,999999999,13,0.1600,0,88,0.097,0.0,0.0 +2015,4,19,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,2.2,65,102404,1051,1354,317,758,642,235,90098,49554,28081,11208,110,6.7,9,9,9656.0,7620,9,999999999,12,0.1600,0,88,0.097,0.0,0.0 +2015,4,19,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,1.7,63,102344,907,1354,325,635,549,239,73760,44215,27910,10626,100,8.8,10,10,9656.0,6706,9,999999999,12,0.1600,0,88,0.097,0.0,0.0 +2015,4,19,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,0.0,58,102284,713,1354,321,521,591,172,60116,43791,19936,7335,100,7.2,10,10,9656.0,6706,9,999999999,10,0.1600,0,88,0.097,0.0,0.0 +2015,4,19,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,1.7,63,102314,482,1354,325,334,405,150,37100,27568,16737,5339,110,6.2,10,10,9656.0,6706,9,999999999,12,0.1600,0,88,0.097,0.0,0.0 +2015,4,19,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,2.8,71,102334,230,1354,324,171,238,85,18393,7715,9181,2444,110,4.6,10,10,9656.0,7620,9,999999999,13,0.1600,0,88,0.097,0.0,0.0 +2015,4,19,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,1.7,65,102364,0,1217,314,0,0,0,0,0,0,0,120,4.1,9,9,9656.0,7620,9,999999999,12,0.1600,0,88,0.097,0.0,0.0 +2015,4,19,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,2.2,73,102444,0,0,310,0,0,0,0,0,0,0,120,3.6,9,9,9656.0,7620,9,999999999,12,0.1600,0,88,0.097,0.0,0.0 +2015,4,19,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,1.7,70,102464,0,0,309,0,0,0,0,0,0,0,130,3.6,9,9,9656.0,7620,9,999999999,12,0.1600,0,88,0.097,0.0,0.0 +2015,4,19,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,2.2,73,102414,0,0,310,0,0,0,0,0,0,0,140,3.1,9,9,9656.0,6706,9,999999999,12,0.1600,0,88,0.097,0.0,0.0 +2015,4,19,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,1.7,76,102394,0,0,287,0,0,0,0,0,0,0,170,2.1,5,5,9656.0,77777,9,999999999,12,0.1600,0,88,0.097,0.0,0.0 +2015,4,19,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,2.8,82,102374,0,0,284,0,0,0,0,0,0,0,140,3.1,3,3,9656.0,77777,9,999999999,13,0.1600,0,88,0.097,0.0,0.0 +2015,4,20,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,1.7,79,102314,0,0,310,0,0,0,0,0,0,0,140,2.6,10,10,9656.0,6706,9,999999999,12,0.1620,0,88,0.097,0.0,0.0 +2015,4,20,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,2.8,86,102284,0,0,311,0,0,0,0,0,0,0,150,2.6,10,10,9656.0,6706,9,999999999,13,0.1620,0,88,0.097,0.0,0.0 +2015,4,20,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,3.3,89,102224,0,0,312,0,0,0,0,0,0,0,120,4.1,10,10,9656.0,6706,9,999999999,14,0.1620,0,88,0.097,0.0,0.0 +2015,4,20,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,3.9,93,102214,0,0,312,0,0,0,0,0,0,0,130,4.1,10,10,9656.0,4572,9,999999999,15,0.1620,0,88,0.097,0.0,0.0 +2015,4,20,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,4.0,93,101279,0,0,304,0,0,0,0,0,0,0,130,5.1,9,9,9656.0,213,9,999999999,15,0.1620,0,88,0.097,0.0,0.0 +2015,4,20,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.0,4.0,87,101279,122,655,317,9,0,9,874,0,880,359,110,3.6,10,10,9656.0,4267,9,999999999,15,0.1620,0,88,0.097,0.0,0.0 +2015,4,20,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.0,4.0,87,101279,377,1353,317,53,0,53,5261,0,5301,2195,90,5.7,10,10,9656.0,274,9,999999999,15,0.1620,0,88,0.097,0.0,0.0 +2015,4,20,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.0,4.0,87,101279,619,1353,317,53,0,53,5370,0,5415,2551,80,7.7,10,10,9656.0,3048,9,999999999,15,0.1620,0,88,0.097,0.0,0.0 +2015,4,20,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,4.4,92,102104,831,1353,316,111,0,111,11444,0,11547,5475,90,7.7,10,10,9656.0,3353,9,999999999,15,0.1620,0,88,0.097,0.0,0.0 +2015,4,20,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,3.9,82,102014,998,1353,320,170,7,165,20592,486,20075,8237,90,7.7,10,10,9656.0,1280,9,999999999,15,0.1620,0,88,0.097,0.0,0.0 +2015,4,20,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,3.9,82,101904,1109,1353,320,217,11,209,26230,801,25391,10352,100,9.8,10,10,9656.0,1036,9,999999999,15,0.1620,0,88,0.097,0.0,0.0 +2015,4,20,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,6.1,4.4,89,101794,1157,1353,318,160,2,158,19874,134,19712,8198,110,8.2,10,10,4828.0,975,0,919999999,15,0.1620,0,88,0.097,0.0,0.0 +2015,4,20,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.0,5.0,87,101279,1138,1353,323,183,4,179,22460,276,22073,9120,100,9.3,10,10,4828.0,853,0,919999999,16,0.1620,0,88,0.097,0.0,0.0 +2015,4,20,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,5.0,89,101504,1054,1353,321,167,2,164,20393,137,20116,8331,100,8.8,10,10,4828.0,732,0,919999999,16,0.1620,0,88,0.097,0.0,0.0 +2015,4,20,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.0,6.0,93,101279,910,1353,324,163,3,161,19507,207,19352,7798,100,8.2,10,10,4023.0,549,0,919999999,18,0.1620,0,88,0.097,0.0,0.0 +2015,4,20,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.0,6.0,93,101279,716,1353,324,81,1,80,9903,57,9807,3886,100,7.2,10,10,3219.0,427,0,919999999,18,0.1620,0,88,0.097,0.0,0.0 +2015,4,20,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.0,6.0,93,101279,486,1353,324,43,0,43,4304,0,4339,1965,90,5.7,10,10,1609.0,244,0,919999999,18,0.1620,0,88,0.097,0.0,0.0 +2015,4,20,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.0,7.0,100,101279,234,1353,325,21,0,21,2056,0,2071,863,70,6.2,10,10,2816.0,122,0,919999999,20,0.1620,0,88,0.097,0.0,0.0 +2015,4,20,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,8.0,7.0,93,101280,0,1242,330,0,0,0,0,0,0,0,70,6.2,10,10,3219.0,183,0,919999999,20,0.1620,0,88,0.097,0.0,0.0 +2015,4,20,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,10.0,9.0,93,101280,0,0,341,0,0,0,0,0,0,0,110,6.2,10,10,3219.0,305,0,919999999,24,0.1620,0,88,0.097,5.0,0.0 +2015,4,20,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,11.0,10.0,94,101280,0,0,347,0,0,0,0,0,0,0,130,5.7,10,10,6437.0,244,0,919999999,27,0.1620,0,88,0.097,5.0,0.0 +2015,4,20,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,11.0,10.0,94,101280,0,0,347,0,0,0,0,0,0,0,130,7.7,10,10,8047.0,244,0,919999999,27,0.1620,0,88,0.097,5.0,0.0 +2015,4,20,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,10.6,10.6,100,100605,0,0,346,0,0,0,0,0,0,0,130,6.7,10,10,4828.0,183,0,919999999,28,0.1620,0,88,0.097,5.0,0.0 +2015,4,20,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,11.0,11.0,100,101280,0,0,349,0,0,0,0,0,0,0,130,6.2,10,10,3219.0,183,0,919999999,29,0.1620,0,88,0.097,5.0,0.0 +2015,4,21,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,10.0,10.0,100,101280,0,0,343,0,0,0,0,0,0,0,130,4.1,10,10,1609.0,183,0,919999999,27,0.1630,0,88,0.097,4.0,0.0 +2015,4,21,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,10.0,10.0,100,101280,0,0,343,0,0,0,0,0,0,0,120,3.6,10,10,1609.0,122,0,919999999,27,0.1630,0,88,0.097,0.0,0.0 +2015,4,21,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,8.9,8.9,100,100155,0,0,320,0,0,0,0,0,0,0,80,4.1,8,8,805.0,61,0,919999999,24,0.1630,0,88,0.097,0.0,0.0 +2015,4,21,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,8.3,8.3,100,100115,0,0,332,0,0,0,0,0,0,0,120,3.6,10,10,805.0,91,0,919999999,22,0.1630,0,88,0.097,0.0,0.0 +2015,4,21,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,8.0,8.0,100,101280,0,0,331,0,0,0,0,0,0,0,140,3.1,10,10,805.0,91,0,019999999,22,0.1630,0,88,0.097,0.0,0.0 +2015,4,21,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,8.0,8.0,100,101280,128,690,322,14,0,14,1357,0,1367,539,180,2.1,9,9,2012.0,457,0,019999999,22,0.1630,0,88,0.097,0.0,0.0 +2015,4,21,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,12.0,12.0,100,101280,383,1352,355,59,2,59,6857,67,6874,2414,150,2.1,10,10,3219.0,183,0,019999999,32,0.1630,0,88,0.097,0.0,0.0 +2015,4,21,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.0,13.0,100,101280,624,1352,361,73,2,73,8807,100,8831,3418,190,3.6,10,10,3219.0,122,0,019999999,36,0.1630,0,88,0.097,0.0,0.0 +2015,4,21,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,14.0,94,101281,835,1352,362,205,34,184,23892,2306,21548,8370,220,4.6,9,9,3219.0,305,0,019999999,39,0.1630,0,88,0.097,0.0,0.0 +2015,4,21,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,13.9,76,100017,1002,1352,358,561,529,177,67314,34440,21339,8755,240,5.1,5,5,3219.0,77777,0,019999999,38,0.1630,0,88,0.097,0.0,0.0 +2015,4,21,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,13.3,78,100026,1113,1352,372,587,326,343,68021,26575,40003,15136,280,6.2,9,9,3219.0,1219,0,019999999,36,0.1630,0,88,0.097,0.0,0.0 +2015,4,21,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,12.8,70,100027,1161,1352,377,697,487,281,82616,36255,33505,13239,280,5.7,9,9,3219.0,1829,0,019999999,34,0.1630,0,88,0.097,0.0,0.0 +2015,4,21,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,10.6,63,100087,1142,1352,351,632,276,397,72809,24309,46048,16809,260,7.7,5,5,3219.0,77777,0,019999999,28,0.1630,0,88,0.097,0.0,0.0 +2015,4,21,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,9.4,58,100097,1057,1352,371,624,325,362,71577,28509,41794,15343,270,7.7,9,9,3219.0,1402,0,019999999,25,0.1630,0,88,0.097,0.0,0.0 +2015,4,21,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,8.3,58,100146,913,1352,364,532,302,313,60405,26263,35756,12833,280,7.7,9,9,3219.0,1494,0,019999999,22,0.1630,0,88,0.097,0.0,0.0 +2015,4,21,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,5.6,48,100206,720,1352,340,500,469,213,56693,36867,24275,8589,290,7.2,5,5,3219.0,77777,0,019999999,17,0.1630,0,88,0.097,0.0,0.0 +2015,4,21,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,4.4,44,100266,490,1352,339,332,385,171,36520,27783,18902,5822,270,6.2,5,5,3219.0,77777,0,019999999,15,0.1630,0,88,0.097,0.0,0.0 +2015,4,21,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,2.8,41,100346,239,1352,329,195,311,97,20816,12097,10400,2646,290,5.1,3,3,3219.0,77777,0,019999999,13,0.1630,0,88,0.097,0.0,0.0 +2015,4,21,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,2.8,44,100456,0,1266,324,0,0,0,0,0,0,0,300,3.6,3,3,3219.0,77777,0,019999999,13,0.1630,0,88,0.097,0.0,0.0 +2015,4,21,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,2.8,46,100566,0,0,321,0,0,0,0,0,0,0,290,3.1,3,3,3219.0,77777,9,999999999,13,0.1630,0,88,0.097,0.0,0.0 +2015,4,21,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,2.2,45,100636,0,0,323,0,0,0,0,0,0,0,340,3.6,5,5,3219.0,77777,9,999999999,12,0.1630,0,88,0.097,0.0,0.0 +2015,4,21,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,2.2,47,100666,0,0,349,0,0,0,0,0,0,0,350,1.5,10,10,3219.0,2591,9,999999999,12,0.1630,0,88,0.097,0.0,0.0 +2015,4,21,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,2.8,54,100695,0,0,333,0,0,0,0,0,0,0,295,0.0,9,9,3219.0,2743,9,999999999,13,0.1630,0,88,0.097,0.0,0.0 +2015,4,21,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,3.3,66,100735,0,0,288,0,0,0,0,0,0,0,140,1.5,0,0,3219.0,77777,9,999999999,14,0.1630,0,88,0.097,0.0,0.0 +2015,4,22,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,3.3,71,100775,0,0,283,0,0,0,0,0,0,0,200,1.5,0,0,3219.0,77777,9,999999999,14,0.1640,0,88,0.097,0.0,0.0 +2015,4,22,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,3.9,82,100804,0,0,277,0,0,0,0,0,0,0,190,3.1,0,0,3219.0,77777,9,999999999,15,0.1640,0,88,0.097,0.0,0.0 +2015,4,22,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,4.4,82,100795,0,0,280,0,0,0,0,0,0,0,227,0.0,0,0,3219.0,77777,9,999999999,15,0.1640,0,88,0.097,0.0,0.0 +2015,4,22,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,4.4,89,100784,0,0,276,0,0,0,0,0,0,0,130,1.5,0,0,3219.0,77777,9,999999999,15,0.1640,0,88,0.097,0.0,0.0 +2015,4,22,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,3.9,82,100844,0,0,289,0,0,0,0,0,0,0,236,0.0,3,3,3219.0,77777,9,999999999,15,0.1640,0,88,0.097,0.0,0.0 +2015,4,22,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,5.0,82,100855,134,724,295,27,61,21,3106,0,2420,770,190,1.5,3,3,3219.0,77777,9,999999999,16,0.1640,0,88,0.097,0.0,0.0 +2015,4,22,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,5.0,71,100855,389,1352,309,148,281,73,16997,11839,8409,2885,170,1.5,5,5,3219.0,77777,9,999999999,16,0.1640,0,88,0.097,0.0,0.0 +2015,4,22,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,2.8,51,100815,629,1352,314,332,542,110,39034,33648,12979,4875,190,2.1,3,3,3219.0,77777,9,999999999,13,0.1640,0,88,0.097,0.0,0.0 +2015,4,22,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,3.9,51,100746,840,1352,320,519,697,132,62425,46228,15938,6391,130,3.1,3,3,3219.0,77777,9,999999999,14,0.1640,0,88,0.097,0.0,0.0 +2015,4,22,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,2.8,42,100666,1006,1352,332,679,768,151,82941,52296,18523,7657,181,2.6,5,5,3219.0,77777,9,999999999,13,0.1640,0,88,0.097,0.0,0.0 +2015,4,22,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,0.6,29,100557,1117,1352,345,809,845,142,100868,56520,17778,7429,220,9.3,5,5,3219.0,77777,9,999999999,10,0.1640,0,88,0.097,0.0,0.0 +2015,4,22,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,1.1,30,100457,1164,1352,345,760,550,300,90133,45117,35791,13925,200,8.8,5,5,3219.0,77777,9,999999999,11,0.1640,0,88,0.097,0.0,0.0 +2015,4,22,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,0.0,27,100357,1145,1352,346,661,308,398,76495,28551,46368,16857,200,11.3,5,5,3219.0,77777,9,999999999,10,0.1640,0,88,0.097,0.0,0.0 +2015,4,22,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,3.9,37,100257,1061,1352,349,713,504,300,83251,42057,35237,13531,180,14.4,5,5,3219.0,77777,9,999999999,14,0.1640,0,88,0.097,0.0,0.0 +2015,4,22,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,1.7,34,100157,917,1352,341,657,563,234,76583,44860,27420,10530,190,12.4,5,5,3219.0,77777,9,999999999,11,0.1640,0,88,0.097,0.0,0.0 +2015,4,22,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,0.6,34,100176,723,1352,354,527,565,182,60657,42628,21046,7715,190,10.8,9,9,3219.0,6096,9,999999999,10,0.1640,0,88,0.097,0.0,0.0 +2015,4,22,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,1.7,38,100176,493,1352,353,281,214,164,31077,15312,18223,5721,200,10.3,9,9,3219.0,6096,9,999999999,11,0.1640,0,88,0.097,0.0,0.0 +2015,4,22,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,4.4,47,100206,243,1352,353,124,60,107,13141,2594,11393,2766,200,12.4,9,9,3219.0,2743,9,999999999,15,0.1640,0,88,0.097,0.0,0.0 +2015,4,22,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,4.4,55,100166,0,1290,342,0,0,0,0,0,0,0,190,7.7,9,9,3219.0,6096,9,999999999,15,0.1640,0,88,0.097,0.0,0.0 +2015,4,22,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,6.7,69,100166,0,0,349,0,0,0,0,0,0,0,210,12.4,10,10,3219.0,1829,0,919999999,19,0.1640,0,88,0.102,0.0,0.0 +2015,4,22,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,7.8,83,100015,0,0,343,0,0,0,0,0,0,0,170,7.2,10,10,3219.0,2591,0,919999999,21,0.1640,0,88,0.102,0.0,0.0 +2015,4,22,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,7.8,80,100016,0,0,345,0,0,0,0,0,0,0,200,6.7,10,10,3219.0,2743,0,919999999,21,0.1640,0,88,0.102,0.0,0.0 +2015,4,22,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,6.7,80,99955,0,0,311,0,0,0,0,0,0,0,210,7.7,5,5,3219.0,77777,0,919999999,19,0.1640,0,88,0.102,0.0,0.0 +2015,4,22,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,4.4,73,99985,0,0,304,0,0,0,0,0,0,0,240,9.3,5,5,3219.0,77777,0,919999999,15,0.1640,0,88,0.102,0.0,0.0 +2015,4,23,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.0,3.0,71,101280,0,0,325,0,0,0,0,0,0,0,270,9.8,10,10,3219.0,792,0,919999999,13,0.1650,0,88,0.102,0.0,0.0 +2015,4,23,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.0,2.0,66,101280,0,0,315,0,0,0,0,0,0,0,290,9.8,9,9,3219.0,1372,0,919999999,12,0.1650,0,88,0.102,0.0,0.0 +2015,4,23,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,1.1,70,100155,0,0,272,0,0,0,0,0,0,0,260,4.6,0,0,3219.0,77777,0,919999999,11,0.1650,0,88,0.102,0.0,0.0 +2015,4,23,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,0.6,70,100165,0,0,270,0,0,0,0,0,0,0,250,5.7,0,0,3219.0,77777,0,919999999,10,0.1650,0,88,0.102,0.0,0.0 +2015,4,23,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,0.6,70,100145,0,0,282,0,0,0,0,0,0,0,260,6.2,3,3,3219.0,77777,0,919999999,10,0.1650,0,88,0.102,0.0,0.0 +2015,4,23,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,0.6,70,100255,140,757,282,32,116,20,3714,0,2324,746,260,5.1,3,3,3219.0,77777,0,919999999,10,0.1650,0,88,0.102,0.0,0.0 +2015,4,23,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-0.6,59,100265,394,1351,289,161,389,56,18943,15407,6604,2334,270,7.2,5,5,3219.0,77777,0,919999999,9,0.1650,0,88,0.102,0.0,0.0 +2015,4,23,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,-1.1,53,100245,634,1351,293,350,648,88,41954,38492,10580,4051,270,5.7,5,5,3219.0,77777,0,919999999,9,0.1650,0,88,0.102,0.0,0.0 +2015,4,23,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,-2.8,42,100225,845,1351,292,542,788,102,66640,50656,12582,5113,250,7.7,3,3,3219.0,77777,0,919999999,7,0.1650,0,88,0.102,0.0,0.0 +2015,4,23,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,-3.3,39,100215,1010,1351,298,566,509,235,66995,40438,27963,11052,260,7.7,5,5,3219.0,77777,0,919999999,7,0.1650,0,88,0.102,0.0,0.0 +2015,4,23,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,-3.3,39,100215,1121,1351,315,585,377,300,69037,31745,35613,13791,270,7.2,9,9,3219.0,1676,0,919999999,7,0.1650,0,88,0.102,0.0,0.0 +2015,4,23,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,-5.0,35,100185,1168,1351,320,331,28,307,39261,2358,36633,14179,280,7.7,10,10,3219.0,2134,0,919999999,6,0.1650,0,88,0.102,0.0,0.0 +2015,4,23,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,-6.1,31,100195,1148,1351,321,525,124,419,60622,11924,48711,17422,280,6.7,10,10,3219.0,2134,0,919999999,5,0.1650,0,88,0.102,0.0,0.0 +2015,4,23,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,-7.8,26,100175,1064,1351,313,505,141,390,57945,13569,45044,16126,280,8.2,9,9,3219.0,2438,0,919999999,4,0.1650,0,88,0.102,0.0,0.0 +2015,4,23,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,-7.2,27,100195,920,1351,314,456,182,325,51917,16970,37227,13205,270,7.7,9,9,3219.0,2591,0,919999999,5,0.1650,0,88,0.102,0.0,0.0 +2015,4,23,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,-7.8,28,100235,727,1351,308,377,194,246,42459,16982,27855,9481,270,7.7,9,9,3219.0,2743,0,919999999,4,0.1650,0,88,0.102,0.0,0.0 +2015,4,23,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,-7.2,30,100265,497,1351,306,220,86,169,24344,6446,18789,5852,270,6.7,9,9,3219.0,2896,0,919999999,5,0.1650,0,88,0.102,0.0,0.0 +2015,4,23,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,-5.0,38,100335,247,1351,306,115,38,104,12272,1706,11148,2785,290,5.7,9,9,3219.0,3048,0,919999999,6,0.1650,0,88,0.102,0.0,0.0 +2015,4,23,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-4.4,43,100405,0,1314,302,0,0,0,0,0,0,0,280,7.7,9,9,3219.0,2896,0,919999999,6,0.1650,0,88,0.102,0.0,0.0 +2015,4,23,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-6.1,39,100455,0,0,298,0,0,0,0,0,0,0,290,9.8,9,9,3219.0,2896,9,999999999,5,0.1650,0,88,0.102,0.0,0.0 +2015,4,23,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-6.1,42,100504,0,0,277,0,0,0,0,0,0,0,290,7.2,5,5,3219.0,77777,9,999999999,5,0.1650,0,88,0.102,0.0,0.0 +2015,4,23,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-5.6,46,100514,0,0,275,0,0,0,0,0,0,0,290,7.7,5,5,3219.0,77777,9,999999999,6,0.1650,0,88,0.102,0.0,0.0 +2015,4,23,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-5.0,50,100524,0,0,298,0,0,0,0,0,0,0,270,7.2,10,10,3219.0,2286,9,999999999,6,0.1650,0,88,0.102,0.0,0.0 +2015,4,23,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-3.9,57,100534,0,0,297,0,0,0,0,0,0,0,280,7.2,10,10,3219.0,2591,9,999999999,7,0.1650,0,88,0.102,0.0,0.0 +2015,4,24,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-3.9,59,100504,0,0,255,0,0,0,0,0,0,0,280,5.7,0,0,3219.0,77777,9,999999999,7,0.1660,0,88,0.102,0.0,0.0 +2015,4,24,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-3.3,62,100504,0,0,256,0,0,0,0,0,0,0,280,7.2,0,0,3219.0,77777,9,999999999,7,0.1660,0,88,0.102,0.0,0.0 +2015,4,24,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-3.3,62,100514,0,0,295,0,0,0,0,0,0,0,260,7.2,10,10,3219.0,2896,9,999999999,7,0.1660,0,88,0.102,0.0,0.0 +2015,4,24,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.8,-2.8,65,100544,0,0,296,0,0,0,0,0,0,0,280,6.2,10,10,4828.0,2286,0,999099999,7,0.1660,0,88,0.102,0.0,0.0 +2015,4,24,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.0,-2.0,68,101279,0,0,289,0,0,0,0,0,0,0,270,8.8,9,9,4828.0,2286,0,999099999,8,0.1660,0,88,0.102,0.0,0.0 +2015,4,24,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-3.9,57,100584,146,791,272,35,144,19,4096,0,2226,721,290,7.2,5,5,4828.0,77777,0,999099999,7,0.1660,0,88,0.102,0.0,0.0 +2015,4,24,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-3.9,51,100604,400,1350,279,168,425,52,19925,16921,6180,2200,300,8.8,5,5,4828.0,77777,0,999099999,7,0.1660,0,88,0.102,0.0,0.0 +2015,4,24,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-3.3,47,100595,639,1350,287,358,681,82,43208,40176,9924,3821,290,6.7,5,5,4828.0,77777,0,999099999,7,0.1660,0,88,0.102,0.0,0.0 +2015,4,24,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,-3.9,43,100615,849,1350,305,549,807,97,67821,51544,12020,4898,300,7.2,9,9,4828.0,2896,0,999099999,7,0.1660,0,88,0.102,0.0,0.0 +2015,4,24,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,-3.9,42,100605,1014,1350,290,715,876,107,74890,88452,14608,2798,290,7.2,5,5,4828.0,77777,0,999099999,7,0.1660,0,88,0.102,0.0,0.0 +2015,4,24,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,-3.9,39,100575,1124,1350,295,842,928,105,88208,94023,14050,3563,320,7.7,5,5,4828.0,77777,0,999099999,7,0.1660,0,88,0.102,0.0,0.0 +2015,4,24,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,-4.4,37,100555,1171,1350,312,826,713,225,100369,54123,27483,11112,270,7.2,9,9,4828.0,1524,0,999099999,6,0.1660,0,88,0.102,0.0,0.0 +2015,4,24,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,-3.9,37,100545,1151,1350,315,770,543,303,91210,45576,36106,13993,270,6.7,9,9,4828.0,1524,0,999099999,7,0.1660,0,88,0.102,0.0,0.0 +2015,4,24,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,-4.4,36,100515,1067,1350,297,822,793,178,100220,57490,21802,8970,310,7.7,5,5,4828.0,77777,0,999099999,6,0.1660,0,88,0.102,0.0,0.0 +2015,4,24,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,-4.4,34,100515,923,1350,317,775,910,102,81260,91501,14199,2332,290,6.7,9,9,4828.0,1676,0,999099999,6,0.1660,0,88,0.102,0.0,0.0 +2015,4,24,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,-5.0,34,100575,730,1350,313,624,854,97,75611,54134,11790,4644,320,7.7,9,9,4828.0,1829,0,999099999,6,0.1660,0,88,0.102,0.0,0.0 +2015,4,24,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,-5.6,33,100605,501,1350,311,340,354,150,38020,24896,16848,5478,280,7.2,9,9,4828.0,1829,0,999099999,6,0.1660,0,88,0.102,0.0,0.0 +2015,4,24,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,-6.1,35,100685,251,1350,305,116,51,92,12533,2040,9981,2692,320,7.7,9,9,4828.0,1829,0,999099999,5,0.1660,0,88,0.102,0.0,0.0 +2015,4,24,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,-6.1,36,100745,0,1337,303,0,0,0,0,0,0,0,300,5.7,9,9,4828.0,1829,0,999099999,5,0.1660,0,88,0.102,0.0,0.0 +2015,4,24,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-6.7,35,100804,0,0,300,0,0,0,0,0,0,0,300,7.2,9,9,4828.0,1829,9,999999999,5,0.1660,0,88,0.102,0.0,0.0 +2015,4,24,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-6.1,37,100824,0,0,300,0,0,0,0,0,0,0,300,7.7,9,9,4828.0,1829,9,999999999,5,0.1660,0,88,0.102,0.0,0.0 +2015,4,24,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-6.1,39,100834,0,0,306,0,0,0,0,0,0,0,300,7.7,10,10,4828.0,1676,9,999999999,5,0.1660,0,88,0.102,0.0,0.0 +2015,4,24,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-5.0,44,100814,0,0,297,0,0,0,0,0,0,0,310,4.6,9,9,4828.0,1676,9,999999999,6,0.1660,0,88,0.102,0.0,0.0 +2015,4,24,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-6.1,44,100784,0,0,274,0,0,0,0,0,0,0,300,5.1,5,5,4828.0,77777,9,999999999,5,0.1660,0,88,0.102,0.0,0.0 +2015,4,25,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-5.6,46,100754,0,0,271,0,0,0,0,0,0,0,280,5.7,3,3,4828.0,77777,9,999999999,6,0.1680,0,88,0.102,0.0,0.0 +2015,4,25,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-5.6,47,100744,0,0,269,0,0,0,0,0,0,0,290,4.1,3,3,4828.0,77777,9,999999999,6,0.1680,0,88,0.102,0.0,0.0 +2015,4,25,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-5.6,49,100734,0,0,255,0,0,0,0,0,0,0,290,4.1,0,0,4828.0,77777,9,999999999,6,0.1680,0,88,0.102,0.0,0.0 +2015,4,25,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-5.6,51,100744,0,0,265,0,0,0,0,0,0,0,280,3.6,3,3,4828.0,77777,9,999999999,6,0.1680,0,88,0.102,0.0,0.0 +2015,4,25,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-5.6,53,100774,0,0,266,0,0,0,0,0,0,0,280,4.1,5,5,4828.0,77777,9,999999999,6,0.1680,0,88,0.102,0.0,0.0 +2015,4,25,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-5.0,54,100824,152,823,265,41,192,21,4777,0,2450,791,280,4.1,3,3,4828.0,77777,9,999999999,6,0.1680,0,88,0.102,0.0,0.0 +2015,4,25,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-5.0,48,100814,405,1349,271,176,471,50,20971,18841,5970,2136,300,5.1,3,3,4828.0,77777,9,999999999,6,0.1680,0,88,0.102,0.0,0.0 +2015,4,25,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-4.4,45,100784,644,1349,283,307,490,123,35957,32680,14460,5396,300,5.7,5,5,4828.0,77777,9,999999999,6,0.1680,0,88,0.102,0.0,0.0 +2015,4,25,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,-4.4,42,100725,854,1349,287,556,826,91,58489,82764,12906,2041,290,5.7,5,5,4828.0,77777,9,999999999,6,0.1680,0,88,0.102,0.0,0.0 +2015,4,25,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,-3.9,39,100655,1018,1349,295,721,892,99,75694,90140,13566,2738,300,5.1,5,5,4828.0,77777,9,999999999,7,0.1680,0,88,0.102,0.0,0.0 +2015,4,25,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,-3.3,35,100615,1128,1349,305,844,931,102,88541,94400,13662,3543,300,5.1,5,5,4828.0,77777,9,999999999,7,0.1680,0,88,0.102,0.0,0.0 +2015,4,25,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,-3.9,32,100545,1174,1349,307,912,943,108,95434,95622,14282,4192,330,6.2,5,5,4828.0,77777,9,999999999,7,0.1680,0,88,0.102,0.0,0.0 +2015,4,25,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,-3.3,31,100506,1154,1349,331,784,578,285,93344,47345,34130,13373,310,8.2,9,9,4828.0,1981,9,999999999,7,0.1680,0,88,0.102,0.0,0.0 +2015,4,25,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,-3.3,30,100466,1070,1349,333,612,300,359,70706,27523,41741,15367,310,3.1,9,9,4828.0,2134,9,999999999,7,0.1680,0,88,0.102,0.0,0.0 +2015,4,25,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,-3.9,31,100456,926,1349,327,445,163,314,50835,14830,36085,12993,330,5.1,9,9,4828.0,2134,9,999999999,7,0.1680,0,88,0.102,0.0,0.0 +2015,4,25,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,-3.3,31,100446,734,1349,331,293,67,252,32953,5856,28497,9689,320,6.2,9,9,4828.0,2134,9,999999999,7,0.1680,0,88,0.102,0.0,0.0 +2015,4,25,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,-0.6,49,100475,505,1349,318,119,3,117,13575,185,13398,4636,100,4.1,9,9,4828.0,2286,9,999999999,9,0.1680,0,88,0.102,0.0,0.0 +2015,4,25,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,-0.6,53,100535,255,1349,314,77,2,76,8458,64,8379,2459,100,3.6,9,9,4828.0,2438,9,999999999,9,0.1680,0,88,0.102,0.0,0.0 +2015,4,25,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,0.6,58,100585,126,1349,315,21,0,21,2020,0,2033,330,70,3.6,9,9,4828.0,2438,9,999999999,10,0.1680,0,88,0.102,0.0,0.0 +2015,4,25,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,-0.6,53,100615,0,13,314,0,0,0,0,0,0,0,340,4.6,9,9,4828.0,2591,9,999999999,9,0.1680,0,88,0.102,0.0,0.0 +2015,4,25,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,-2.8,44,100635,0,0,311,0,0,0,0,0,0,0,360,4.6,9,9,4828.0,2438,9,999999999,7,0.1680,0,88,0.102,0.0,0.0 +2015,4,25,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,-2.2,50,100625,0,0,285,0,0,0,0,0,0,0,360,5.1,3,3,4828.0,77777,9,999999999,8,0.1680,0,88,0.102,0.0,0.0 +2015,4,25,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-2.2,52,100625,0,0,283,0,0,0,0,0,0,0,340,3.1,3,3,4828.0,77777,9,999999999,8,0.1680,0,88,0.102,0.0,0.0 +2015,4,25,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-1.7,54,100595,0,0,305,0,0,0,0,0,0,0,330,2.6,9,9,4828.0,2438,9,999999999,8,0.1680,0,88,0.102,0.0,0.0 +2015,4,26,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-1.1,57,100525,0,0,315,0,0,0,0,0,0,0,340,3.6,10,10,4828.0,2286,9,999999999,9,0.1690,0,88,0.102,0.0,0.0 +2015,4,26,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-1.1,57,100465,0,0,306,0,0,0,0,0,0,0,340,3.6,9,9,4828.0,2286,9,999999999,9,0.1690,0,88,0.102,0.0,0.0 +2015,4,26,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-1.1,59,100445,0,0,303,0,0,0,0,0,0,0,330,2.1,9,9,4828.0,2286,9,999999999,9,0.1690,0,88,0.102,0.0,0.0 +2015,4,26,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-1.1,57,100415,0,0,306,0,0,0,0,0,0,0,320,2.6,9,9,4828.0,2286,9,999999999,9,0.1690,0,88,0.102,0.0,0.0 +2015,4,26,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-1.1,59,100435,0,0,303,0,0,0,0,0,0,0,300,3.1,9,9,4828.0,2134,9,999999999,9,0.1690,0,88,0.102,0.0,0.0 +2015,4,26,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,-0.6,57,100495,158,856,287,42,181,22,4886,0,2563,830,310,2.1,3,3,4828.0,77777,9,999999999,9,0.1690,0,88,0.102,0.0,0.0 +2015,4,26,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,0.0,58,100485,410,1349,290,176,451,54,20854,18208,6412,2293,300,2.6,3,3,4828.0,77777,9,999999999,10,0.1690,0,88,0.102,0.0,0.0 +2015,4,26,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,0.6,56,100445,649,1349,318,287,389,141,33250,26702,16402,6032,350,3.6,9,9,4828.0,2134,9,999999999,10,0.1690,0,88,0.102,0.0,0.0 +2015,4,26,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,0.6,52,100445,858,1349,323,340,200,241,39188,16413,27926,10393,20,2.1,9,9,4828.0,2438,9,999999999,10,0.1690,0,88,0.102,0.0,0.0 +2015,4,26,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,1.1,56,100435,1022,1349,329,439,156,330,50646,13840,38306,14219,110,3.6,10,10,4828.0,2438,9,999999999,11,0.1690,0,88,0.102,0.0,0.0 +2015,4,26,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,1.7,54,100405,1131,1349,327,599,279,373,69531,25101,43580,16111,110,4.6,9,9,4828.0,2438,9,999999999,12,0.1690,0,88,0.102,0.0,0.0 +2015,4,26,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,1.7,61,100365,1177,1349,319,371,96,293,44167,7757,35088,13724,130,5.7,9,9,4828.0,1829,9,999999999,12,0.1690,0,88,0.102,0.0,0.0 +2015,4,26,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,2.8,68,100335,1157,1349,317,144,3,141,18055,197,17752,7412,110,3.1,9,9,4828.0,1981,9,999999999,13,0.1690,0,88,0.102,0.0,0.0 +2015,4,26,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,2.2,61,100315,1073,1349,331,157,3,154,19340,204,19052,7929,150,1.5,10,10,4828.0,2134,9,999999999,12,0.1690,0,88,0.102,0.0,0.0 +2015,4,26,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,1.7,50,100276,929,1349,341,277,58,237,32331,4627,27809,10716,170,2.6,10,10,4828.0,2591,9,999999999,12,0.1690,0,88,0.102,0.0,0.0 +2015,4,26,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,1.1,45,100256,737,1349,346,187,6,182,21580,451,21101,7801,230,1.5,10,10,4828.0,2743,9,999999999,11,0.1690,0,88,0.102,0.0,0.0 +2015,4,26,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,-2.2,34,100236,508,1349,342,108,6,105,12444,357,12141,4288,300,4.6,10,10,4828.0,2134,9,999999999,8,0.1690,0,88,0.102,0.0,0.0 +2015,4,26,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,2.8,61,100275,259,1349,334,55,6,52,6236,126,5912,1909,80,1.5,10,10,4828.0,2591,9,999999999,13,0.1690,0,88,0.102,0.0,0.0 +2015,4,26,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,2.2,56,100275,7,1349,336,5,0,5,481,0,484,176,317,0.0,10,10,4828.0,2743,9,999999999,12,0.1690,0,88,0.102,0.0,0.0 +2015,4,26,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,3.9,71,100285,0,38,330,0,0,0,0,0,0,0,320,0.0,10,10,4828.0,2743,9,999999999,14,0.1690,0,88,0.102,0.0,0.0 +2015,4,26,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,1.7,52,100275,0,0,338,0,0,0,0,0,0,0,330,2.6,10,10,4828.0,2743,9,999999999,12,0.1690,0,88,0.102,0.0,0.0 +2015,4,26,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,0.0,46,100255,0,0,336,0,0,0,0,0,0,0,330,5.1,10,10,4828.0,2438,9,999999999,10,0.1690,0,88,0.102,0.0,0.0 +2015,4,26,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,0.0,48,100245,0,0,334,0,0,0,0,0,0,0,320,4.1,10,10,4828.0,2743,9,999999999,10,0.1690,0,88,0.102,0.0,0.0 +2015,4,26,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,0.0,50,100235,0,0,331,0,0,0,0,0,0,0,310,3.1,10,10,4828.0,2743,9,999999999,10,0.1690,0,88,0.102,0.0,0.0 +2015,4,27,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,0.6,54,100225,0,0,329,0,0,0,0,0,0,0,300,3.6,10,10,4828.0,2591,9,999999999,10,0.1700,0,88,0.102,0.0,0.0 +2015,4,27,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,0.6,56,100205,0,0,318,0,0,0,0,0,0,0,300,3.1,9,9,4828.0,4267,9,999999999,10,0.1700,0,88,0.102,0.0,0.0 +2015,4,27,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,0.6,56,100175,0,0,318,0,0,0,0,0,0,0,290,3.1,9,9,4828.0,4267,9,999999999,10,0.1700,0,88,0.102,0.0,0.0 +2015,4,27,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,0.6,58,100175,0,0,315,0,0,0,0,0,0,0,290,3.6,9,9,4828.0,3048,9,999999999,10,0.1700,0,88,0.102,0.0,0.0 +2015,4,27,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,1.1,58,100185,0,0,318,0,0,0,0,0,0,0,300,4.1,9,9,4828.0,2896,9,999999999,11,0.1700,0,88,0.102,0.0,0.0 +2015,4,27,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,1.1,56,100205,164,887,329,8,0,8,780,0,786,333,300,4.1,10,10,4828.0,2743,9,999999999,11,0.1700,0,88,0.102,0.0,0.0 +2015,4,27,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,1.7,59,100195,416,1348,330,55,0,55,5483,0,5525,2339,310,3.1,10,10,4828.0,2286,9,999999999,12,0.1700,0,88,0.102,0.0,0.0 +2015,4,27,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,2.2,58,100175,654,1348,334,178,63,147,20565,4360,17055,6251,310,5.7,10,10,4828.0,2896,9,999999999,12,0.1700,0,88,0.102,0.0,0.0 +2015,4,27,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,2.8,54,100126,862,1348,314,427,444,144,51236,30310,17349,6959,310,6.7,5,5,4828.0,77777,9,999999999,13,0.1700,0,88,0.102,0.0,0.0 +2015,4,27,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,2.2,50,100096,1026,1348,335,439,222,272,51439,18140,32052,12438,320,5.7,9,9,4828.0,1676,9,999999999,12,0.1700,0,88,0.102,0.0,0.0 +2015,4,27,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,1.7,49,100056,1135,1348,343,185,6,181,22712,422,22326,9208,310,5.7,10,10,4828.0,1829,9,999999999,11,0.1700,0,88,0.102,0.0,0.0 +2015,4,27,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,0.6,42,100006,1180,1348,347,311,76,246,37552,5813,29866,11973,340,7.2,10,10,4828.0,1829,9,999999999,10,0.1700,0,88,0.102,0.0,0.0 +2015,4,27,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,1.1,42,99976,1160,1348,351,480,106,388,55790,9624,45397,16681,300,6.7,10,10,4828.0,1829,9,999999999,11,0.1700,0,88,0.102,0.0,0.0 +2015,4,27,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,1.1,42,99956,1076,1348,351,282,16,268,33334,1289,31858,12528,330,7.7,10,10,4828.0,1829,9,999999999,11,0.1700,0,88,0.102,0.0,0.0 +2015,4,27,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,1.7,45,99946,932,1348,349,335,84,276,38655,7101,32029,11983,330,8.8,10,10,4828.0,1676,9,999999999,11,0.1700,0,88,0.102,0.0,0.0 +2015,4,27,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,2.2,47,99996,740,1348,349,144,2,143,16941,137,16892,6484,320,7.2,10,10,4828.0,1372,0,919999999,12,0.1700,0,88,0.102,0.0,0.0 +2015,4,27,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,5.6,77,100135,512,1348,335,112,8,108,12857,462,12443,4397,40,6.7,10,10,4828.0,1402,0,919999999,17,0.1700,0,88,0.102,0.0,0.0 +2015,4,27,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,5.6,69,100116,263,1348,333,117,76,100,12572,3117,10793,2890,330,4.1,9,9,4828.0,2438,0,919999999,17,0.1700,0,88,0.102,0.0,0.0 +2015,4,27,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,4.4,63,100116,11,1348,332,30,18,28,3007,0,2821,325,320,6.2,9,9,4828.0,6706,0,919999999,15,0.1700,0,88,0.102,0.0,0.0 +2015,4,27,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,3.3,59,100136,0,64,312,0,0,0,0,0,0,0,310,6.2,5,5,4828.0,77777,9,999999999,14,0.1700,0,88,0.102,0.0,0.0 +2015,4,27,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,5.0,68,100175,0,0,340,0,0,0,0,0,0,0,360,5.7,10,10,4828.0,1463,0,919999999,16,0.1700,0,88,0.102,0.0,0.0 +2015,4,27,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,8.0,6.0,87,101280,0,0,329,0,0,0,0,0,0,0,40,6.7,10,10,9656.0,1463,0,919999999,18,0.1700,0,88,0.102,4.0,0.0 +2015,4,27,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,5.6,90,100295,0,0,324,0,0,0,0,0,0,0,50,2.1,10,10,9656.0,1372,0,919999999,17,0.1700,0,88,0.102,0.3,0.0 +2015,4,27,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,5.6,86,100315,0,0,327,0,0,0,0,0,0,0,360,2.6,10,10,9656.0,1341,0,919999999,17,0.1700,0,88,0.102,0.0,0.0 +2015,4,28,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.0,4.0,81,101279,0,0,322,0,0,0,0,0,0,0,30,8.2,10,10,6437.0,762,0,919999999,15,0.1710,0,88,0.102,0.0,0.0 +2015,4,28,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.0,4.0,81,101279,0,0,322,0,0,0,0,0,0,0,30,9.8,10,10,6437.0,823,0,919999999,15,0.1710,0,88,0.102,0.0,0.0 +2015,4,28,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,2.2,76,100465,0,0,316,0,0,0,0,0,0,0,30,8.2,10,10,6437.0,1158,0,919999999,12,0.1710,0,88,0.102,0.0,0.0 +2015,4,28,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,2.2,73,100505,0,0,318,0,0,0,0,0,0,0,360,5.7,10,10,6437.0,1981,0,919999999,12,0.1710,0,88,0.102,0.0,0.0 +2015,4,28,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,1.7,70,100575,0,0,318,0,0,0,0,0,0,0,10,7.2,10,10,6437.0,1829,0,919999999,12,0.1710,0,88,0.102,0.0,0.0 +2015,4,28,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,1.7,70,100655,169,919,318,9,0,9,878,0,884,374,10,7.7,10,10,6437.0,1524,0,919999999,12,0.1710,0,88,0.102,0.0,0.0 +2015,4,28,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,1.1,65,100695,421,1347,311,62,7,61,7295,300,7195,2565,10,8.8,9,9,6437.0,1097,0,919999999,11,0.1710,0,88,0.102,0.0,0.0 +2015,4,28,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,0.6,60,100765,658,1347,313,176,44,157,20256,3146,18148,6594,10,7.2,9,9,6437.0,1402,0,919999999,10,0.1710,0,88,0.102,0.0,0.0 +2015,4,28,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,0.6,56,100775,866,1347,318,192,10,186,22619,746,22015,8601,10,5.7,9,9,6437.0,1280,0,919999999,10,0.1710,0,88,0.102,0.0,0.0 +2015,4,28,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,1.7,56,100755,1030,1347,324,413,193,265,48529,15634,31313,12220,50,4.1,9,9,6437.0,1341,0,919999999,12,0.1710,0,88,0.102,0.0,0.0 +2015,4,28,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,2.2,58,100685,1138,1347,306,611,489,197,74565,35076,24160,9902,70,5.1,5,5,6437.0,77777,0,919999999,12,0.1710,0,88,0.102,0.0,0.0 +2015,4,28,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,2.2,63,100585,1183,1347,302,800,727,162,99662,49229,20272,8407,140,5.1,5,5,6437.0,77777,0,919999999,12,0.1710,0,88,0.102,0.0,0.0 +2015,4,28,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,2.8,63,100535,1163,1347,304,785,593,266,93952,46267,32017,12704,120,5.7,5,5,6437.0,77777,0,919999999,13,0.1710,0,88,0.102,0.0,0.0 +2015,4,28,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,2.2,56,100415,1079,1347,309,883,936,104,93165,95293,14056,3188,130,4.1,5,5,6437.0,77777,0,919999999,12,0.1710,0,88,0.102,0.0,0.0 +2015,4,28,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,2.2,52,100296,935,1347,314,778,906,99,82228,91766,13784,2371,120,4.1,5,5,6437.0,77777,0,919999999,12,0.1710,0,88,0.102,0.0,0.0 +2015,4,28,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.0,-1.0,29,101281,743,1347,334,522,485,200,59901,38082,23063,8399,310,8.2,5,5,6437.0,77777,0,919999999,9,0.1710,0,88,0.102,0.0,0.0 +2015,4,28,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,-1.1,30,100296,515,1347,330,391,561,140,44088,37751,15853,5330,320,8.2,5,5,6437.0,77777,0,919999999,9,0.1710,0,88,0.102,0.0,0.0 +2015,4,28,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,-1.7,30,100306,267,1347,327,231,517,82,25342,18736,9030,2640,330,8.8,5,5,6437.0,77777,0,919999999,8,0.1710,0,88,0.102,0.0,0.0 +2015,4,28,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,0.0,37,100346,16,1347,323,80,242,25,8165,0,2563,411,340,7.7,5,5,6437.0,77777,0,919999999,10,0.1710,0,88,0.102,0.0,0.0 +2015,4,28,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,0.6,42,100386,0,90,319,0,0,0,0,0,0,0,310,7.2,5,5,6437.0,77777,9,999999999,10,0.1710,0,88,0.102,0.0,0.0 +2015,4,28,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,1.1,45,100356,0,0,317,0,0,0,0,0,0,0,300,6.2,5,5,6437.0,77777,9,999999999,11,0.1710,0,88,0.102,0.0,0.0 +2015,4,28,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,1.7,49,100276,0,0,310,0,0,0,0,0,0,0,300,6.2,3,3,6437.0,77777,9,999999999,12,0.1710,0,88,0.102,0.0,0.0 +2015,4,28,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.2,1.7,49,100276,0,0,298,0,0,0,0,0,0,0,300,6.2,0,0,6437.0,77777,9,999999999,12,0.1710,0,88,0.102,0.0,0.0 +2015,4,28,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,2.2,52,100206,0,0,296,0,0,0,0,0,0,0,280,4.1,0,0,6437.0,77777,9,999999999,12,0.1710,0,88,0.102,0.0,0.0 +2015,4,29,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,2.2,54,100175,0,0,294,0,0,0,0,0,0,0,290,5.7,0,0,6437.0,77777,9,999999999,12,0.1720,0,88,0.102,0.0,0.0 +2015,4,29,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.1,2.2,54,100175,0,0,294,0,0,0,0,0,0,0,290,5.7,0,0,6437.0,77777,9,999999999,12,0.1720,0,88,0.102,0.0,0.0 +2015,4,29,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,2.8,57,100175,0,0,294,0,0,0,0,0,0,0,290,4.1,0,0,6437.0,77777,9,999999999,13,0.1720,0,88,0.102,0.0,0.0 +2015,4,29,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,2.2,54,100205,0,0,294,0,0,0,0,0,0,0,290,5.1,0,0,6437.0,77777,9,999999999,12,0.1720,0,88,0.102,0.0,0.0 +2015,4,29,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.1,2.2,54,100205,0,0,311,0,0,0,0,0,0,0,290,5.1,5,5,6437.0,77777,9,999999999,12,0.1720,0,88,0.102,0.0,0.0 +2015,4,29,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,2.2,54,100285,175,950,329,31,42,26,3586,0,3013,977,320,4.1,9,9,6437.0,7620,9,999999999,12,0.1720,0,88,0.102,0.0,0.0 +2015,4,29,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,2.8,53,100336,426,1347,335,146,264,74,16934,12190,8608,3024,330,3.6,9,9,6437.0,6096,9,999999999,13,0.1720,0,88,0.102,0.0,0.0 +2015,4,29,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.2,2.8,53,100336,663,1347,335,328,532,106,38941,32943,12627,4835,330,3.6,9,9,6437.0,6096,9,999999999,13,0.1720,0,88,0.102,0.0,0.0 +2015,4,29,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,3.9,63,100495,870,1347,329,457,442,196,53603,33012,23101,8984,100,5.7,9,9,6437.0,6096,9,999999999,14,0.1720,0,88,0.102,1.8,0.0 +2015,4,29,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,5.0,71,100545,1033,1347,309,565,387,290,65890,31916,34019,13079,80,5.1,5,5,6437.0,77777,9,999999999,16,0.1720,0,88,0.102,0.0,0.0 +2015,4,29,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.0,5.0,71,100545,1141,1347,337,636,345,360,74074,30042,42200,15789,80,5.1,10,10,6437.0,77777,9,999999999,16,0.1720,0,88,0.102,0.0,0.0 +2015,4,29,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,4.4,73,100605,1186,1347,322,629,247,416,72909,22610,48551,17586,80,4.1,9,9,6437.0,2134,9,999999999,15,0.1720,0,88,0.102,0.0,0.0 +2015,4,29,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,3.9,68,100595,1166,1347,324,556,149,424,64177,13882,49279,17677,110,3.1,9,9,6437.0,2134,9,999999999,14,0.1720,0,88,0.102,0.0,0.0 +2015,4,29,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,9.4,3.9,68,100595,1081,1347,324,563,185,407,64402,17436,46873,16710,110,3.1,9,9,6437.0,2134,9,999999999,14,0.1720,0,88,0.102,0.0,0.0 +2015,4,29,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,3.9,71,100585,938,1347,321,537,273,338,60990,24892,38629,13730,120,3.6,9,9,6437.0,4572,9,999999999,14,0.1720,0,88,0.102,0.0,0.0 +2015,4,29,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,3.3,61,100625,747,1347,328,544,611,178,62969,45032,20699,7731,110,3.1,9,9,6437.0,4572,9,999999999,14,0.1720,0,88,0.102,0.0,0.0 +2015,4,29,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.6,3.3,61,100625,519,1347,328,344,384,132,38958,24649,15011,5137,110,3.1,9,9,6437.0,4572,9,999999999,14,0.1720,0,88,0.102,0.0,0.0 +2015,4,29,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,3.3,63,100675,271,1347,326,147,169,66,16420,4807,7396,2314,100,4.6,9,9,6437.0,3962,9,999999999,14,0.1720,0,88,0.102,0.0,0.0 +2015,4,29,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,3.9,66,100735,20,1347,326,21,0,21,2021,0,2034,455,120,4.1,9,9,6437.0,2134,9,999999999,14,0.1720,0,88,0.102,0.0,0.0 +2015,4,29,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.0,3.9,66,100735,0,116,326,0,0,0,0,0,0,0,120,4.1,9,9,6437.0,2134,9,999999999,14,0.1720,0,88,0.102,0.0,0.0 +2015,4,29,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,4.4,68,100835,0,0,336,0,0,0,0,0,0,0,120,2.6,10,10,6437.0,1676,9,999999999,15,0.1720,0,88,0.102,0.0,0.0 +2015,4,29,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,5.0,74,100845,0,0,334,0,0,0,0,0,0,0,196,0.0,10,10,6437.0,1676,9,999999999,16,0.1720,0,88,0.102,0.0,0.0 +2015,4,29,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,9.4,5.0,74,100845,0,0,334,0,0,0,0,0,0,0,203,0.0,10,10,6437.0,1676,9,999999999,16,0.1720,0,88,0.102,0.0,0.0 +2015,4,29,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,4.4,65,100855,0,0,339,0,0,0,0,0,0,0,220,1.5,10,10,6437.0,1676,9,999999999,15,0.1720,0,88,0.102,0.0,0.0 +2015,4,30,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,3.9,61,100845,0,0,341,0,0,0,0,0,0,0,260,1.5,10,10,6437.0,1463,9,999999999,14,0.1730,0,88,0.102,0.0,0.0 +2015,4,30,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,4.4,63,100825,0,0,341,0,0,0,0,0,0,0,340,2.6,10,10,6437.0,1524,9,999999999,15,0.1730,0,88,0.102,0.0,0.0 +2015,4,30,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,5.0,80,100845,0,0,329,0,0,0,0,0,0,0,30,4.1,10,10,6437.0,1280,9,999999999,16,0.1730,0,88,0.102,0.0,0.0 +2015,4,30,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,5.6,80,100855,0,0,332,0,0,0,0,0,0,0,20,2.1,10,10,6437.0,1524,9,999999999,17,0.1730,0,88,0.102,0.0,0.0 +2015,4,30,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.9,5.6,80,100855,0,0,332,0,0,0,0,0,0,0,20,2.1,10,10,6437.0,1524,9,999999999,17,0.1730,0,88,0.102,0.0,0.0 +2015,4,30,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,4.4,79,100995,180,980,317,48,141,29,5516,0,3339,1077,50,5.7,9,9,6437.0,1524,9,999999999,15,0.1730,0,88,0.102,0.0,0.0 +2015,4,30,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,4.4,82,101064,431,1346,314,74,124,48,8883,4838,5773,2100,50,3.6,9,9,6437.0,1524,9,999999999,15,0.1730,0,88,0.102,0.0,0.0 +2015,4,30,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.2,4.4,82,101064,667,1346,314,200,272,108,23718,16789,12852,4925,50,3.6,9,9,6437.0,1524,9,999999999,15,0.1730,0,88,0.102,0.0,0.0 +2015,4,30,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,3.3,68,101115,874,1346,321,338,234,224,39268,18380,26158,9969,80,3.1,9,9,6437.0,1463,9,999999999,14,0.1730,0,88,0.102,0.0,0.0 +2015,4,30,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,3.9,66,101125,1037,1346,326,406,113,321,47017,9748,37401,14070,140,3.6,9,9,6437.0,1524,9,999999999,14,0.1730,0,88,0.102,0.0,0.0 +2015,4,30,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.0,3.9,66,101125,1144,1346,326,709,561,238,85339,42152,28802,11591,140,3.6,9,9,6437.0,1524,9,999999999,14,0.1730,0,88,0.102,0.0,0.0 +2015,4,30,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,2.8,57,101075,1189,1346,312,851,761,184,105102,52938,22834,9402,140,3.1,5,5,6437.0,77777,9,999999999,13,0.1730,0,88,0.102,0.0,0.0 +2015,4,30,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,3.9,55,101055,1169,1346,320,915,912,116,96416,93162,15302,4341,110,5.1,5,5,6437.0,77777,9,999999999,14,0.1730,0,88,0.102,0.0,0.0 +2015,4,30,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.8,3.9,55,101055,1084,1346,320,867,900,113,91468,91778,15184,3367,110,5.1,5,5,6437.0,77777,9,999999999,14,0.1730,0,88,0.102,0.0,0.0 +2015,4,30,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,3.9,59,101055,941,1346,316,765,869,110,94799,54907,13679,5677,100,5.1,5,5,6437.0,77777,9,999999999,14,0.1730,0,88,0.102,0.0,0.0 +2015,4,30,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,4.4,65,101085,750,1346,330,564,658,148,66254,45170,17458,6710,130,4.6,9,9,6437.0,1981,9,999999999,15,0.1730,0,88,0.102,0.0,0.0 +2015,4,30,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.6,4.4,65,101085,523,1346,330,229,66,191,25172,5068,21101,6496,130,4.6,9,9,6437.0,1981,9,999999999,15,0.1730,0,88,0.102,0.0,0.0 +2015,4,30,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,3.9,68,101195,275,1346,324,128,61,108,13739,2801,11644,3086,90,5.7,9,9,6437.0,2134,9,999999999,15,0.1730,0,88,0.102,0.0,0.0 +2015,4,30,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.9,5.0,82,101347,25,1346,320,53,49,38,5260,0,3792,312,95,4.1,9,9,6437.0,1829,9,999999999,16,0.1730,0,88,0.102,0.0,0.0 +2015,4,30,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.6,5.0,83,101382,0,141,320,0,0,0,0,0,0,0,97,3.6,9,9,6437.0,1829,9,999999999,16,0.1730,0,88,0.102,0.0,0.0 +2015,4,30,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,4.6,83,101432,0,0,326,0,0,0,0,0,0,0,90,2.7,10,10,6437.0,2134,9,999999999,16,0.1730,0,88,0.102,0.0,0.0 +2015,4,30,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.1,4.8,86,101549,0,0,315,0,0,0,0,0,0,0,87,2.6,9,9,6437.0,1463,9,999999999,16,0.1730,0,88,0.102,0.0,0.0 +2015,4,30,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.1,5.1,87,101659,0,0,315,0,0,0,0,0,0,0,85,2.4,9,9,6437.0,1463,9,999999999,16,0.1730,0,88,0.102,0.0,0.0 +2015,4,30,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.0,5.4,89,101623,0,0,320,0,0,0,0,0,0,0,77,2.4,10,10,6437.0,2134,9,999999999,17,0.1730,0,88,0.102,0.0,0.0 +2014,5,1,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.1,6.1,93,101572,0,0,325,0,0,0,0,0,0,0,82,3.1,10,10,8047.0,183,0,919999999,18,0.1750,0,88,0.097,0.0,0.0 +2014,5,1,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,7.4,6.3,93,101457,0,0,325,0,0,0,0,0,0,0,85,3.2,10,10,8000.0,183,0,919999999,19,0.1750,0,88,0.097,0.0,0.0 +2014,5,1,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.8,6.8,93,101311,0,0,324,0,0,0,0,0,0,0,82,3.1,10,10,4828.0,183,0,919999999,19,0.1750,0,88,0.097,0.0,0.0 +2014,5,1,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,9.3,8.3,93,101311,0,0,324,0,0,0,0,0,0,0,105,2.8,10,10,4023.0,183,0,919999999,23,0.1750,0,88,0.097,0.0,0.0 +2014,5,1,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,9.9,9.0,94,101268,0,0,331,0,0,0,0,0,0,0,110,2.2,10,10,4000.0,183,0,919999999,24,0.1750,0,88,0.097,0.0,0.0 +2014,5,1,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,11.4,10.5,94,101236,185,1010,335,28,9,27,3239,0,3129,1023,137,2.1,10,10,1609.0,152,0,919999999,28,0.1750,0,88,0.097,0.0,0.0 +2014,5,1,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.0,12.0,94,101280,435,1345,360,25,0,25,2484,0,2503,1156,160,2.1,10,10,3219.0,244,0,919999999,32,0.1750,0,88,0.097,0.0,0.0 +2014,5,1,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,9.4,8.9,97,101105,671,1345,338,66,0,66,6703,0,6761,3203,100,1.5,10,10,1600.0,244,0,919999999,24,0.1750,0,88,0.097,0.0,0.0 +2014,5,1,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,14.0,13.0,94,101280,878,1345,366,70,0,70,7213,0,7281,3675,210,2.6,10,10,6437.0,183,0,919999999,36,0.1750,0,88,0.097,0.0,0.0 +2014,5,1,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.0,12.0,94,101280,1040,1345,360,220,14,209,26260,973,25075,10189,300,1.5,10,10,6437.0,244,0,919999999,32,0.1750,0,88,0.097,0.0,0.0 +2014,5,1,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,13.3,11.1,87,100816,1147,1345,360,266,13,255,31765,951,30624,12256,310,2.6,10,10,8000.0,244,0,919999999,30,0.1750,0,88,0.097,0.0,0.0 +2014,5,1,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.0,11.0,88,101280,1192,1345,358,158,3,156,19696,189,19534,8139,310,3.6,10,10,4023.0,183,0,919999999,29,0.1750,0,88,0.097,0.0,0.0 +2014,5,1,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,12.8,10.6,86,100716,1171,1345,357,199,6,193,24358,402,23741,9776,300,4.1,10,10,4023.0,152,0,919999999,28,0.1750,0,88,0.097,0.0,0.0 +2014,5,1,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,12.8,10.6,86,100716,1087,1345,357,243,12,233,28982,867,27940,11272,300,4.1,10,10,4000.0,152,0,919999999,28,0.1750,0,88,0.097,0.0,0.0 +2014,5,1,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,14.0,12.0,88,101280,944,1345,355,438,180,306,50007,14910,35150,12955,310,1.5,9,9,9656.0,457,0,919999999,32,0.1750,0,88,0.097,0.0,0.0 +2014,5,1,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.0,11.0,88,101280,753,1345,349,476,340,264,53261,28213,29710,10168,140,3.6,9,9,8047.0,975,0,919999999,29,0.1750,0,88,0.097,0.0,0.0 +2014,5,1,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,12.8,10.6,86,100556,526,1345,328,377,492,157,42031,32595,17585,5822,130,3.6,5,5,8000.0,975,0,919999999,28,0.1750,0,88,0.097,0.0,0.0 +2014,5,1,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,10.0,8.0,87,101280,279,1345,331,202,286,103,21763,12103,11146,3057,100,4.1,9,9,1609.0,77777,0,919999999,22,0.1750,0,88,0.097,0.0,0.0 +2014,5,1,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,8.0,7.0,93,101280,29,1345,321,77,148,34,7758,0,3443,457,80,3.6,9,9,402.0,30,0,919999999,20,0.1750,0,88,0.097,0.0,0.0 +2014,5,1,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,8.9,7.8,93,100455,0,166,307,0,0,0,0,0,0,0,40,1.5,5,5,9000.0,30,9,999999999,21,0.1750,0,88,0.097,1.0,0.0 +2014,5,1,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,7.2,93,100455,0,0,304,0,0,0,0,0,0,0,209,0.0,5,5,9000.0,77777,9,999999999,20,0.1750,0,88,0.097,0.0,0.0 +2014,5,1,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,7.8,93,100425,0,0,326,0,0,0,0,0,0,0,20,2.6,9,9,9000.0,3048,0,919999999,21,0.1750,0,88,0.097,0.0,0.0 +2014,5,1,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.9,7.8,93,100425,0,0,290,0,0,0,0,0,0,0,20,2.6,0,0,9000.0,3048,0,919999999,21,0.1750,0,88,0.097,0.0,0.0 +2014,5,1,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,10.0,8.3,89,100445,0,0,308,0,0,0,0,0,0,0,330,1.5,3,3,9656.0,77777,0,919999999,22,0.1750,0,88,0.097,0.0,0.0 +2014,5,2,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,11.7,9.4,86,100455,0,0,340,0,0,0,0,0,0,0,300,2.6,9,9,8047.0,3353,0,919999999,25,0.1760,0,88,0.097,0.0,0.0 +2014,5,2,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,11.7,9.4,86,100455,0,0,350,0,0,0,0,0,0,0,300,2.6,10,10,8000.0,3353,0,919999999,25,0.1760,0,88,0.097,0.0,0.0 +2014,5,2,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,5.0,57,100546,0,0,353,0,0,0,0,0,0,0,320,4.6,10,10,8000.0,1829,0,919999999,16,0.1760,0,88,0.097,0.0,0.0 +2014,5,2,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,3.9,59,100535,0,0,311,0,0,0,0,0,0,0,320,4.1,3,3,8000.0,77777,0,919999999,14,0.1760,0,88,0.097,0.0,0.0 +2014,5,2,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,3.9,59,100535,0,0,334,0,0,0,0,0,0,0,320,4.1,9,9,8000.0,77777,0,919999999,14,0.1760,0,88,0.097,0.0,0.0 +2014,5,2,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,2.8,54,100535,190,1039,333,45,112,29,5199,0,3357,1093,300,4.1,9,9,8000.0,2134,0,919999999,13,0.1760,0,88,0.097,0.0,0.0 +2014,5,2,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,2.8,53,100595,440,1344,345,52,29,45,6291,1150,5453,1995,280,4.6,10,10,8000.0,2286,0,919999999,13,0.1760,0,88,0.097,0.0,0.0 +2014,5,2,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.2,2.8,53,100595,676,1344,335,209,135,149,24225,9371,17343,6427,280,4.6,9,9,8000.0,2286,0,919999999,13,0.1760,0,88,0.097,0.0,0.0 +2014,5,2,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,2.8,46,100596,881,1344,346,224,25,207,26225,1909,24355,9437,270,2.6,9,9,8000.0,2743,0,919999999,13,0.1760,0,88,0.097,0.0,0.0 +2014,5,2,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,3.9,44,100566,1043,1344,330,568,472,203,68237,34475,24508,9961,280,4.1,3,3,8000.0,77777,0,919999999,14,0.1760,0,88,0.097,0.0,0.0 +2014,5,2,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.1,3.9,44,100566,1150,1344,335,771,711,173,95145,48712,21448,8875,280,4.1,5,5,8000.0,77777,0,919999999,14,0.1760,0,88,0.097,0.0,0.0 +2014,5,2,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,1.1,32,100456,1195,1344,360,556,456,167,69255,31201,20896,8647,270,6.2,9,9,8000.0,2134,0,919999999,11,0.1760,0,88,0.097,0.0,0.0 +2014,5,2,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,1.1,30,100407,1174,1344,345,757,479,335,89210,40768,39726,15153,250,4.6,5,5,8000.0,77777,0,919999999,11,0.1760,0,88,0.097,0.0,0.0 +2014,5,2,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.9,1.1,30,100407,1090,1344,345,660,323,389,75948,30039,45060,16330,250,4.6,5,5,8000.0,77777,0,919999999,11,0.1760,0,88,0.097,0.0,0.0 +2014,5,2,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,1.1,29,100367,947,1344,348,664,543,255,77317,44398,29855,11435,280,5.1,5,5,8000.0,77777,0,919999999,11,0.1760,0,88,0.097,0.0,0.0 +2014,5,2,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,1.7,32,100427,756,1344,341,409,402,125,48779,26583,14964,5862,270,6.7,3,3,8000.0,77777,0,919999999,11,0.1760,0,88,0.097,0.0,0.0 +2014,5,2,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.9,1.7,32,100427,529,1344,366,359,536,98,41761,30897,11438,4138,270,6.7,9,9,8000.0,77777,0,919999999,11,0.1760,0,88,0.097,0.0,0.0 +2014,5,2,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,1.7,34,100546,283,1344,341,171,389,73,19037,12952,8154,2529,290,6.2,5,5,8000.0,77777,0,919999999,11,0.1760,0,88,0.097,0.0,0.0 +2014,5,2,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,1.7,34,100636,34,1344,361,91,227,36,9193,0,3655,487,290,4.6,9,9,8000.0,3048,0,919999999,11,0.1760,0,88,0.097,0.0,0.0 +2014,5,2,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,1.7,34,100636,0,192,361,0,0,0,0,0,0,0,290,4.6,9,9,8000.0,3048,9,999999999,11,0.1760,0,88,0.097,0.0,0.0 +2014,5,2,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,2.8,42,100816,0,0,352,0,0,0,0,0,0,0,280,3.6,9,9,8000.0,2896,9,999999999,13,0.1760,0,88,0.097,0.0,0.0 +2014,5,2,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,2.8,44,100866,0,0,329,0,0,0,0,0,0,0,290,4.1,5,5,8000.0,77777,9,999999999,13,0.1760,0,88,0.097,0.0,0.0 +2014,5,2,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.0,2.8,44,100866,0,0,349,0,0,0,0,0,0,0,290,4.1,9,9,8000.0,77777,9,999999999,13,0.1760,0,88,0.097,0.0,0.0 +2014,5,2,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,2.2,45,100936,0,0,352,0,0,0,0,0,0,0,270,2.6,10,10,8000.0,2134,9,999999999,12,0.1760,0,88,0.097,0.0,0.0 +2014,5,3,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,2.2,47,100936,0,0,340,0,0,0,0,0,0,0,290,3.1,9,9,8000.0,2591,9,999999999,12,0.1770,0,88,0.097,0.0,0.0 +2014,5,3,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,2.2,47,100936,0,0,321,0,0,0,0,0,0,0,290,3.1,5,5,8000.0,2591,9,999999999,12,0.1770,0,88,0.097,0.0,0.0 +2014,5,3,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,2.8,54,100985,0,0,310,0,0,0,0,0,0,0,270,2.1,3,3,8000.0,77777,9,999999999,13,0.1770,0,88,0.097,0.0,0.0 +2014,5,3,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,3.3,61,100995,0,0,328,0,0,0,0,0,0,0,230,1.5,9,9,8000.0,2743,9,999999999,14,0.1770,0,88,0.097,0.0,0.0 +2014,5,3,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.6,3.3,61,100995,0,0,305,0,0,0,0,0,0,0,230,1.5,3,3,8000.0,2743,9,999999999,14,0.1770,0,88,0.097,0.0,0.0 +2014,5,3,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,3.3,52,101085,195,1068,315,57,210,29,6600,0,3364,1101,250,3.1,3,3,8000.0,77777,9,999999999,14,0.1770,0,88,0.097,0.0,0.0 +2014,5,3,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,3.3,49,101086,444,1344,344,108,95,89,12404,4861,10255,3565,240,4.6,9,9,8000.0,2743,9,999999999,14,0.1770,0,88,0.097,0.0,0.0 +2014,5,3,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.9,3.3,49,101086,680,1344,344,243,163,176,27814,12029,20238,7302,240,4.6,9,9,8000.0,2743,9,999999999,14,0.1770,0,88,0.097,0.0,0.0 +2014,5,3,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,3.9,44,101056,885,1344,355,387,217,257,44555,17877,29752,11090,260,4.6,9,9,8000.0,3048,9,999999999,14,0.1770,0,88,0.097,0.0,0.0 +2014,5,3,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,3.9,41,100996,1046,1344,361,642,595,191,77526,42642,23176,9480,280,4.6,9,9,8000.0,3048,9,999999999,14,0.1770,0,88,0.097,0.0,0.0 +2014,5,3,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.2,3.9,41,100996,1153,1344,361,678,417,339,79529,35460,40015,15204,280,4.6,9,9,8000.0,3048,9,999999999,14,0.1770,0,88,0.097,0.0,0.0 +2014,5,3,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,5.0,53,100846,1197,1344,348,480,192,316,56939,15605,37716,14600,110,6.2,9,9,8000.0,1829,9,999999999,16,0.1770,0,88,0.097,0.0,0.0 +2014,5,3,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,4.4,51,100806,1177,1344,348,564,167,416,65307,15326,48501,17545,120,6.7,9,9,8000.0,2286,9,999999999,15,0.1770,0,88,0.097,0.0,0.0 +2014,5,3,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,14.4,4.4,51,100806,1092,1344,348,400,64,344,46452,5566,40202,15097,120,6.7,9,9,8000.0,2286,9,999999999,15,0.1770,0,88,0.097,0.0,0.0 +2014,5,3,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,4.4,55,100676,950,1344,342,207,15,195,24599,1099,23285,9312,100,4.6,9,9,8000.0,2438,9,999999999,15,0.1770,0,88,0.097,0.0,0.0 +2014,5,3,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,5.6,53,100626,759,1344,352,332,101,272,37203,8775,30655,10415,100,3.1,9,9,8000.0,2438,9,999999999,17,0.1770,0,88,0.097,0.0,0.0 +2014,5,3,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.0,5.6,53,100626,533,1344,352,183,20,173,20324,1448,19306,6238,100,3.1,9,9,8000.0,2438,9,999999999,17,0.1770,0,88,0.097,0.0,0.0 +2014,5,3,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,4.4,46,100626,287,1344,356,129,81,108,13905,3767,11693,3186,180,1.5,9,9,8000.0,3353,9,999999999,15,0.1770,0,88,0.097,0.0,0.0 +2014,5,3,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,4.4,47,100626,38,1344,353,58,46,46,5755,0,4590,360,180,3.6,9,9,8000.0,2438,9,999999999,15,0.1770,0,88,0.097,0.0,0.0 +2014,5,3,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.6,4.4,47,100626,0,217,353,0,0,0,0,0,0,0,180,3.6,9,9,8000.0,2438,9,999999999,15,0.1770,0,88,0.097,0.0,0.0 +2014,5,3,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,3.9,47,100686,0,0,330,0,0,0,0,0,0,0,210,6.2,5,5,8000.0,77777,9,999999999,14,0.1770,0,88,0.097,0.0,0.0 +2014,5,3,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,3.9,47,100656,0,0,350,0,0,0,0,0,0,0,220,4.1,9,9,8000.0,3353,9,999999999,14,0.1770,0,88,0.097,0.0,0.0 +2014,5,3,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.0,3.9,47,100656,0,0,360,0,0,0,0,0,0,0,220,4.1,10,10,8000.0,3353,9,999999999,14,0.1770,0,88,0.097,0.0,0.0 +2014,5,3,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,5.0,55,100546,0,0,346,0,0,0,0,0,0,0,220,3.6,9,9,8000.0,2896,9,999999999,16,0.1770,0,88,0.097,0.0,0.0 +2014,5,4,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,5.0,68,100475,0,0,312,0,0,0,0,0,0,0,190,2.6,5,5,8000.0,77777,9,999999999,16,0.1780,0,88,0.097,0.0,0.0 +2014,5,4,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.6,5.0,68,100475,0,0,340,0,0,0,0,0,0,0,190,2.6,10,10,8000.0,77777,9,999999999,16,0.1780,0,88,0.097,0.0,0.0 +2014,5,4,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,5.6,66,100366,0,0,346,0,0,0,0,0,0,0,210,3.6,10,10,8000.0,3048,9,999999999,17,0.1780,0,88,0.097,0.0,0.0 +2014,5,4,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,5.6,66,100356,0,0,317,0,0,0,0,0,0,0,230,4.6,5,5,8000.0,77777,9,999999999,17,0.1780,0,88,0.097,0.0,0.0 +2014,5,4,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,5.6,66,100356,0,0,317,0,0,0,0,0,0,0,230,4.6,5,5,8000.0,77777,9,999999999,17,0.1780,0,88,0.097,0.0,0.0 +2014,5,4,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,6.7,69,100346,200,1096,321,42,82,32,4830,0,3687,1202,230,5.1,5,5,8000.0,77777,9,999999999,19,0.1780,0,88,0.097,0.0,0.0 +2014,5,4,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,6.1,62,100326,449,1343,325,200,449,66,23521,19947,7782,2806,260,5.1,5,5,8000.0,77777,9,999999999,18,0.1780,0,88,0.097,0.0,0.0 +2014,5,4,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,6.1,62,100326,684,1343,325,318,432,145,36954,29128,16921,6331,260,5.1,5,5,8000.0,77777,9,999999999,18,0.1780,0,88,0.097,0.0,0.0 +2014,5,4,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,1.7,39,100176,888,1343,331,585,830,93,61901,83850,13096,2172,260,8.8,5,5,8000.0,77777,9,999999999,11,0.1780,0,88,0.097,0.0,0.0 +2014,5,4,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,1.1,39,100116,1049,1343,347,338,227,201,40713,16730,24330,9901,270,7.7,9,9,8000.0,2134,9,999999999,11,0.1780,0,88,0.097,0.0,0.0 +2014,5,4,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.0,1.1,39,100116,1156,1343,347,340,38,309,40223,3152,36777,14231,270,7.7,9,9,8000.0,2134,9,999999999,11,0.1780,0,88,0.097,0.0,0.0 +2014,5,4,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,1.7,39,100006,1200,1343,350,505,220,308,60113,17968,36885,14332,260,6.7,9,9,8000.0,2438,9,999999999,11,0.1780,0,88,0.097,0.0,0.0 +2014,5,4,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,1.1,36,99986,1179,1343,352,610,273,369,71408,24099,43478,16238,270,8.8,9,9,8000.0,2438,9,999999999,11,0.1780,0,88,0.097,0.0,0.0 +2014,5,4,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.1,1.1,36,99986,1095,1343,352,368,141,246,43930,10967,29526,11796,270,8.8,9,9,8000.0,2438,0,919999999,11,0.1780,0,88,0.097,0.0,0.0 +2014,5,4,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,1.7,42,100026,952,1343,354,487,205,326,55658,18450,37486,13577,290,10.3,10,10,8000.0,2438,0,919999999,11,0.1780,0,88,0.097,0.0,0.0 +2014,5,4,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,1.7,44,100036,762,1343,352,329,99,268,36985,8681,30299,10358,270,7.2,10,10,8000.0,3048,0,919999999,11,0.1780,0,88,0.097,0.0,0.0 +2014,5,4,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.9,1.7,44,100036,536,1343,342,355,394,171,39552,28946,19142,6222,270,7.2,9,9,8000.0,3048,0,919999999,11,0.1780,0,88,0.097,0.0,0.0 +2014,5,4,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,0.6,42,100046,291,1343,338,208,307,95,22727,13220,10422,3017,280,10.8,9,9,8000.0,3048,0,919999999,10,0.1780,0,88,0.097,0.0,0.0 +2014,5,4,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,1.1,48,100106,42,1343,312,66,97,50,6541,515,4983,344,290,8.8,5,5,8000.0,77777,0,919999999,11,0.1780,0,88,0.097,0.0,0.0 +2014,5,4,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,1.1,48,100106,0,242,331,0,0,0,0,0,0,0,290,8.8,9,9,8000.0,77777,9,999999999,11,0.1780,0,88,0.097,0.0,0.0 +2014,5,4,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,1.7,54,100175,0,0,308,0,0,0,0,0,0,0,270,8.2,5,5,8000.0,77777,9,999999999,12,0.1780,0,88,0.097,0.0,0.0 +2014,5,4,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,1.7,56,100195,0,0,301,0,0,0,0,0,0,0,290,8.2,3,3,8000.0,77777,9,999999999,12,0.1780,0,88,0.097,0.0,0.0 +2014,5,4,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.0,1.7,56,100195,0,0,333,0,0,0,0,0,0,0,290,8.2,10,10,8000.0,77777,9,999999999,12,0.1780,0,88,0.097,0.0,0.0 +2014,5,4,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,2.2,58,100235,0,0,324,0,0,0,0,0,0,0,290,7.2,9,9,8000.0,3048,9,999999999,12,0.1780,0,88,0.097,0.0,0.0 +2014,5,5,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,3.3,61,100285,0,0,338,0,0,0,0,0,0,0,300,6.7,10,10,8000.0,1676,9,999999999,14,0.1790,0,88,0.097,0.0,0.0 +2014,5,5,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.6,3.3,61,100285,0,0,338,0,0,0,0,0,0,0,300,6.7,10,10,8000.0,1676,9,999999999,14,0.1790,0,88,0.097,0.0,0.0 +2014,5,5,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,3.9,66,100365,0,0,336,0,0,0,0,0,0,0,290,6.7,10,10,8000.0,1524,9,999999999,14,0.1790,0,88,0.097,0.0,0.0 +2014,5,5,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,3.9,63,100445,0,0,329,0,0,0,0,0,0,0,300,7.7,9,9,8000.0,1524,9,999999999,14,0.1790,0,88,0.097,0.0,0.0 +2014,5,5,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.6,3.9,63,100445,0,0,311,0,0,0,0,0,0,0,300,7.7,5,5,8000.0,1524,9,999999999,14,0.1790,0,88,0.097,0.0,0.0 +2014,5,5,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,4.4,61,100615,205,1124,316,63,270,26,7386,0,3053,1015,300,5.7,5,5,8000.0,77777,9,999999999,15,0.1790,0,88,0.097,0.0,0.0 +2014,5,5,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,5.6,60,100666,453,1342,325,207,534,53,24791,22257,6361,2329,320,4.6,5,5,8000.0,77777,9,999999999,17,0.1790,0,88,0.097,0.0,0.0 +2014,5,5,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,5.6,60,100666,687,1342,325,373,652,92,44943,38350,11119,4346,320,4.6,5,5,8000.0,77777,9,999999999,17,0.1790,0,88,0.097,0.0,0.0 +2014,5,5,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,4.4,49,100716,892,1342,351,448,474,193,52808,34968,22859,8991,340,7.2,9,9,8000.0,1219,9,999999999,15,0.1790,0,88,0.097,0.0,0.0 +2014,5,5,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,3.9,46,100726,1052,1342,353,471,287,288,55162,23581,33927,13132,340,7.2,9,9,8000.0,1524,9,999999999,14,0.1790,0,88,0.097,0.0,0.0 +2014,5,5,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.6,3.9,46,100726,1158,1342,353,442,87,372,51518,7669,43643,16236,340,7.2,9,9,8000.0,1524,9,999999999,14,0.1790,0,88,0.097,0.0,0.0 +2014,5,5,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,3.3,39,100736,1202,1342,340,593,254,365,69660,21969,43157,16218,310,6.7,5,5,8000.0,77777,9,999999999,13,0.1790,0,88,0.097,0.0,0.0 +2014,5,5,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,3.3,38,100706,1181,1342,363,439,109,342,51683,9244,40519,15413,300,6.2,9,9,8000.0,1676,9,999999999,13,0.1790,0,88,0.097,0.0,0.0 +2014,5,5,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,3.3,38,100706,1097,1342,363,526,189,365,60876,16903,42516,15738,300,6.2,9,9,8000.0,1676,9,999999999,13,0.1790,0,88,0.097,0.0,0.0 +2014,5,5,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,2.8,38,100686,955,1342,359,437,187,295,50351,16044,34190,12740,310,6.7,9,9,8000.0,1829,9,999999999,13,0.1790,0,88,0.097,0.0,0.0 +2014,5,5,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,2.2,35,100706,765,1342,341,566,621,179,65749,46003,20890,7873,310,7.2,5,5,8000.0,77777,9,999999999,12,0.1790,0,88,0.097,0.0,0.0 +2014,5,5,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,2.2,35,100706,540,1342,341,322,304,181,35731,22932,20183,6464,310,7.2,5,5,8000.0,77777,9,999999999,12,0.1790,0,88,0.097,0.0,0.0 +2014,5,5,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,2.2,39,100816,295,1342,328,211,475,86,23267,18723,9519,2869,320,6.7,3,3,8000.0,77777,9,999999999,12,0.1790,0,88,0.097,0.0,0.0 +2014,5,5,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,1.7,41,100896,47,1342,328,103,374,30,10739,0,3141,654,340,5.1,5,5,8000.0,77777,9,999999999,12,0.1790,0,88,0.097,0.0,0.0 +2014,5,5,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.0,1.7,41,100896,0,267,323,0,0,0,0,0,0,0,340,5.1,3,3,8000.0,77777,9,999999999,12,0.1790,0,88,0.097,0.0,0.0 +2014,5,5,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,2.2,47,100995,0,0,316,0,0,0,0,0,0,0,330,4.1,3,3,8000.0,77777,9,999999999,12,0.1790,0,88,0.097,0.0,0.0 +2014,5,5,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,2.2,50,101025,0,0,316,0,0,0,0,0,0,0,320,4.1,5,5,8000.0,77777,9,999999999,12,0.1790,0,88,0.097,0.0,0.0 +2014,5,5,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.2,2.2,50,101025,0,0,335,0,0,0,0,0,0,0,320,4.1,9,9,8000.0,77777,9,999999999,12,0.1790,0,88,0.097,0.0,0.0 +2014,5,5,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,2.2,58,101105,0,0,324,0,0,0,0,0,0,0,310,5.1,9,9,8000.0,7620,9,999999999,12,0.1790,0,88,0.097,0.0,0.0 +2014,5,6,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,2.2,58,101075,0,0,324,0,0,0,0,0,0,0,310,4.6,9,9,8000.0,7010,9,999999999,12,0.1810,0,88,0.097,0.0,0.0 +2014,5,6,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.0,2.2,58,101075,0,0,306,0,0,0,0,0,0,0,310,4.6,5,5,8000.0,7010,9,999999999,12,0.1810,0,88,0.097,0.0,0.0 +2014,5,6,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,2.2,63,101015,0,0,297,0,0,0,0,0,0,0,290,4.1,3,3,8000.0,77777,9,999999999,12,0.1810,0,88,0.097,0.0,0.0 +2014,5,6,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,2.8,66,101025,0,0,298,0,0,0,0,0,0,0,290,4.6,3,3,8000.0,77777,9,999999999,13,0.1810,0,88,0.097,0.0,0.0 +2014,5,6,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.9,2.8,66,101025,0,0,298,0,0,0,0,0,0,0,290,4.6,3,3,8000.0,77777,9,999999999,13,0.1810,0,88,0.097,0.0,0.0 +2014,5,6,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,2.2,58,101105,210,1151,302,65,263,28,7598,241,3278,1088,300,4.6,3,3,8000.0,77777,9,999999999,12,0.1810,0,88,0.097,0.0,0.0 +2014,5,6,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,2.2,52,101115,457,1342,314,210,520,58,25032,23177,6929,2528,290,5.7,5,5,8000.0,77777,9,999999999,12,0.1810,0,88,0.097,0.0,0.0 +2014,5,6,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,2.2,52,101115,691,1342,314,400,721,80,48798,41971,9786,3849,290,5.7,5,5,8000.0,77777,9,999999999,12,0.1810,0,88,0.097,0.0,0.0 +2014,5,6,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,0.0,37,101096,895,1342,323,585,818,96,61716,82503,13473,2216,310,5.1,5,5,8000.0,77777,9,999999999,10,0.1810,0,88,0.097,0.0,0.0 +2014,5,6,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,-0.6,33,101076,1055,1342,328,742,867,110,77897,87915,14866,3130,280,4.6,5,5,8000.0,77777,9,999999999,9,0.1810,0,88,0.097,0.0,0.0 +2014,5,6,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,-1.7,28,101036,1161,1342,332,859,900,115,89910,91373,15176,4258,300,7.7,5,5,8000.0,77777,9,999999999,8,0.1810,0,88,0.097,0.0,0.0 +2014,5,6,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,-2.8,25,100976,1205,1342,350,817,629,268,98481,49698,32489,12886,320,3.6,9,9,8000.0,2286,9,999999999,7,0.1810,0,88,0.097,0.0,0.0 +2014,5,6,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,-2.2,29,101006,1184,1342,345,671,428,290,80159,34835,34848,13650,300,3.1,9,9,8000.0,2896,9,999999999,8,0.1810,0,88,0.097,0.0,0.0 +2014,5,6,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.6,-2.2,29,101006,1099,1342,345,336,25,314,39425,2143,37067,14206,300,3.1,9,9,8000.0,2896,9,999999999,8,0.1810,0,88,0.097,0.0,0.0 +2014,5,6,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,-1.1,31,101046,958,1342,347,237,14,225,27938,1100,26660,10472,320,7.2,9,9,8000.0,2743,9,999999999,9,0.1810,0,88,0.097,0.0,0.0 +2014,5,6,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,-1.7,29,101066,768,1342,348,375,193,256,42403,16738,29107,10134,330,7.7,9,9,8000.0,3048,9,999999999,8,0.1810,0,88,0.097,0.0,0.0 +2014,5,6,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.1,-1.7,29,101066,543,1342,348,263,159,169,29405,11779,18984,6230,330,7.7,9,9,8000.0,3048,9,999999999,8,0.1810,0,88,0.097,0.0,0.0 +2014,5,6,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,-3.9,24,101156,298,1342,326,130,58,102,14175,2757,11168,3186,300,4.1,5,5,8000.0,77777,9,999999999,7,0.1810,0,88,0.097,0.0,0.0 +2014,5,6,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.0,-5.0,22,101281,51,1342,344,35,0,35,3387,0,3409,690,350,7.2,9,9,8000.0,2896,9,999999999,6,0.1810,0,88,0.097,0.0,0.0 +2014,5,6,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.2,2.2,50,101315,0,292,316,0,0,0,0,0,0,0,60,7.2,5,5,8000.0,2896,9,999999999,12,0.1810,0,88,0.097,0.0,0.0 +2014,5,6,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,2.8,61,101565,0,0,307,0,0,0,0,0,0,0,110,1.5,5,5,8000.0,77777,9,999999999,13,0.1810,0,88,0.097,0.0,0.0 +2014,5,6,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,2.8,61,101625,0,0,307,0,0,0,0,0,0,0,333,0.0,5,5,8000.0,77777,9,999999999,13,0.1810,0,88,0.097,0.0,0.0 +2014,5,6,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.0,2.8,61,101625,0,0,290,0,0,0,0,0,0,0,327,0.0,0,0,8000.0,77777,9,999999999,13,0.1810,0,88,0.097,0.0,0.0 +2014,5,6,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,-2.8,38,101695,0,0,286,0,0,0,0,0,0,0,320,3.6,0,0,8000.0,77777,9,999999999,7,0.1810,0,88,0.097,0.0,0.0 +2014,5,7,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,-2.8,39,101715,0,0,284,0,0,0,0,0,0,0,300,3.6,0,0,8000.0,77777,9,999999999,7,0.1820,0,88,0.097,0.0,0.0 +2014,5,7,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.0,-2.8,39,101715,0,0,284,0,0,0,0,0,0,0,300,3.6,0,0,8000.0,77777,9,999999999,7,0.1820,0,88,0.097,0.0,0.0 +2014,5,7,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,-2.8,42,101824,0,0,280,0,0,0,0,0,0,0,300,4.6,0,0,8000.0,77777,9,999999999,7,0.1820,0,88,0.097,0.0,0.0 +2014,5,7,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,-2.8,44,101884,0,0,277,0,0,0,0,0,0,0,290,4.6,0,0,8000.0,77777,9,999999999,7,0.1820,0,88,0.097,0.0,0.0 +2014,5,7,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.3,-2.8,44,101884,0,0,277,0,0,0,0,0,0,0,290,4.6,0,0,8000.0,77777,9,999999999,7,0.1820,0,88,0.097,0.0,0.0 +2014,5,7,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,-2.8,39,102044,214,1178,284,68,261,30,7931,1155,3505,1160,310,4.6,0,0,8000.0,77777,9,999999999,7,0.1820,0,88,0.097,0.0,0.0 +2014,5,7,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,-1.7,39,102065,461,1341,292,215,528,60,25614,24572,7164,2611,320,3.6,0,0,8000.0,77777,9,999999999,8,0.1820,0,88,0.097,0.0,0.0 +2014,5,7,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,-1.7,39,102065,695,1341,292,408,735,79,49905,43579,9689,3814,320,3.6,0,0,8000.0,77777,9,999999999,8,0.1820,0,88,0.097,0.0,0.0 +2014,5,7,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,-1.1,33,102115,898,1341,320,595,835,94,62735,84160,13197,2215,290,3.6,3,3,8000.0,77777,9,999999999,9,0.1820,0,88,0.097,0.0,0.0 +2014,5,7,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,-1.7,28,102135,1058,1341,332,755,889,104,79301,90104,14090,3076,321,1.5,5,5,8000.0,77777,9,999999999,8,0.1820,0,88,0.097,0.0,0.0 +2014,5,7,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.7,-1.7,28,102135,1163,1341,332,874,919,111,91576,93333,14670,4212,310,1.5,5,5,8000.0,77777,9,999999999,8,0.1820,0,88,0.097,0.0,0.0 +2014,5,7,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,-2.8,23,102086,1207,1341,338,939,932,116,98121,94603,15151,5054,270,4.6,5,5,8000.0,77777,9,999999999,7,0.1820,0,88,0.097,0.0,0.0 +2014,5,7,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,-3.3,21,102046,1186,1341,342,947,927,120,98824,93999,15708,4767,260,4.6,5,5,8000.0,77777,9,999999999,7,0.1820,0,88,0.097,0.0,0.0 +2014,5,7,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,19.4,-3.3,21,102046,1102,1341,342,842,742,204,102188,55244,24881,10150,260,4.6,5,5,8000.0,77777,9,999999999,7,0.1820,0,88,0.097,0.0,0.0 +2014,5,7,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.0,3.0,42,101281,960,1341,334,720,658,207,85368,49381,24666,9822,100,7.7,5,5,8000.0,77777,9,999999999,13,0.1820,0,88,0.097,0.0,0.0 +2014,5,7,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,3.9,46,101975,771,1341,353,578,630,173,67363,45679,20254,7702,100,5.1,9,9,8000.0,7620,9,999999999,14,0.1820,0,88,0.097,0.0,0.0 +2014,5,7,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.6,3.9,46,101975,546,1341,353,415,578,129,47386,36954,14789,5196,100,5.1,9,9,8000.0,7620,9,999999999,14,0.1820,0,88,0.097,0.0,0.0 +2014,5,7,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,4.4,51,101965,302,1341,348,250,482,100,27275,21468,10955,3178,130,3.6,9,9,8000.0,7620,9,999999999,15,0.1820,0,88,0.097,0.0,0.0 +2014,5,7,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,2.8,44,101995,55,1341,329,101,259,43,10290,0,4402,689,180,6.2,5,5,8000.0,77777,9,999999999,13,0.1820,0,88,0.097,0.0,0.0 +2014,5,7,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.0,2.8,44,101995,0,316,329,0,0,0,0,0,0,0,180,6.2,5,5,8000.0,77777,9,999999999,13,0.1820,0,88,0.097,0.0,0.0 +2014,5,7,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,1.7,45,102115,0,0,320,0,0,0,0,0,0,0,210,4.6,5,5,8000.0,77777,9,999999999,12,0.1820,0,88,0.097,0.0,0.0 +2014,5,7,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,0.6,40,102095,0,0,317,0,0,0,0,0,0,0,240,3.6,3,3,8000.0,77777,9,999999999,10,0.1820,0,88,0.097,0.0,0.0 +2014,5,7,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.9,0.6,40,102095,0,0,317,0,0,0,0,0,0,0,240,3.6,3,3,8000.0,77777,9,999999999,10,0.1820,0,88,0.097,0.0,0.0 +2014,5,7,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,0.6,46,102105,0,0,294,0,0,0,0,0,0,0,299,0.0,0,0,8000.0,77777,9,999999999,10,0.1820,0,88,0.097,0.0,0.0 +2014,5,8,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,1.1,52,102095,0,0,290,0,0,0,0,0,0,0,240,2.1,0,0,8000.0,77777,9,999999999,11,0.1830,0,88,0.097,0.0,0.0 +2014,5,8,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.6,1.1,52,102095,0,0,290,0,0,0,0,0,0,0,240,2.1,0,0,8000.0,77777,9,999999999,11,0.1830,0,88,0.097,0.0,0.0 +2014,5,8,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,0.0,46,102125,0,0,291,0,0,0,0,0,0,0,326,0.0,0,0,8000.0,77777,9,999999999,10,0.1830,0,88,0.097,0.0,0.0 +2014,5,8,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,-0.6,46,102125,0,0,289,0,0,0,0,0,0,0,338,0.0,0,0,8000.0,77777,9,999999999,9,0.1830,0,88,0.097,0.0,0.0 +2014,5,8,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.6,-0.6,46,102125,0,0,324,0,0,0,0,0,0,0,353,0.0,9,9,8000.0,77777,9,999999999,9,0.1830,0,88,0.097,0.0,0.0 +2014,5,8,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,1.7,54,102185,219,1204,327,40,31,35,4612,206,4044,1325,13,0.0,9,9,8000.0,7620,9,999999999,12,0.1830,0,88,0.097,0.0,0.0 +2014,5,8,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,1.1,43,102175,465,1341,338,163,238,81,18976,12173,9458,3373,43,0.0,9,9,8000.0,6096,9,999999999,11,0.1830,0,88,0.097,0.0,0.0 +2014,5,8,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,1.1,43,102175,698,1341,338,376,563,99,45213,34807,11943,4661,64,0.0,9,9,8000.0,6096,9,999999999,11,0.1830,0,88,0.097,0.0,0.0 +2014,5,8,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,0.0,37,102215,901,1341,342,520,585,181,61788,43071,21606,8585,70,3.6,9,9,8000.0,4267,9,999999999,10,0.1830,0,88,0.097,0.0,0.0 +2014,5,8,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,0.6,39,102205,1061,1341,343,700,720,171,85526,50704,20987,8671,80,4.6,9,9,8000.0,4267,9,999999999,10,0.1830,0,88,0.097,0.0,0.0 +2014,5,8,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,14.4,0.6,39,102205,1166,1341,343,690,456,314,81680,37994,37397,14440,80,4.6,9,9,8000.0,4267,9,999999999,10,0.1830,0,88,0.097,0.0,0.0 +2014,5,8,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,1.7,41,102045,1209,1341,328,917,881,137,95822,89699,17715,5654,90,4.6,5,5,8000.0,77777,9,999999999,12,0.1830,0,88,0.097,0.0,0.0 +2014,5,8,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,2.8,44,101995,1188,1341,329,845,663,252,101978,50445,30582,12236,90,4.1,5,5,8000.0,77777,9,999999999,13,0.1830,0,88,0.097,0.0,0.0 +2014,5,8,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.0,2.8,44,101995,1104,1341,329,777,579,278,91991,46504,33103,13004,90,4.1,5,5,8000.0,77777,9,999999999,13,0.1830,0,88,0.097,0.0,0.0 +2014,5,8,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,6.1,59,101885,963,1341,328,646,443,302,74309,37680,34947,13013,70,6.2,5,5,8000.0,77777,9,999999999,18,0.1830,0,88,0.097,0.0,0.0 +2014,5,8,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,3.9,51,101895,773,1341,325,531,462,234,60451,37661,26781,9613,100,7.2,5,5,8000.0,77777,9,999999999,14,0.1830,0,88,0.097,0.0,0.0 +2014,5,8,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.9,3.9,51,101895,549,1341,345,362,345,183,40207,25955,20425,6592,100,7.2,9,9,8000.0,77777,9,999999999,14,0.1830,0,88,0.097,0.0,0.0 +2014,5,8,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,7.2,67,101925,306,1341,346,196,187,115,21136,9184,12457,3435,70,2.6,9,9,8000.0,3962,9,999999999,20,0.1830,0,88,0.097,0.0,0.0 +2014,5,8,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,7.2,64,101925,59,1341,349,61,36,51,6135,0,5157,647,170,3.1,9,9,8000.0,3962,9,999999999,20,0.1830,0,88,0.097,0.0,0.0 +2014,5,8,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.9,7.2,64,101925,0,341,349,0,0,0,0,0,0,0,170,3.1,9,9,8000.0,3962,9,999999999,20,0.1830,0,88,0.098,0.0,0.0 +2014,5,8,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,11.1,72,102085,0,0,344,0,0,0,0,0,0,0,220,4.6,5,5,8000.0,77777,9,999999999,30,0.1830,0,88,0.098,0.0,0.0 +2014,5,8,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,11.1,75,102085,0,0,362,0,0,0,0,0,0,0,240,2.6,9,9,8000.0,6706,9,999999999,30,0.1830,0,88,0.098,0.0,0.0 +2014,5,8,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.6,11.1,75,102085,0,0,362,0,0,0,0,0,0,0,240,2.6,9,9,8000.0,6706,9,999999999,30,0.1830,0,88,0.098,0.0,0.0 +2014,5,8,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,8.9,80,102195,0,0,305,0,0,0,0,0,0,0,227,0.0,0,0,8000.0,77777,9,999999999,24,0.1830,0,88,0.098,0.0,0.0 +2014,5,9,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,9.4,83,102125,0,0,343,0,0,0,0,0,0,0,110,1.5,9,9,8000.0,5486,9,999999999,25,0.1840,0,88,0.098,0.0,0.0 +2014,5,9,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.2,9.4,83,102125,0,0,343,0,0,0,0,0,0,0,110,1.5,9,9,8000.0,5486,9,999999999,25,0.1840,0,88,0.098,0.0,0.0 +2014,5,9,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,10.0,86,102155,0,0,353,0,0,0,0,0,0,0,31,0.0,10,10,8000.0,2591,0,919999999,27,0.1840,0,88,0.098,0.0,0.0 +2014,5,9,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,10.0,89,102135,0,0,341,0,0,0,0,0,0,0,50,3.1,9,9,8000.0,3048,0,919999999,27,0.1840,0,88,0.098,0.0,0.0 +2014,5,9,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,10.0,89,102135,0,0,351,0,0,0,0,0,0,0,50,3.1,10,10,8000.0,3048,0,919999999,27,0.1840,0,88,0.098,0.0,0.0 +2014,5,9,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,8.9,83,102265,223,1230,350,4,0,4,391,0,394,176,360,2.6,10,10,8000.0,671,0,919999999,24,0.1840,0,88,0.098,0.0,0.0 +2014,5,9,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.0,9.0,87,101280,469,1340,346,86,40,72,10085,1833,8466,3069,30,3.6,10,10,8000.0,366,0,919999999,24,0.1840,0,88,0.098,0.0,0.0 +2014,5,9,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.1,8.9,86,102295,702,1340,347,54,0,54,5499,0,5547,2702,40,3.1,10,10,8000.0,366,0,919999999,24,0.1840,0,88,0.098,0.0,0.0 +2014,5,9,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,11.0,9.0,87,101280,904,1340,346,52,0,52,5386,0,5436,2803,10,2.6,10,10,4828.0,152,0,919999999,24,0.1840,0,88,0.098,0.0,0.0 +2014,5,9,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,11.1,8.3,83,102375,1063,1340,346,102,0,102,10707,0,10812,5472,70,2.6,10,10,4828.0,152,0,919999999,23,0.1840,0,88,0.098,0.0,0.0 +2014,5,9,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,11.1,8.3,83,102375,1168,1340,346,133,0,133,14081,0,14223,7044,70,2.6,10,10,4800.0,152,0,919999999,23,0.1840,0,88,0.098,0.0,0.0 +2014,5,9,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,10.0,9.0,93,101280,1211,1340,341,119,1,118,15200,60,15130,6336,50,3.6,10,10,1207.0,152,0,919999999,24,0.1840,0,88,0.098,0.0,0.0 +2014,5,9,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,11.0,9.0,87,101280,1190,1340,346,213,8,206,26047,551,25320,10364,40,2.6,10,10,1207.0,152,0,919999999,24,0.1840,0,88,0.098,0.0,0.0 +2014,5,9,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,10.6,9.4,92,102294,1106,1340,345,235,10,226,28206,719,27270,11054,70,2.6,10,10,1200.0,152,0,919999999,25,0.1840,0,88,0.098,0.0,0.0 +2014,5,9,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,11.0,9.0,87,101280,965,1340,346,226,13,216,26669,953,25620,10185,40,2.1,10,10,805.0,427,0,919999999,24,0.1840,0,88,0.098,0.0,0.0 +2014,5,9,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,12.0,11.0,94,101280,776,1340,353,183,9,177,21246,625,20645,7871,70,1.5,10,10,4023.0,671,0,919999999,29,0.1840,0,88,0.098,0.0,0.0 +2014,5,9,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,12.2,10.6,90,102145,553,1340,354,110,0,110,11050,0,11142,4627,161,0.0,10,10,4000.0,671,0,919999999,28,0.1840,0,88,0.098,0.0,0.0 +2014,5,9,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,9.4,83,102065,309,1340,353,56,0,56,5513,0,5554,2158,155,0.0,10,10,4000.0,1494,0,919999999,25,0.1840,0,88,0.098,0.0,0.0 +2014,5,9,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,8.9,75,102075,63,1340,357,13,0,13,1253,0,1261,451,170,2.6,10,10,4000.0,1676,0,919999999,24,0.1840,0,88,0.098,0.0,0.0 +2014,5,9,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,8.9,75,102075,0,365,357,0,0,0,0,0,0,0,170,2.6,10,10,4000.0,1676,9,999999999,24,0.1840,0,88,0.098,0.0,0.0 +2014,5,9,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,7.8,72,101935,0,0,354,0,0,0,0,0,0,0,130,1.5,10,10,4000.0,610,9,999999999,21,0.1840,0,88,0.098,0.0,0.0 +2014,5,9,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,8.9,80,101885,0,0,352,0,0,0,0,0,0,0,120,1.5,10,10,4000.0,701,9,999999999,24,0.1840,0,88,0.098,0.0,0.0 +2014,5,9,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.2,8.9,80,101885,0,0,352,0,0,0,0,0,0,0,120,1.5,10,10,4000.0,701,9,999999999,24,0.1840,0,88,0.098,0.0,0.0 +2014,5,9,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,12.8,87,101805,0,0,371,0,0,0,0,0,0,0,170,2.6,10,10,4000.0,427,9,999999999,35,0.1840,0,88,0.098,0.0,0.0 +2014,5,10,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,13.3,90,101635,0,0,371,0,0,0,0,0,0,0,170,2.6,10,10,4000.0,427,9,999999999,37,0.1850,0,88,0.098,0.0,0.0 +2014,5,10,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.0,13.3,90,101635,0,0,371,0,0,0,0,0,0,0,170,2.6,10,10,4000.0,427,9,999999999,37,0.1850,0,88,0.098,0.0,0.0 +2014,5,10,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,14.4,84,101376,0,0,384,0,0,0,0,0,0,0,190,6.7,10,10,4000.0,427,9,999999999,41,0.1850,0,88,0.098,0.0,0.0 +2014,5,10,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,14.4,84,101296,0,0,384,0,0,0,0,0,0,0,180,4.1,10,10,4000.0,427,9,999999999,41,0.1850,0,88,0.098,0.0,0.0 +2014,5,10,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.2,14.4,84,101296,0,0,384,0,0,0,0,0,0,0,180,4.1,10,10,4000.0,427,9,999999999,41,0.1850,0,88,0.098,0.0,0.0 +2014,5,10,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,15.6,87,101156,227,1255,389,16,0,16,1557,0,1568,671,190,5.7,10,10,4000.0,366,9,999999999,46,0.1850,0,88,0.098,0.0,0.0 +2014,5,10,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,18.3,16.1,87,101156,473,1339,392,42,0,42,4172,0,4207,1914,210,8.2,10,10,2414.0,305,0,919999999,48,0.1850,0,88,0.098,0.0,0.0 +2014,5,10,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,18.3,16.1,87,101156,705,1339,392,99,0,99,10032,0,10121,4680,210,8.2,10,10,2400.0,305,0,919999999,48,0.1850,0,88,0.098,0.0,0.0 +2014,5,10,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,16.1,87,101016,907,1339,392,156,5,153,18654,306,18376,7491,210,5.7,10,10,2400.0,305,0,919999999,48,0.1850,0,88,0.098,0.0,0.0 +2014,5,10,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,18.9,16.7,87,101036,1066,1339,396,307,64,256,36115,4500,30289,12084,230,5.1,10,10,9656.0,305,0,919999999,51,0.1850,0,88,0.098,0.0,0.0 +2014,5,10,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,18.9,16.7,87,101036,1170,1339,385,447,99,361,51961,7782,42244,15974,230,5.1,9,9,9000.0,305,0,919999999,51,0.1850,0,88,0.098,0.0,0.0 +2014,5,10,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,16.1,66,100937,1214,1339,405,549,126,435,63297,10713,50514,18273,260,5.7,9,9,9000.0,5486,0,919999999,48,0.1850,0,88,0.098,0.0,0.0 +2014,5,10,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,15.0,56,100867,1192,1339,425,591,157,450,67814,13832,52009,18523,260,5.1,10,10,9000.0,7315,0,919999999,43,0.1850,0,88,0.098,0.0,0.0 +2014,5,10,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,24.4,15.0,56,100867,1109,1339,413,665,321,391,76238,27272,45133,16527,260,5.1,9,9,9000.0,7315,0,919999999,43,0.1850,0,88,0.098,0.0,0.0 +2014,5,10,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,14.4,50,100747,967,1339,431,554,255,348,62773,21739,39688,14304,220,5.1,10,10,9000.0,6401,0,919999999,40,0.1850,0,88,0.098,0.0,0.0 +2014,5,10,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,12.2,42,100727,779,1339,430,381,131,288,42526,11130,32338,10998,240,5.7,10,10,9000.0,6401,0,919999999,32,0.1850,0,88,0.098,0.0,0.0 +2014,5,10,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,26.1,12.2,42,100727,556,1339,430,256,120,200,28153,8922,22110,6992,240,5.7,10,10,9000.0,6401,0,919999999,32,0.1850,0,88,0.098,0.0,0.0 +2014,5,10,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,13.9,54,100727,313,1339,420,94,2,93,10305,75,10236,3115,200,5.1,10,10,9000.0,3353,0,919999999,38,0.1850,0,88,0.098,0.0,0.0 +2014,5,10,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,22.0,17.0,73,101282,67,1339,414,36,0,36,3448,0,3472,830,270,12.4,10,10,3219.0,1981,0,019999999,53,0.1850,0,88,0.098,0.0,0.0 +2014,5,10,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,16.1,78,100827,0,389,401,0,0,0,0,0,0,0,290,4.6,10,10,3219.0,1981,9,999999999,48,0.1850,0,88,0.098,4.0,0.0 +2014,5,10,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,14.4,78,100816,0,0,390,0,0,0,0,0,0,0,230,7.2,10,10,3219.0,3048,0,919999999,41,0.1850,0,88,0.098,4.0,0.0 +2014,5,10,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,14.4,78,100766,0,0,379,0,0,0,0,0,0,0,240,5.1,9,9,3219.0,4572,0,919999999,41,0.1850,0,88,0.098,0.4,0.0 +2014,5,10,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.3,14.4,78,100766,0,0,358,0,0,0,0,0,0,0,240,5.1,5,5,3219.0,4572,0,919999999,41,0.1850,0,88,0.098,0.0,0.0 +2014,5,10,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,14.4,78,100826,0,0,390,0,0,0,0,0,0,0,240,6.2,10,10,3219.0,4267,0,919999999,41,0.1850,0,88,0.098,0.0,0.0 +2014,5,11,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,14.4,78,100816,0,0,390,0,0,0,0,0,0,0,250,5.7,10,10,3219.0,4572,0,919999999,41,0.1870,0,88,0.098,0.0,0.0 +2014,5,11,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.3,14.4,78,100816,0,0,390,0,0,0,0,0,0,0,250,5.7,10,10,3219.0,4572,0,919999999,41,0.1870,0,88,0.098,0.0,0.0 +2014,5,11,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,11.1,63,100856,0,0,386,0,0,0,0,0,0,0,280,5.7,10,10,3219.0,2438,0,919999999,29,0.1870,0,88,0.098,0.0,0.0 +2014,5,11,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,8.3,56,100926,0,0,377,0,0,0,0,0,0,0,260,5.7,10,10,3219.0,2743,0,919999999,22,0.1870,0,88,0.098,0.0,0.0 +2014,5,11,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.2,8.3,56,100926,0,0,377,0,0,0,0,0,0,0,260,5.7,10,10,3219.0,2743,0,919999999,22,0.1870,0,88,0.098,0.0,0.0 +2014,5,11,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,5.0,44,101186,231,1279,362,54,103,37,6225,917,4274,1410,280,4.6,9,9,3219.0,4572,0,919999999,16,0.1870,0,88,0.098,0.0,0.0 +2014,5,11,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,5.0,43,101256,477,1339,365,166,225,92,19162,11921,10655,3773,270,3.6,9,9,3219.0,7620,0,919999999,16,0.1870,0,88,0.098,0.0,0.0 +2014,5,11,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,5.0,43,101256,708,1339,345,368,535,106,44052,32983,12732,4973,270,3.6,5,5,3219.0,7620,0,919999999,16,0.1870,0,88,0.098,0.0,0.0 +2014,5,11,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,5.6,37,101316,910,1339,353,595,816,97,63246,82950,13579,2282,280,6.7,3,3,3219.0,77777,0,919999999,17,0.1870,0,88,0.098,0.0,0.0 +2014,5,11,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,3.9,31,101317,1068,1339,342,754,871,109,79636,88822,14707,3232,270,7.2,0,0,3219.0,77777,0,919999999,14,0.1870,0,88,0.098,0.0,0.0 +2014,5,11,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,3.9,31,101317,1172,1339,342,877,914,111,92528,93416,14652,4372,270,7.2,0,0,3219.0,77777,0,919999999,14,0.1870,0,88,0.098,0.0,0.0 +2014,5,11,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,-1.1,18,101237,1216,1339,348,947,936,112,99224,95193,14630,5157,280,4.1,0,0,3219.0,77777,0,919999999,9,0.1870,0,88,0.098,0.0,0.0 +2014,5,11,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,-1.7,16,101237,1194,1339,353,958,941,111,100356,95623,14570,4724,270,6.7,0,0,3219.0,77777,0,919999999,8,0.1870,0,88,0.098,0.0,0.0 +2014,5,11,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.6,-1.7,16,101237,1111,1339,369,910,931,109,95426,94464,14569,3597,270,6.7,3,3,3219.0,77777,0,919999999,8,0.1870,0,88,0.098,0.0,0.0 +2014,5,11,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,-2.8,14,101217,970,1339,373,808,906,103,84817,91457,14191,2576,300,6.7,3,3,3219.0,77777,0,919999999,7,0.1870,0,88,0.098,0.0,0.0 +2014,5,11,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,-2.8,14,101197,782,1339,370,662,863,94,81162,54300,11560,4643,270,5.1,3,3,3219.0,77777,0,919999999,7,0.1870,0,88,0.098,0.0,0.0 +2014,5,11,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,-2.8,14,101247,559,1339,354,484,793,81,57597,44783,9667,3613,300,6.7,0,0,3219.0,77777,0,919999999,7,0.1870,0,88,0.098,0.0,0.0 +2014,5,11,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,-2.8,15,101287,317,1339,367,292,660,64,33283,23176,7316,2416,290,7.2,3,3,3219.0,77777,0,919999999,7,0.1870,0,88,0.098,0.0,0.0 +2014,5,11,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,-1.1,19,101377,71,1339,367,115,382,36,12114,0,3807,860,270,4.6,5,5,3219.0,77777,0,919999999,9,0.1870,0,88,0.098,0.0,0.0 +2014,5,11,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.9,-1.1,19,101377,0,413,361,0,0,0,0,0,0,0,270,4.6,3,3,3219.0,77777,9,999999999,9,0.1870,0,88,0.098,0.0,0.0 +2014,5,11,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,0.0,24,101577,0,0,337,0,0,0,0,0,0,0,280,3.6,0,0,3219.0,77777,9,999999999,10,0.1870,0,88,0.098,0.0,0.0 +2014,5,11,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,0.6,26,101606,0,0,350,0,0,0,0,0,0,0,280,3.6,3,3,3219.0,77777,9,999999999,10,0.1870,0,88,0.098,0.0,0.0 +2014,5,11,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,0.6,26,101606,0,0,350,0,0,0,0,0,0,0,280,3.6,3,3,3219.0,77777,9,999999999,10,0.1870,0,88,0.098,0.0,0.0 +2014,5,11,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,2.2,33,101646,0,0,327,0,0,0,0,0,0,0,280,4.6,0,0,3219.0,77777,9,999999999,12,0.1870,0,88,0.098,0.0,0.0 +2014,5,12,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,2.8,37,101666,0,0,337,0,0,0,0,0,0,0,280,4.6,3,3,3219.0,77777,9,999999999,13,0.1880,0,88,0.098,0.0,0.0 +2014,5,12,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,2.8,37,101666,0,0,323,0,0,0,0,0,0,0,280,4.6,0,0,3219.0,77777,9,999999999,13,0.1880,0,88,0.098,0.0,0.0 +2014,5,12,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,3.3,41,101716,0,0,332,0,0,0,0,0,0,0,280,3.6,3,3,3219.0,77777,9,999999999,14,0.1880,0,88,0.098,0.0,0.0 +2014,5,12,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,2.8,39,101776,0,0,337,0,0,0,0,0,0,0,270,3.1,5,5,3219.0,77777,9,999999999,13,0.1880,0,88,0.098,0.0,0.0 +2014,5,12,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.7,2.8,39,101776,0,0,357,0,0,0,0,0,0,0,270,3.1,9,9,3219.0,77777,9,999999999,13,0.1880,0,88,0.098,0.0,0.0 +2014,5,12,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,2.8,33,101846,235,1303,370,62,163,36,7180,1638,4177,1385,270,4.1,9,9,3219.0,7620,9,999999999,13,0.1880,0,88,0.098,0.0,0.0 +2014,5,12,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,3.3,31,101866,480,1338,359,206,433,65,24470,20536,7740,2837,300,3.6,5,5,3219.0,77777,9,999999999,13,0.1880,0,88,0.098,0.0,0.0 +2014,5,12,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,3.3,31,101866,711,1338,353,399,639,94,48258,38612,11404,4489,300,3.6,3,3,3219.0,77777,9,999999999,13,0.1880,0,88,0.098,0.0,0.0 +2014,5,12,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,3.9,25,101817,912,1338,373,588,785,107,72759,49350,13285,5494,239,1.5,3,3,3219.0,77777,9,999999999,14,0.1880,0,88,0.098,0.0,0.0 +2014,5,12,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,5.6,33,101807,1070,1338,370,739,829,122,78000,84665,16349,3404,130,4.1,5,5,3219.0,77777,9,999999999,17,0.1880,0,88,0.098,0.0,0.0 +2014,5,12,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.8,5.6,33,101807,1175,1338,370,847,845,138,89024,86416,17973,4974,130,4.1,5,5,3219.0,77777,9,999999999,17,0.1880,0,88,0.098,0.0,0.0 +2014,5,12,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,7.2,34,101667,1217,1338,377,909,861,140,95746,88328,18062,5997,150,3.6,5,5,3219.0,77777,9,999999999,20,0.1880,0,88,0.098,0.0,0.0 +2014,5,12,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,4.4,24,101627,1196,1338,388,752,445,351,88552,37725,41598,15772,180,4.1,5,5,3219.0,77777,9,999999999,15,0.1880,0,88,0.098,0.0,0.0 +2014,5,12,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,26.7,4.4,24,101627,1113,1338,388,697,503,272,82740,39669,32474,12819,180,4.1,5,5,3219.0,77777,9,999999999,15,0.1880,0,88,0.098,0.0,0.0 +2014,5,12,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,3.9,20,101438,972,1338,399,653,607,196,77897,44428,23494,9456,220,6.7,5,5,3219.0,77777,9,999999999,14,0.1880,0,88,0.098,0.0,0.0 +2014,5,12,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,5.6,25,101427,784,1338,392,622,750,126,74449,48621,15138,6002,200,6.7,5,5,3219.0,77777,9,999999999,17,0.1880,0,88,0.098,0.0,0.0 +2014,5,12,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,27.2,5.6,25,101427,562,1338,392,371,392,146,42072,26267,16628,5774,200,6.7,5,5,3219.0,77777,9,999999999,17,0.1880,0,88,0.098,0.0,0.0 +2014,5,12,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,8.9,37,101427,320,1338,382,241,371,99,26430,16121,10901,3276,190,5.1,5,5,3219.0,77777,9,999999999,23,0.1880,0,88,0.098,0.0,0.0 +2014,5,12,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,10.6,42,101497,75,1338,384,85,119,54,8627,0,5509,860,210,5.7,5,5,3219.0,77777,9,999999999,28,0.1880,0,88,0.098,0.0,0.0 +2014,5,12,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,24.4,10.6,42,101497,0,437,384,0,0,0,0,0,0,0,210,5.7,5,5,3219.0,77777,9,999999999,28,0.1880,0,88,0.098,0.0,0.0 +2014,5,12,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,12.2,48,101617,0,0,384,0,0,0,0,0,0,0,240,4.6,5,5,3219.0,77777,9,999999999,33,0.1880,0,88,0.098,0.0,0.0 +2014,5,12,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,12.8,52,101667,0,0,381,0,0,0,0,0,0,0,290,4.1,5,5,3219.0,77777,9,999999999,35,0.1880,0,88,0.098,0.0,0.0 +2014,5,12,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.3,12.8,52,101667,0,0,381,0,0,0,0,0,0,0,290,4.1,5,5,3219.0,77777,9,999999999,35,0.1880,0,88,0.098,0.0,0.0 +2014,5,12,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,6.7,74,102095,0,0,316,0,0,0,0,0,0,0,50,7.2,5,5,3219.0,77777,9,999999999,19,0.1880,0,88,0.098,0.0,0.0 +2014,5,13,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,6.7,77,102125,0,0,314,0,0,0,0,0,0,0,50,5.1,5,5,3219.0,77777,9,999999999,19,0.1890,0,88,0.098,0.0,0.0 +2014,5,13,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.6,6.7,77,102125,0,0,314,0,0,0,0,0,0,0,50,5.1,5,5,3219.0,77777,9,999999999,19,0.1890,0,88,0.098,0.0,0.0 +2014,5,13,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,6.7,80,102244,0,0,329,0,0,0,0,0,0,0,40,5.7,9,9,3219.0,6096,9,999999999,19,0.1890,0,88,0.098,0.0,0.0 +2014,5,13,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,6.1,77,102294,0,0,329,0,0,0,0,0,0,0,40,4.6,9,9,3219.0,6096,9,999999999,18,0.1890,0,88,0.098,0.0,0.0 +2014,5,13,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.0,6.1,77,102294,0,0,329,0,0,0,0,0,0,0,40,4.6,9,9,3219.0,6096,9,999999999,18,0.1890,0,88,0.098,0.0,0.0 +2014,5,13,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,5.6,74,102424,239,1326,328,18,0,18,1765,0,1778,755,50,6.2,9,9,3219.0,4267,9,999999999,17,0.1890,0,88,0.098,0.0,0.0 +2014,5,13,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,5.0,68,102504,483,1337,330,78,0,78,7813,0,7876,3320,50,7.7,9,9,3219.0,3048,9,999999999,16,0.1890,0,88,0.098,0.0,0.0 +2014,5,13,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.6,5.0,68,102504,714,1337,330,153,14,146,17888,954,17141,6509,50,7.7,9,9,3219.0,3048,9,999999999,16,0.1890,0,88,0.098,0.0,0.0 +2014,5,13,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,5.0,71,102594,915,1337,328,220,21,207,25895,1573,24487,9628,80,6.2,9,9,3219.0,3048,9,999999999,16,0.1890,0,88,0.098,0.0,0.0 +2014,5,13,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,5.6,71,102644,1073,1337,340,379,72,324,44109,6101,37941,14414,70,6.2,10,10,3219.0,2591,9,999999999,17,0.1890,0,88,0.098,0.0,0.0 +2014,5,13,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.6,5.6,71,102644,1177,1337,340,284,18,269,34030,1382,32418,12868,70,6.2,10,10,3219.0,2591,9,999999999,17,0.1890,0,88,0.098,0.0,0.0 +2014,5,13,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,5.6,71,102674,1219,1337,340,342,24,321,40664,1941,38405,14859,70,6.2,10,10,3219.0,2438,9,999999999,17,0.1890,0,88,0.098,0.0,0.0 +2014,5,13,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,6.0,76,101280,1198,1337,329,244,31,216,29810,2205,26527,10800,80,6.2,9,9,3219.0,610,9,999999999,18,0.1890,0,88,0.098,0.0,0.0 +2014,5,13,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,9.4,5.0,74,102694,1115,1337,325,295,34,265,35095,2647,31705,12570,70,5.7,9,9,3219.0,610,9,999999999,16,0.1890,0,88,0.098,0.0,0.0 +2014,5,13,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,2.8,68,102674,974,1337,317,182,4,178,21888,286,21506,8744,70,5.1,9,9,3219.0,2438,9,999999999,13,0.1890,0,88,0.098,0.0,0.0 +2014,5,13,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,2.8,66,102654,787,1337,320,152,1,151,17968,70,17925,6989,90,4.6,9,9,3219.0,2286,9,999999999,13,0.1890,0,88,0.098,0.0,0.0 +2014,5,13,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.9,2.8,66,102654,565,1337,320,186,55,161,20963,3915,18227,6197,90,4.6,9,9,3219.0,2286,9,999999999,13,0.1890,0,88,0.098,0.0,0.0 +2014,5,13,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,2.2,65,102634,324,1337,317,146,56,128,15731,3179,13856,3759,90,3.6,9,9,3219.0,2286,9,999999999,12,0.1890,0,88,0.098,0.0,0.0 +2014,5,13,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,2.2,68,102664,79,1337,314,59,19,54,6034,20,5550,916,80,2.6,9,9,3219.0,2438,9,999999999,12,0.1890,0,88,0.098,0.0,0.0 +2014,5,13,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.8,2.2,68,102664,0,461,314,0,0,0,0,0,0,0,80,2.6,9,9,3219.0,2438,9,999999999,12,0.1890,0,88,0.098,0.0,0.0 +2014,5,13,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,2.8,71,102714,0,0,297,0,0,0,0,0,0,0,90,1.5,5,5,3219.0,77777,9,999999999,13,0.1890,0,88,0.098,0.0,0.0 +2014,5,13,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,3.3,71,102674,0,0,327,0,0,0,0,0,0,0,90,2.6,10,10,3219.0,1524,9,999999999,14,0.1890,0,88,0.098,0.0,0.0 +2014,5,13,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.3,3.3,71,102674,0,0,318,0,0,0,0,0,0,0,90,2.6,9,9,3219.0,1524,9,999999999,14,0.1890,0,88,0.098,0.0,0.0 +2014,5,13,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,4.4,76,102644,0,0,328,0,0,0,0,0,0,0,100,2.6,10,10,3219.0,1524,9,999999999,15,0.1890,0,88,0.098,0.0,0.0 +2014,5,14,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,4.4,79,102614,0,0,299,0,0,0,0,0,0,0,120,2.1,5,5,3219.0,77777,9,999999999,15,0.1900,0,88,0.098,0.0,0.0 +2014,5,14,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.8,4.4,79,102614,0,0,326,0,0,0,0,0,0,0,120,2.1,10,10,3219.0,77777,9,999999999,15,0.1900,0,88,0.098,0.0,0.0 +2014,5,14,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,5.0,82,102644,0,0,326,0,0,0,0,0,0,0,130,2.1,10,10,3219.0,366,9,999999999,16,0.1900,0,88,0.098,0.0,0.0 +2014,5,14,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.0,5.0,81,101280,0,0,327,0,0,0,0,0,0,0,130,3.1,10,10,3219.0,2134,9,999999999,16,0.1900,0,88,0.098,0.0,0.0 +2014,5,14,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.8,5.0,82,102644,2,13,326,0,0,0,0,0,0,0,140,1.5,10,10,3219.0,2134,9,999999999,16,0.1900,0,88,0.098,0.0,0.0 +2014,5,14,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,6.1,83,102684,243,1337,333,38,4,37,4399,42,4292,1430,140,2.1,10,10,3219.0,1524,9,999999999,18,0.1900,0,88,0.098,0.0,0.0 +2014,5,14,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,6.1,80,102654,487,1337,308,190,296,85,22116,15204,9925,3573,140,4.1,5,5,3219.0,77777,9,999999999,18,0.1900,0,88,0.098,0.0,0.0 +2014,5,14,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,9.4,6.1,80,102654,717,1337,326,245,132,188,28081,9811,21652,7907,140,4.1,9,9,3219.0,77777,9,999999999,18,0.1900,0,88,0.098,0.0,0.0 +2014,5,14,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,7.2,79,102704,917,1337,342,249,67,213,29231,5000,25132,9859,80,3.6,10,10,3219.0,1524,9,999999999,20,0.1900,0,88,0.098,0.0,0.0 +2014,5,14,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,7.8,74,102675,1075,1337,341,475,165,348,54941,14221,40509,15149,80,5.7,9,9,3219.0,1524,9,999999999,22,0.1900,0,88,0.098,0.0,0.0 +2014,5,14,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.2,7.8,74,102675,1178,1337,341,561,187,400,65145,16535,46765,17156,80,5.7,9,9,3219.0,1524,9,999999999,22,0.1900,0,88,0.098,0.0,0.0 +2014,5,14,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,7.8,72,102665,1221,1337,344,680,278,428,79014,24966,50081,18145,90,6.2,9,9,3219.0,1463,9,999999999,22,0.1900,0,88,0.098,0.0,0.0 +2014,5,14,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,8.3,74,102605,1200,1337,345,849,693,221,103480,48824,27079,11013,70,5.7,9,9,3219.0,1463,9,999999999,23,0.1900,0,88,0.098,0.0,0.0 +2014,5,14,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.8,8.3,74,102605,1117,1337,325,849,798,158,104922,52092,19613,8175,70,5.7,5,5,3219.0,1463,9,999999999,23,0.1900,0,88,0.098,0.0,0.0 +2014,5,14,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,9.4,72,102495,977,1337,334,751,758,156,91028,49898,18991,7828,90,6.7,5,5,3219.0,77777,9,999999999,25,0.1900,0,88,0.098,0.0,0.0 +2014,5,14,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,9.4,72,102455,789,1337,334,611,697,147,72222,45978,17449,6849,100,7.2,5,5,3219.0,77777,9,999999999,25,0.1900,0,88,0.098,0.0,0.0 +2014,5,14,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,14.4,9.4,72,102455,568,1337,329,443,601,130,50692,37243,14936,5336,100,7.2,3,3,3219.0,77777,9,999999999,25,0.1900,0,88,0.098,0.0,0.0 +2014,5,14,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,10.0,75,102415,327,1337,334,264,448,101,28955,19732,11123,3358,120,6.2,5,5,3219.0,77777,9,999999999,27,0.1900,0,88,0.098,0.0,0.0 +2014,5,14,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,8.3,56,102455,83,1337,346,104,208,53,10664,0,5461,973,170,5.1,5,5,3219.0,77777,9,999999999,22,0.1900,0,88,0.098,0.0,0.0 +2014,5,14,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.2,8.3,56,102455,0,484,346,0,0,0,0,0,0,0,170,5.1,5,5,3219.0,77777,9,999999999,22,0.1900,0,88,0.098,0.0,0.0 +2014,5,14,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,11.1,81,102555,0,0,336,0,0,0,0,0,0,0,170,3.1,5,5,3219.0,77777,9,999999999,30,0.1900,0,88,0.098,0.0,0.0 +2014,5,14,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.0,11.0,82,101280,0,0,364,0,0,0,0,0,0,0,160,3.1,10,10,3219.0,701,9,999999999,29,0.1900,0,88,0.098,0.0,0.0 +2014,5,14,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,14.4,11.1,81,102555,0,0,366,0,0,0,0,0,0,0,160,3.1,10,10,3219.0,701,9,999999999,30,0.1900,0,88,0.098,0.0,0.0 +2014,5,14,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.0,12.0,88,101280,0,0,365,0,0,0,0,0,0,0,170,3.6,10,10,3219.0,1219,9,999999999,32,0.1900,0,88,0.098,0.0,0.0 +2014,5,15,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,12.0,82,101281,0,0,370,0,0,0,0,0,0,0,190,2.1,10,10,3219.0,823,9,999999999,32,0.1910,0,88,0.098,0.0,0.0 +2014,5,15,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.0,11.7,81,102485,0,0,369,0,0,0,0,0,0,0,190,2.6,10,10,3219.0,823,9,999999999,32,0.1910,0,88,0.098,0.0,0.0 +2014,5,15,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,13.0,88,101281,0,0,371,0,0,0,0,0,0,0,180,1.5,10,10,3219.0,335,9,999999999,36,0.1910,0,88,0.098,0.0,0.0 +2014,5,15,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,13.3,90,102535,0,0,371,0,0,0,0,0,0,0,150,1.5,10,10,3219.0,732,9,999999999,37,0.1910,0,88,0.098,0.0,0.0 +2014,5,15,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.0,13.3,90,102535,6,37,371,0,0,0,0,0,0,0,150,1.5,10,10,3219.0,732,9,999999999,37,0.1910,0,88,0.098,0.0,0.0 +2014,5,15,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.0,13.0,94,101280,247,1336,366,47,40,42,5374,381,4814,1593,130,3.6,10,10,3219.0,914,9,999999999,36,0.1910,0,88,0.098,0.0,0.0 +2014,5,15,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,13.9,87,102535,490,1336,378,76,22,74,8913,974,8704,3193,110,2.1,10,10,3219.0,975,9,999999999,39,0.1910,0,88,0.098,0.0,0.0 +2014,5,15,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.1,13.9,87,102535,719,1336,378,150,8,146,17477,503,17084,6535,110,2.1,10,10,3219.0,975,9,999999999,39,0.1910,0,88,0.098,0.0,0.0 +2014,5,15,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,12.8,81,102525,920,1336,366,351,145,252,40560,11031,29283,11203,80,3.1,9,9,3219.0,1219,9,999999999,35,0.1910,0,88,0.098,0.0,0.0 +2014,5,15,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,12.8,73,102466,1077,1336,375,485,183,344,56017,15122,39988,15046,60,3.6,9,9,3219.0,1341,9,999999999,35,0.1910,0,88,0.098,0.0,0.0 +2014,5,15,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,12.8,73,102466,1180,1336,354,694,439,317,81875,33914,37633,14601,60,3.6,5,5,3219.0,1341,9,999999999,35,0.1910,0,88,0.098,0.0,0.0 +2014,5,15,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,15.6,62,102366,1223,1336,408,679,340,377,79340,27088,44352,16696,170,5.1,9,9,3219.0,1219,9,999999999,46,0.1910,0,88,0.098,0.0,0.0 +2014,5,15,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,16.1,64,102376,1202,1336,408,566,196,388,65769,15843,45396,16931,190,6.7,9,9,3219.0,1158,9,999999999,48,0.1910,0,88,0.098,0.0,0.0 +2014,5,15,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.3,16.1,64,102376,1119,1336,408,455,109,358,52582,8744,41647,15668,190,6.7,9,9,3219.0,1158,9,999999999,48,0.1910,0,88,0.098,0.0,0.0 +2014,5,15,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.0,16.0,69,101282,979,1336,412,417,93,339,47393,7662,38777,14195,190,5.1,10,10,3219.0,853,9,999999999,48,0.1910,0,88,0.098,0.0,0.0 +2014,5,15,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,16.1,68,102256,792,1336,414,192,12,182,22234,794,21178,8134,200,5.7,10,10,3219.0,732,9,999999999,48,0.1910,0,88,0.098,0.0,0.0 +2014,5,15,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,16.1,68,102256,571,1336,414,153,7,150,17242,428,16981,5940,200,5.7,10,10,3219.0,732,9,999999999,48,0.1910,0,88,0.098,0.0,0.0 +2014,5,15,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.0,16.0,73,101282,330,1336,396,124,61,108,13483,2577,11794,3513,190,4.1,9,9,3219.0,1128,9,999999999,48,0.1910,0,88,0.098,0.0,0.0 +2014,5,15,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,15.0,76,102296,87,1336,386,60,20,56,6114,0,5735,1004,170,4.6,9,9,3219.0,1067,9,999999999,44,0.1910,0,88,0.098,0.0,0.0 +2014,5,15,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,19.4,15.0,76,102296,0,507,386,0,0,0,0,0,0,0,170,4.6,9,9,3219.0,1067,9,999999999,44,0.1910,0,88,0.098,0.0,0.0 +2014,5,15,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,14.4,84,102355,0,0,384,0,0,0,0,0,0,0,160,4.1,10,10,3219.0,671,9,999999999,41,0.1910,0,88,0.098,0.0,0.0 +2014,5,15,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,15.0,87,102305,0,0,385,0,0,0,0,0,0,0,160,4.6,10,10,3219.0,610,9,999999999,44,0.1910,0,88,0.098,0.0,0.0 +2014,5,15,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.2,15.0,87,102305,0,0,385,0,0,0,0,0,0,0,160,4.6,10,10,3219.0,610,9,999999999,44,0.1910,0,88,0.098,0.0,0.0 +2014,5,15,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.0,14.0,82,101281,0,0,383,0,0,0,0,0,0,0,170,3.6,10,10,3219.0,77777,9,999999999,39,0.1910,0,88,0.098,0.0,0.0 +2014,5,16,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,14.4,84,102136,0,0,384,0,0,0,0,0,0,0,180,6.2,10,10,3219.0,1067,9,999999999,41,0.1920,0,88,0.098,0.0,0.0 +2014,5,16,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.2,14.4,84,102136,0,0,384,0,0,0,0,0,0,0,180,6.2,10,10,3219.0,1067,9,999999999,41,0.1920,0,88,0.098,0.0,0.0 +2014,5,16,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.0,15.0,88,101281,0,0,384,0,0,0,0,0,0,0,190,4.6,10,10,3219.0,396,9,999999999,43,0.1920,0,88,0.098,0.0,0.0 +2014,5,16,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,15.0,87,102076,0,0,385,0,0,0,0,0,0,0,180,5.1,10,10,3219.0,396,9,999999999,44,0.1920,0,88,0.098,0.0,0.0 +2014,5,16,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.2,15.0,87,102076,10,61,385,0,0,0,0,0,0,0,180,5.1,10,10,3219.0,396,9,999999999,44,0.1920,0,88,0.098,0.0,0.0 +2014,5,16,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.0,14.0,88,101281,250,1336,367,40,38,37,4623,272,4285,1442,160,4.1,9,9,3219.0,457,9,999999999,39,0.1920,0,88,0.098,0.0,0.0 +2014,5,16,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,15.0,81,101996,493,1336,391,90,52,82,10470,2360,9569,3487,170,6.7,10,10,3219.0,518,9,999999999,44,0.1920,0,88,0.098,0.0,0.0 +2014,5,16,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.3,15.0,81,101996,722,1336,380,202,60,174,23205,3988,20083,7502,170,6.7,9,9,3219.0,518,9,999999999,44,0.1920,0,88,0.098,0.0,0.0 +2014,5,16,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,15.0,70,101916,922,1336,403,182,5,178,21587,326,21213,8563,170,7.2,10,10,3219.0,823,9,999999999,43,0.1920,0,88,0.098,0.0,0.0 +2014,5,16,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.0,14.0,64,101282,1079,1336,393,367,65,315,42665,5108,36848,14169,170,7.2,9,9,3219.0,1128,9,999999999,39,0.1920,0,88,0.098,0.0,0.0 +2014,5,16,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,15.0,66,101896,1182,1336,398,493,119,388,57180,9799,45310,16840,170,8.2,9,9,3219.0,1128,9,999999999,43,0.1920,0,88,0.098,0.0,0.0 +2014,5,16,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,15.0,66,101826,1225,1336,409,358,31,330,42300,2348,39243,15189,170,9.8,10,10,3219.0,1189,9,999999999,43,0.1920,0,88,0.098,0.0,0.0 +2014,5,16,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,15.6,71,101806,1204,1336,407,355,27,330,41807,2044,39113,15120,170,8.2,10,10,3219.0,1219,9,999999999,46,0.1920,0,88,0.098,0.0,0.0 +2014,5,16,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,15.6,71,101806,1121,1336,407,306,24,285,36028,1756,33758,13311,170,8.2,10,10,3219.0,1219,0,919999999,46,0.1920,0,88,0.098,0.0,0.0 +2014,5,16,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.0,17.0,100,101281,981,1336,386,291,22,272,33645,1618,31633,12237,150,5.1,10,10,3219.0,335,0,919999999,53,0.1920,0,88,0.098,0.0,0.0 +2014,5,16,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,16.1,90,101706,795,1336,390,319,93,262,35894,7216,29651,10553,140,3.6,10,10,3219.0,610,0,919999999,49,0.1920,0,88,0.098,0.0,0.0 +2014,5,16,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,16.1,90,101706,574,1336,390,202,50,175,22494,3306,19584,6612,140,3.6,10,10,3219.0,610,0,919999999,49,0.1920,0,88,0.098,0.0,0.0 +2014,5,16,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,18.0,16.0,88,101281,334,1336,390,153,57,127,16428,2786,13701,3839,150,5.7,10,10,9656.0,427,0,919999999,48,0.1920,0,88,0.098,0.0,0.0 +2014,5,16,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.0,16.0,94,101281,91,1336,385,48,0,48,4612,0,4644,1063,150,6.2,10,10,9656.0,488,0,919999999,48,0.1920,0,88,0.098,0.0,0.0 +2014,5,16,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,17.2,16.1,93,101636,0,530,386,0,0,0,0,0,0,0,150,6.7,10,10,9000.0,488,0,919999999,49,0.1920,0,88,0.097,4.0,0.0 +2014,5,16,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,16.1,93,101626,0,0,386,0,0,0,0,0,0,0,170,6.7,10,10,9000.0,335,0,919999999,49,0.1920,0,88,0.097,4.0,0.0 +2014,5,16,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.0,16.0,94,101281,0,0,385,0,0,0,0,0,0,0,170,7.2,10,10,9000.0,274,0,919999999,48,0.1920,0,88,0.097,4.0,0.0 +2014,5,16,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.2,16.7,97,101546,0,0,387,0,0,0,0,0,0,0,170,7.7,10,10,9000.0,274,0,919999999,52,0.1920,0,88,0.097,4.0,0.0 +2014,5,16,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.0,16.0,94,101281,0,0,385,0,0,0,0,0,0,0,170,6.7,10,10,9000.0,335,0,919999999,48,0.1920,0,88,0.097,1.8,0.0 +2014,5,17,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,16.1,96,101296,0,0,384,0,0,0,0,0,0,0,160,6.7,10,10,9000.0,335,0,919999999,49,0.1930,0,88,0.097,0.0,0.0 +2014,5,17,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.7,16.1,96,101296,0,0,384,0,0,0,0,0,0,0,160,6.7,10,10,9000.0,335,0,919999999,49,0.1930,0,88,0.097,0.0,0.0 +2014,5,17,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,16.1,93,101136,0,0,386,0,0,0,0,0,0,0,160,7.7,10,10,9000.0,396,0,919999999,48,0.1930,0,88,0.097,0.0,0.0 +2014,5,17,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,16.1,93,101076,0,0,386,0,0,0,0,0,0,0,160,8.2,10,10,9000.0,335,0,919999999,48,0.1930,0,88,0.097,0.0,0.0 +2014,5,17,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.2,16.1,93,101076,14,84,386,0,0,0,0,0,0,0,160,8.2,10,10,9000.0,335,0,919999999,48,0.1930,0,88,0.097,0.0,0.0 +2014,5,17,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.0,16.0,94,101281,253,1335,385,39,10,37,4507,61,4285,1447,160,7.7,10,10,3219.0,335,0,919999999,48,0.1930,0,88,0.097,0.0,0.0 +2014,5,17,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.0,17.0,100,101281,496,1335,386,42,0,42,4178,0,4212,1941,190,3.1,10,10,4828.0,274,0,919999999,53,0.1930,0,88,0.097,0.0,0.0 +2014,5,17,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,17.2,16.7,97,101146,725,1335,387,212,76,172,24355,4910,19853,7452,210,3.6,10,10,4800.0,274,0,919999999,51,0.1930,0,88,0.097,0.0,0.0 +2014,5,17,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.0,17.0,100,101281,924,1335,386,239,33,219,27861,2256,25665,10113,200,2.1,10,10,4800.0,427,0,919999999,53,0.1930,0,88,0.097,0.0,0.0 +2014,5,17,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.0,14.0,82,101281,1081,1335,372,456,240,262,53799,17502,31089,12367,240,5.1,9,9,4800.0,3658,0,919999999,39,0.1930,0,88,0.097,0.0,0.0 +2014,5,17,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.3,14.4,78,101266,1184,1335,379,685,430,309,80937,32316,36738,14340,270,4.6,9,9,4800.0,3658,0,919999999,41,0.1930,0,88,0.097,0.0,0.0 +2014,5,17,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,10.0,51,101286,1226,1335,364,893,749,214,109417,51262,26359,10758,260,5.7,5,5,4800.0,77777,0,919999999,26,0.1930,0,88,0.097,0.0,0.0 +2014,5,17,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,9.4,44,101297,1205,1335,372,931,841,166,115959,54273,20772,8618,250,3.1,5,5,4800.0,77777,0,919999999,25,0.1930,0,88,0.097,0.0,0.0 +2014,5,17,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,9.4,44,101297,1122,1335,372,920,939,101,98344,96798,13556,3586,250,3.1,5,5,4800.0,77777,0,919999999,25,0.1930,0,88,0.097,0.0,0.0 +2014,5,17,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,2.8,26,101287,983,1335,369,818,911,99,86524,92581,13643,2616,270,8.2,5,5,4800.0,77777,0,919999999,13,0.1930,0,88,0.097,0.0,0.0 +2014,5,17,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,3.3,27,101307,797,1335,364,673,867,92,82751,52792,11347,4589,230,8.8,3,3,4800.0,77777,0,919999999,13,0.1930,0,88,0.097,0.0,0.0 +2014,5,17,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.3,3.3,27,101307,577,1335,364,496,791,82,59110,43885,9800,3697,230,8.8,3,3,4800.0,77777,0,919999999,13,0.1930,0,88,0.097,0.0,0.0 +2014,5,17,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,3.9,31,101417,337,1335,357,304,654,68,34649,24007,7773,2595,280,5.7,3,3,4800.0,77777,0,919999999,14,0.1930,0,88,0.097,0.0,0.0 +2014,5,17,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,4.4,36,101486,95,1335,349,126,391,41,13365,0,4366,1054,280,5.7,3,3,4800.0,77777,0,919999999,15,0.1930,0,88,0.097,0.0,0.0 +2014,5,17,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,4.4,36,101486,0,552,335,0,0,0,0,0,0,0,280,5.7,0,0,4800.0,77777,9,999999999,15,0.1930,0,88,0.097,0.0,0.0 +2014,5,17,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,1.7,35,101666,0,0,319,0,0,0,0,0,0,0,300,5.7,0,0,4800.0,77777,9,999999999,12,0.1930,0,88,0.097,0.0,0.0 +2014,5,17,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,1.1,36,101706,0,0,314,0,0,0,0,0,0,0,320,5.7,0,0,4800.0,77777,9,999999999,11,0.1930,0,88,0.097,0.0,0.0 +2014,5,17,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.1,1.1,36,101706,0,0,314,0,0,0,0,0,0,0,320,5.7,0,0,4800.0,77777,9,999999999,11,0.1930,0,88,0.097,0.0,0.0 +2014,5,17,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,1.7,42,101745,0,0,320,0,0,0,0,0,0,0,300,5.1,3,3,4800.0,77777,9,999999999,12,0.1930,0,88,0.097,0.0,0.0 +2014,5,18,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,1.7,45,101725,0,0,315,0,0,0,0,0,0,0,300,5.7,3,3,4800.0,77777,9,999999999,12,0.1940,0,88,0.097,0.0,0.0 +2014,5,18,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,1.7,45,101725,0,0,315,0,0,0,0,0,0,0,300,5.7,3,3,4800.0,77777,9,999999999,12,0.1940,0,88,0.097,0.0,0.0 +2014,5,18,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,2.2,50,101765,0,0,311,0,0,0,0,0,0,0,300,5.7,3,3,4800.0,77777,9,999999999,12,0.1940,0,88,0.097,0.0,0.0 +2014,5,18,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,2.2,52,101795,0,0,314,0,0,0,0,0,0,0,300,5.1,5,5,4800.0,77777,9,999999999,12,0.1940,0,88,0.097,0.0,0.0 +2014,5,18,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,2.2,52,101795,18,106,314,0,0,0,0,0,0,0,300,5.1,5,5,4800.0,77777,9,999999999,12,0.1940,0,88,0.097,0.0,0.0 +2014,5,18,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,3.3,56,101885,257,1335,315,46,63,40,5326,982,4641,1550,290,4.6,5,5,4800.0,77777,9,999999999,14,0.1940,0,88,0.097,0.0,0.0 +2014,5,18,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,4.4,57,101905,499,1335,321,184,291,94,21325,15928,10931,3916,280,4.1,5,5,4800.0,77777,9,999999999,15,0.1940,0,88,0.097,0.0,0.0 +2014,5,18,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.8,4.4,57,101905,727,1335,321,404,598,97,48882,36282,11774,4656,280,4.1,5,5,4800.0,77777,9,999999999,15,0.1940,0,88,0.097,0.0,0.0 +2014,5,18,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,6.7,52,101856,926,1335,342,617,828,100,65652,84380,13931,2375,345,2.1,5,5,4800.0,77777,9,999999999,19,0.1940,0,88,0.097,0.0,0.0 +2014,5,18,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,7.8,56,101846,1082,1335,343,775,885,108,82422,90834,14544,3358,90,4.1,5,5,4800.0,77777,9,999999999,21,0.1940,0,88,0.097,0.0,0.0 +2014,5,18,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.7,7.8,56,101846,1185,1335,343,566,295,333,66758,24101,39525,15160,90,4.1,5,5,4800.0,77777,9,999999999,21,0.1940,0,88,0.097,0.0,0.0 +2014,5,18,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,7.2,56,101766,1228,1335,339,530,106,435,61596,9592,50912,18379,130,4.1,5,5,4800.0,77777,9,999999999,20,0.1940,0,88,0.097,0.0,0.0 +2014,5,18,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,7.2,53,101716,1207,1335,342,553,201,371,64889,17101,43821,16452,110,4.6,5,5,4800.0,77777,9,999999999,20,0.1940,0,88,0.097,0.0,0.0 +2014,5,18,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.7,7.2,53,101716,1124,1335,362,292,21,273,34686,1626,32617,12893,110,4.6,9,9,4800.0,77777,9,999999999,20,0.1940,0,88,0.097,0.0,0.0 +2014,5,18,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,6.7,55,101626,985,1335,356,500,244,316,57535,20906,36584,13621,130,3.6,9,9,4800.0,2896,9,999999999,19,0.1940,0,88,0.097,0.0,0.0 +2014,5,18,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,5.0,53,101635,799,1335,348,197,11,188,22930,813,21987,8383,110,4.1,9,9,4800.0,2896,9,999999999,16,0.1940,0,88,0.097,0.0,0.0 +2014,5,18,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,14.4,5.0,53,101635,579,1335,341,251,166,178,28132,12244,20046,6729,110,4.1,8,8,4800.0,2896,9,999999999,16,0.1940,0,88,0.097,0.0,0.0 +2014,5,18,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,5.6,55,101605,340,1335,349,187,283,105,20578,13753,11602,3521,120,2.1,9,9,4800.0,3353,9,999999999,17,0.1940,0,88,0.097,0.0,0.0 +2014,5,18,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,6.7,64,101625,98,1335,326,105,209,56,10859,135,5818,1139,70,2.1,5,5,4800.0,77777,9,999999999,19,0.1940,0,88,0.097,0.0,0.0 +2014,5,18,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,6.7,64,101625,0,575,355,0,0,0,0,0,0,0,70,2.1,10,10,4800.0,77777,9,999999999,19,0.1940,0,88,0.097,0.0,0.0 +2014,5,18,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,6.1,59,101735,0,0,347,0,0,0,0,0,0,0,10,2.6,9,9,4800.0,3048,9,999999999,18,0.1940,0,88,0.097,0.0,0.0 +2014,5,18,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,2.8,41,101696,0,0,364,0,0,0,0,0,0,0,320,4.6,10,10,4800.0,2591,9,999999999,13,0.1940,0,88,0.097,0.0,0.0 +2014,5,18,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.1,2.8,41,101696,0,0,364,0,0,0,0,0,0,0,320,4.6,10,10,4800.0,2591,9,999999999,13,0.1940,0,88,0.097,0.0,0.0 +2014,5,18,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,-1.1,34,101715,0,0,341,0,0,0,0,0,0,0,320,7.2,9,9,4800.0,3353,9,999999999,9,0.1940,0,88,0.097,0.0,0.0 +2014,5,19,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,-0.6,37,101715,0,0,339,0,0,0,0,0,0,0,320,5.7,9,9,4800.0,3353,9,999999999,9,0.1950,0,88,0.097,0.0,0.0 +2014,5,19,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.9,-0.6,37,101715,0,0,302,0,0,0,0,0,0,0,320,5.7,0,0,4800.0,3353,9,999999999,9,0.1950,0,88,0.097,0.0,0.0 +2014,5,19,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,-0.6,41,101745,0,0,308,0,0,0,0,0,0,0,310,5.7,3,3,4800.0,77777,9,999999999,9,0.1950,0,88,0.097,0.0,0.0 +2014,5,19,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,0.6,48,101775,0,0,305,0,0,0,0,0,0,0,300,4.6,3,3,4800.0,77777,9,999999999,10,0.1950,0,88,0.097,0.0,0.0 +2014,5,19,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.1,0.6,48,101775,21,128,305,5,29,5,588,0,588,182,300,4.6,3,3,4800.0,77777,9,999999999,10,0.1950,0,88,0.097,0.0,0.0 +2014,5,19,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,0.0,43,101835,260,1334,296,91,330,34,10694,4838,4002,1356,300,6.7,0,0,4800.0,77777,9,999999999,10,0.1950,0,88,0.097,0.0,0.0 +2014,5,19,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,0.6,42,101815,501,1334,301,248,591,61,29778,28795,7341,2725,320,6.7,0,0,4800.0,77777,9,999999999,10,0.1950,0,88,0.097,0.0,0.0 +2014,5,19,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,0.6,42,101815,729,1334,314,439,758,80,53977,45011,9863,3928,320,6.7,3,3,4800.0,77777,9,999999999,10,0.1950,0,88,0.097,0.0,0.0 +2014,5,19,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,2.2,38,101756,928,1334,331,622,843,94,65842,85430,13122,2339,290,4.1,3,3,4800.0,77777,9,999999999,12,0.1950,0,88,0.097,0.0,0.0 +2014,5,19,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,1.7,35,101696,1084,1334,338,636,543,246,75877,42161,29508,11788,320,5.1,5,5,4800.0,77777,9,999999999,12,0.1950,0,88,0.097,0.0,0.0 +2014,5,19,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.2,1.7,35,101696,1187,1334,358,563,318,312,66906,26128,37304,14457,320,5.1,9,9,4800.0,77777,9,999999999,12,0.1950,0,88,0.097,0.0,0.0 +2014,5,19,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,0.6,31,101606,1229,1334,360,587,227,382,69095,19997,45263,16884,310,7.2,9,9,4800.0,3048,9,999999999,10,0.1950,0,88,0.097,0.0,0.0 +2014,5,19,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,0.0,28,101566,1209,1334,364,582,264,341,68928,22429,40641,15507,310,7.2,9,9,4800.0,3658,9,999999999,10,0.1950,0,88,0.097,0.0,0.0 +2014,5,19,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.9,0.0,28,101566,1126,1334,364,526,145,402,60788,13519,46770,16940,310,7.2,9,9,4800.0,3658,9,999999999,10,0.1950,0,88,0.097,0.0,0.0 +2014,5,19,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,6.1,55,101655,987,1334,363,248,16,234,29238,1223,27734,10967,330,8.8,10,10,4800.0,2134,0,919999999,18,0.1950,0,88,0.097,0.0,0.0 +2014,5,19,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,5.0,48,101636,802,1334,367,118,0,118,12145,0,12254,5729,330,6.2,10,10,4800.0,1981,0,919999999,16,0.1950,0,88,0.097,0.0,0.0 +2014,5,19,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.1,5.0,48,101636,582,1334,367,106,3,105,12401,178,12326,4567,330,6.2,10,10,4800.0,1981,0,919999999,16,0.1950,0,88,0.097,0.0,0.0 +2014,5,19,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,5.0,51,101675,344,1334,361,94,7,93,10462,316,10389,3279,360,6.2,10,10,4800.0,2134,0,919999999,16,0.1950,0,88,0.097,0.0,0.0 +2014,5,19,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,6.1,59,101705,102,1334,357,54,1,53,5630,0,5550,1176,10,7.7,10,10,4800.0,2743,0,919999999,18,0.1950,0,88,0.097,0.0,0.0 +2014,5,19,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.9,6.1,59,101705,0,597,357,0,0,0,0,0,0,0,10,7.7,10,10,4800.0,2743,0,919999999,18,0.1950,0,88,0.097,0.0,0.0 +2014,5,19,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,7.8,77,101715,0,0,348,0,0,0,0,0,0,0,330,4.1,10,10,4800.0,1829,0,919999999,21,0.1950,0,88,0.097,1.0,0.0 +2014,5,19,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,7.8,77,101675,0,0,348,0,0,0,0,0,0,0,330,2.6,10,10,4800.0,1981,0,919999999,21,0.1950,0,88,0.097,0.3,0.0 +2014,5,19,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,7.8,77,101675,0,0,348,0,0,0,0,0,0,0,330,2.6,10,10,4800.0,1981,0,919999999,21,0.1950,0,88,0.097,0.0,0.0 +2014,5,19,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,7.8,74,101535,0,0,351,0,0,0,0,0,0,0,290,4.6,10,10,4800.0,2438,0,919999999,21,0.1950,0,88,0.097,0.0,0.0 +2014,5,20,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,7.8,74,101525,0,0,351,0,0,0,0,0,0,0,290,4.1,10,10,4800.0,1676,0,919999999,21,0.1960,0,88,0.097,0.0,0.0 +2014,5,20,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.2,7.8,74,101525,0,0,351,0,0,0,0,0,0,0,290,4.1,10,10,4800.0,1676,0,919999999,21,0.1960,0,88,0.097,0.0,0.0 +2014,5,20,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,7.2,74,101515,0,0,348,0,0,0,0,0,0,0,280,4.1,10,10,4800.0,3048,0,919999999,20,0.1960,0,88,0.097,0.0,0.0 +2014,5,20,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,6.1,66,101515,0,0,349,0,0,0,0,0,0,0,310,4.6,10,10,4800.0,1402,0,919999999,18,0.1960,0,88,0.097,0.0,0.0 +2014,5,20,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.2,6.1,66,101515,24,149,320,6,0,6,577,0,581,215,310,4.6,5,5,4800.0,1402,0,919999999,18,0.1960,0,88,0.097,0.0,0.0 +2014,5,20,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,6.1,64,101585,263,1334,323,90,322,34,10567,4173,3999,1361,320,4.6,5,5,4800.0,77777,0,919999999,18,0.1960,0,88,0.097,0.0,0.0 +2014,5,20,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,5.6,53,101575,504,1334,332,244,577,61,29269,27137,7334,2730,320,5.7,5,5,4800.0,77777,0,919999999,17,0.1960,0,88,0.097,0.0,0.0 +2014,5,20,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.0,5.6,53,101575,731,1334,332,430,735,81,52762,42428,9966,3977,320,5.7,5,5,4800.0,77777,0,919999999,17,0.1960,0,88,0.097,0.0,0.0 +2014,5,20,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,4.4,38,101496,930,1334,349,611,827,91,64945,84075,12728,2319,320,5.1,5,5,4800.0,77777,0,919999999,15,0.1960,0,88,0.097,0.0,0.0 +2014,5,20,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,3.3,33,101466,1086,1334,353,765,884,96,81025,90216,12993,3186,320,6.7,5,5,4800.0,77777,0,919999999,13,0.1960,0,88,0.097,0.0,0.0 +2014,5,20,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,3.3,33,101466,1188,1334,348,879,914,99,92962,93451,13101,4350,320,6.7,3,3,4800.0,77777,0,919999999,13,0.1960,0,88,0.097,0.0,0.0 +2014,5,20,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,7.8,56,101456,1231,1334,343,942,925,103,100236,95241,13494,5292,130,5.7,5,5,4800.0,77777,0,919999999,21,0.1960,0,88,0.097,0.0,0.0 +2014,5,20,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,7.8,52,101426,1210,1334,348,637,308,356,75009,25644,42193,16000,130,5.7,5,5,4800.0,77777,0,919999999,21,0.1960,0,88,0.097,0.0,0.0 +2014,5,20,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,7.8,52,101426,1128,1334,369,612,219,421,70296,20152,48692,17437,130,5.7,9,9,4800.0,77777,0,919999999,21,0.1960,0,88,0.097,0.0,0.0 +2014,5,20,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,7.8,54,101396,989,1334,366,541,203,377,61395,18684,43066,15257,100,3.6,9,9,4800.0,2591,0,919999999,21,0.1960,0,88,0.097,0.0,0.0 +2014,5,20,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,7.2,52,101386,804,1334,365,472,267,297,52965,23583,33527,11494,100,5.7,9,9,4800.0,2743,0,919999999,20,0.1960,0,88,0.097,0.0,0.0 +2014,5,20,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.2,7.2,52,101386,585,1334,344,450,635,134,51625,40769,15436,5546,100,5.7,5,5,4800.0,2743,0,919999999,20,0.1960,0,88,0.097,0.0,0.0 +2014,5,20,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,7.2,56,101396,347,1334,339,306,648,68,34938,23504,7787,2625,120,3.6,5,5,4800.0,77777,0,919999999,20,0.1960,0,88,0.097,0.0,0.0 +2014,5,20,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,7.8,60,101436,106,1334,338,131,401,43,13934,0,4591,1142,130,2.1,5,5,4800.0,77777,0,919999999,21,0.1960,0,88,0.097,0.0,0.0 +2014,5,20,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.6,7.8,60,101436,0,619,338,0,0,0,0,0,0,0,130,2.1,5,5,4800.0,77777,9,999999999,21,0.1960,0,88,0.097,0.0,0.0 +2014,5,20,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,7.8,60,101516,0,0,332,0,0,0,0,0,0,0,63,0.0,3,3,4800.0,77777,9,999999999,21,0.1960,0,88,0.097,0.0,0.0 +2014,5,20,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,7.2,62,101485,0,0,313,0,0,0,0,0,0,0,210,2.6,0,0,4800.0,77777,9,999999999,20,0.1960,0,88,0.097,0.0,0.0 +2014,5,20,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,14.4,7.2,62,101485,0,0,313,0,0,0,0,0,0,0,210,2.6,0,0,4800.0,77777,9,999999999,20,0.1960,0,88,0.097,0.0,0.0 +2014,5,20,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,7.2,64,101455,0,0,311,0,0,0,0,0,0,0,220,1.5,0,0,4800.0,77777,9,999999999,20,0.1960,0,88,0.097,0.0,0.0 +2014,5,21,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,7.8,72,101445,0,0,306,0,0,0,0,0,0,0,60,2.1,0,0,4800.0,77777,9,999999999,21,0.1970,0,88,0.097,0.0,0.0 +2014,5,21,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.8,7.8,72,101445,0,0,306,0,0,0,0,0,0,0,60,2.1,0,0,4800.0,77777,9,999999999,21,0.1970,0,88,0.097,0.0,0.0 +2014,5,21,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,7.2,71,101425,0,0,303,0,0,0,0,0,0,0,7,0.0,0,0,4800.0,77777,9,999999999,20,0.1970,0,88,0.097,0.0,0.0 +2014,5,21,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,8.3,83,101425,0,0,313,0,0,0,0,0,0,0,30,1.5,3,3,4800.0,77777,9,999999999,22,0.1970,0,88,0.097,0.0,0.0 +2014,5,21,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.1,8.3,83,101425,28,169,313,6,28,5,709,0,591,185,30,1.5,3,3,4800.0,77777,9,999999999,22,0.1970,0,88,0.097,0.0,0.0 +2014,5,21,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,8.9,75,101555,266,1333,328,90,300,36,10518,3875,4215,1433,20,1.5,5,5,4800.0,77777,9,999999999,24,0.1970,0,88,0.097,0.0,0.0 +2014,5,21,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,9.4,69,101545,506,1333,337,242,549,65,28858,25346,7770,2891,80,3.1,5,5,4800.0,77777,9,999999999,25,0.1970,0,88,0.097,0.0,0.0 +2014,5,21,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.0,9.4,69,101545,733,1333,337,428,718,85,52264,40548,10410,4157,80,3.1,5,5,4800.0,77777,9,999999999,25,0.1970,0,88,0.097,0.0,0.0 +2014,5,21,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,10.0,67,101566,932,1333,342,608,811,97,65189,83191,13533,2380,16,3.1,5,5,4800.0,77777,9,999999999,26,0.1970,0,88,0.097,0.0,0.0 +2014,5,21,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,10.6,70,101556,1087,1333,343,761,862,107,81444,88967,14413,3394,120,4.6,5,5,4800.0,77777,9,999999999,28,0.1970,0,88,0.097,0.0,0.0 +2014,5,21,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.1,10.6,70,101556,1190,1333,343,874,886,116,93263,91579,15230,4865,120,4.6,5,5,4800.0,77777,9,999999999,28,0.1970,0,88,0.097,0.0,0.0 +2014,5,21,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,10.6,67,101506,1232,1333,346,936,895,124,99653,92521,16070,6086,130,5.1,5,5,4800.0,77777,9,999999999,28,0.1970,0,88,0.097,0.0,0.0 +2014,5,21,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,10.6,61,101456,1212,1333,354,944,891,128,100425,92056,16629,5652,90,5.1,5,5,4800.0,77777,9,999999999,28,0.1970,0,88,0.097,0.0,0.0 +2014,5,21,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.3,10.6,61,101456,1129,1333,354,898,885,122,95716,91334,16168,4073,90,5.1,5,5,4800.0,77777,9,999999999,28,0.1970,0,88,0.097,0.0,0.0 +2014,5,21,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,10.6,70,101386,991,1333,343,800,857,118,99202,51916,14687,6156,110,5.7,5,5,4800.0,77777,9,999999999,28,0.1970,0,88,0.097,0.0,0.0 +2014,5,21,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,10.6,72,101366,806,1333,341,659,815,107,80018,48511,13037,5273,90,5.7,5,5,4800.0,77777,9,999999999,28,0.1970,0,88,0.097,0.0,0.0 +2014,5,21,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.6,10.6,72,101366,588,1333,341,489,751,91,57772,40589,10785,4071,90,5.7,5,5,4800.0,77777,9,999999999,28,0.1970,0,88,0.097,0.0,0.0 +2014,5,21,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,9.4,67,101386,350,1333,339,302,614,75,34207,23135,8523,2840,110,5.1,5,5,4800.0,77777,9,999999999,25,0.1970,0,88,0.097,0.0,0.0 +2014,5,21,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,10.0,72,101376,109,1333,337,129,362,47,13636,0,4988,1204,100,4.1,5,5,4800.0,77777,9,999999999,26,0.1970,0,88,0.097,0.0,0.0 +2014,5,21,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.0,10.0,72,101376,0,640,337,0,0,0,0,0,0,0,100,4.1,5,5,4800.0,77777,9,999999999,26,0.1970,0,88,0.097,0.0,0.0 +2014,5,21,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,11.1,83,101405,0,0,353,0,0,0,0,0,0,0,110,3.6,9,9,4800.0,7620,9,999999999,30,0.1970,0,88,0.097,0.0,0.0 +2014,5,21,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,11.1,87,101415,0,0,350,0,0,0,0,0,0,0,120,2.1,9,9,4800.0,7620,9,999999999,30,0.1970,0,88,0.097,0.0,0.0 +2014,5,21,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,11.1,87,101415,0,0,350,0,0,0,0,0,0,0,120,2.1,9,9,4800.0,7620,9,999999999,30,0.1970,0,88,0.097,0.0,0.0 +2014,5,21,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,10.0,80,101345,0,0,329,0,0,0,0,0,0,0,100,2.1,5,5,4800.0,77777,9,999999999,27,0.1970,0,88,0.097,0.0,0.0 +2014,5,22,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,10.6,86,101305,0,0,328,0,0,0,0,0,0,0,120,2.1,5,5,4800.0,77777,9,999999999,28,0.1980,0,88,0.097,0.0,0.0 +2014,5,22,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.8,10.6,86,101305,0,0,309,0,0,0,0,0,0,0,120,2.1,0,0,4800.0,77777,9,999999999,28,0.1980,0,88,0.097,0.0,0.0 +2014,5,22,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,10.0,86,101295,0,0,306,0,0,0,0,0,0,0,110,2.1,0,0,4800.0,77777,9,999999999,27,0.1980,0,88,0.097,0.0,0.0 +2014,5,22,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,10.0,89,101255,0,0,304,0,0,0,0,0,0,0,140,1.5,0,0,4800.0,77777,9,999999999,27,0.1980,0,88,0.097,0.0,0.0 +2014,5,22,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,10.0,89,101255,31,188,322,6,30,5,710,0,592,186,140,1.5,5,5,4800.0,77777,0,999999999,27,0.1980,0,88,0.097,0.0,0.0 +2014,5,22,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,11.0,10.0,94,101280,268,1332,317,52,75,43,5995,1176,4969,1668,90,3.1,4,4,402.0,30,0,999999999,27,0.1980,0,88,0.097,0.0,0.0 +2014,5,22,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,11.0,10.0,94,101280,509,1332,347,93,70,85,10864,3529,9961,3639,90,2.6,10,10,402.0,30,0,999999999,27,0.1980,0,88,0.097,0.0,0.0 +2014,5,22,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,10.6,10.6,100,101295,735,1332,346,296,224,178,34133,15721,20623,7714,70,1.5,10,10,1600.0,30,0,999999999,28,0.1980,0,88,0.097,0.0,0.0 +2014,5,22,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,11.7,10.0,89,101315,933,1332,351,423,236,277,48722,19027,32090,12096,70,5.1,10,10,402.0,61,0,999999999,27,0.1980,0,88,0.097,0.0,0.0 +2014,5,22,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.0,10.0,82,101280,1089,1332,347,605,386,305,70813,30868,35916,13899,80,5.1,9,9,3219.0,122,0,999999999,27,0.1980,0,88,0.097,0.0,0.0 +2014,5,22,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,13.3,10.6,84,101265,1191,1332,359,593,235,398,68951,20248,46594,17183,80,5.7,10,10,3200.0,122,0,999999999,28,0.1980,0,88,0.097,0.0,0.0 +2014,5,22,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,10.6,80,101195,1233,1332,353,667,248,442,77372,22079,51639,18606,80,7.2,9,9,3200.0,3048,0,999999999,28,0.1980,0,88,0.097,0.0,0.0 +2014,5,22,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,10.6,86,101235,1213,1332,357,347,71,281,41577,5292,33869,13415,70,5.7,10,10,3200.0,1036,0,919999999,28,0.1980,0,88,0.097,0.0,0.0 +2014,5,22,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.8,10.6,86,101235,1131,1332,347,231,15,217,27914,1046,26360,10745,70,5.7,9,9,3200.0,1036,0,919999999,28,0.1980,0,88,0.097,0.0,0.0 +2014,5,22,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.0,11.0,94,101280,993,1332,344,110,1,109,13722,59,13645,5734,90,4.6,9,9,3200.0,853,0,919999999,29,0.1980,0,88,0.097,0.0,0.0 +2014,5,22,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,12.2,87,101156,809,1332,367,233,19,221,26730,1416,25487,9517,180,3.6,10,10,3200.0,1829,0,919999999,33,0.1980,0,88,0.097,0.0,0.0 +2014,5,22,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,14.4,12.2,87,101156,590,1332,357,275,128,209,30384,9701,23214,7513,180,3.6,9,9,3200.0,1829,0,919999999,33,0.1980,0,88,0.097,0.0,0.0 +2014,5,22,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,11.1,83,101165,353,1332,353,188,111,136,20270,6261,14733,4134,150,2.6,9,9,3200.0,1463,0,919999999,30,0.1980,0,88,0.097,0.0,0.0 +2014,5,22,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,11.1,83,101185,113,1332,333,66,17,60,6842,40,6249,1290,120,2.1,5,5,3200.0,77777,0,919999999,30,0.1980,0,88,0.097,0.0,0.0 +2014,5,22,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.9,11.1,83,101185,0,661,353,0,0,0,0,0,0,0,120,2.1,9,9,3200.0,77777,9,999999999,30,0.1980,0,88,0.097,7.0,0.0 +2014,5,22,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.0,12.0,94,101280,0,0,360,0,0,0,0,0,0,0,70,1.5,10,10,3200.0,975,9,999999999,32,0.1980,0,88,0.097,0.0,0.0 +2014,5,22,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,10.6,90,101155,0,0,344,0,0,0,0,0,0,0,100,3.6,9,9,3200.0,1676,9,999999999,28,0.1980,0,88,0.097,0.0,0.0 +2014,5,22,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.2,10.6,90,101155,0,0,344,0,0,0,0,0,0,0,100,3.6,9,9,3200.0,1676,9,999999999,28,0.1980,0,88,0.097,0.0,0.0 +2014,5,22,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.0,11.0,94,101280,0,0,344,0,0,0,0,0,0,0,130,2.1,9,9,3200.0,732,9,999999999,29,0.1980,0,88,0.097,0.0,0.0 +2014,5,23,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.0,11.0,88,101280,0,0,358,0,0,0,0,0,0,0,150,2.1,10,10,3200.0,671,0,919999999,29,0.1980,0,88,0.097,0.0,0.0 +2014,5,23,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.8,11.7,93,101155,0,0,358,0,0,0,0,0,0,0,150,2.1,10,10,3200.0,671,0,919999999,31,0.1980,0,88,0.097,0.0,0.0 +2014,5,23,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,11.1,93,101145,0,0,355,0,0,0,0,0,0,0,180,3.1,10,10,3200.0,610,0,919999999,30,0.1980,0,88,0.097,0.0,0.0 +2014,5,23,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,12.0,12.0,100,101280,0,0,345,0,0,0,0,0,0,0,180,2.1,9,9,9656.0,335,0,919999999,32,0.1980,0,88,0.097,0.0,0.0 +2014,5,23,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.2,11.7,97,101185,34,207,346,5,8,5,593,0,593,187,151,0.0,9,9,9656.0,335,0,919999999,31,0.1980,0,88,0.097,0.0,0.0 +2014,5,23,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,12.0,11.0,94,101280,271,1332,353,43,39,39,4998,540,4542,1542,100,2.6,10,10,8047.0,366,0,919999999,29,0.1980,0,88,0.097,0.0,0.0 +2014,5,23,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.0,12.0,100,101280,511,1332,355,54,39,50,6567,1617,6092,2296,80,1.5,10,10,8047.0,183,0,919999999,32,0.1980,0,88,0.097,0.0,0.0 +2014,5,23,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.2,11.1,93,101255,737,1332,355,217,79,174,25071,5469,20197,7594,100,1.5,10,10,8047.0,183,0,919999999,30,0.1980,0,88,0.097,0.0,0.0 +2014,5,23,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.0,11.0,94,101280,935,1332,344,168,18,159,20200,1180,19202,7844,100,4.1,9,9,8047.0,945,0,919999999,29,0.1980,0,88,0.097,0.0,0.0 +2014,5,23,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,10.0,86,101345,1090,1332,344,196,7,191,23787,476,23294,9598,100,3.1,9,9,8047.0,1128,0,919999999,27,0.1980,0,88,0.097,0.0,0.0 +2014,5,23,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.2,10.0,86,101345,1192,1332,344,386,38,352,45342,3119,41617,15809,100,3.1,9,9,8047.0,1128,0,919999999,27,0.1980,0,88,0.097,0.0,0.0 +2014,5,23,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,10.0,80,101335,1235,1332,349,378,29,351,44671,2347,41751,15935,80,4.6,9,9,8047.0,1372,0,919999999,27,0.1980,0,88,0.097,0.0,0.0 +2014,5,23,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,10.0,80,101335,1214,1332,349,335,20,315,39812,1561,37668,14650,70,5.1,9,9,8047.0,1494,0,919999999,27,0.1980,0,88,0.097,0.0,0.0 +2014,5,23,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,10.0,80,101335,1132,1332,349,289,15,275,34316,1139,32844,12993,70,5.1,9,9,8047.0,1494,0,919999999,27,0.1980,0,88,0.097,0.0,0.0 +2014,5,23,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,8.9,80,101325,995,1332,352,204,9,196,24386,634,23544,9554,70,5.7,10,10,8047.0,1097,0,919999999,24,0.1980,0,88,0.097,0.0,0.0 +2014,5,23,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,8.3,77,101345,811,1332,351,195,5,191,22689,363,22331,8554,70,5.7,10,10,8047.0,1097,0,919999999,22,0.1980,0,88,0.097,0.0,0.0 +2014,5,23,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.2,8.3,77,101345,593,1332,351,112,0,112,11309,0,11404,4853,70,5.7,10,10,8047.0,1097,0,919999999,22,0.1980,0,88,0.097,0.0,0.0 +2014,5,23,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.0,9.0,82,101280,356,1332,341,95,0,95,9394,0,9466,3389,60,5.1,9,9,8047.0,1067,0,919999999,24,0.1980,0,88,0.097,0.0,0.0 +2014,5,23,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,8.9,83,101405,116,1332,350,42,0,42,4066,0,4095,1189,60,5.7,10,10,8047.0,2134,0,919999999,24,0.1980,0,88,0.097,0.0,0.0 +2014,5,23,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,8.9,83,101405,0,682,350,0,0,0,0,0,0,0,60,5.7,10,10,8047.0,2134,9,999999999,24,0.1980,0,88,0.097,1.0,0.0 +2014,5,23,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.0,9.0,87,101280,0,0,346,0,0,0,0,0,0,0,40,4.6,10,10,8047.0,274,9,999999999,24,0.1980,0,88,0.097,0.0,0.0 +2014,5,23,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.0,9.0,87,101280,0,0,346,0,0,0,0,0,0,0,20,4.1,10,10,8047.0,335,9,999999999,24,0.1980,0,88,0.097,0.0,0.0 +2014,5,23,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.1,8.9,86,101515,0,0,337,0,0,0,0,0,0,0,30,2.6,9,9,8047.0,335,9,999999999,24,0.1980,0,88,0.097,0.0,0.0 +2014,5,23,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.0,9.0,87,101280,0,0,346,0,0,0,0,0,0,0,10,2.6,10,10,8047.0,671,9,999999999,24,0.1980,0,88,0.097,0.0,0.0 +2014,5,24,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,8.9,86,101395,0,0,347,0,0,0,0,0,0,0,20,3.1,10,10,8047.0,1981,9,999999999,24,0.1990,0,88,0.097,0.0,0.0 +2014,5,24,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.1,8.9,86,101395,0,0,347,0,0,0,0,0,0,0,20,3.1,10,10,8047.0,1981,9,999999999,24,0.1990,0,88,0.097,0.0,0.0 +2014,5,24,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.0,9.0,87,101280,0,0,346,0,0,0,0,0,0,0,10,3.1,10,10,8047.0,305,9,999999999,24,0.1990,0,88,0.097,0.0,0.0 +2014,5,24,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,9.4,86,101475,0,0,350,0,0,0,0,0,0,0,10,3.1,10,10,8047.0,1829,9,999999999,25,0.1990,0,88,0.097,0.0,0.0 +2014,5,24,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,9.4,86,101475,37,225,340,2,0,2,192,0,193,80,10,3.1,9,9,8047.0,1829,9,999999999,25,0.1990,0,88,0.097,0.0,0.0 +2014,5,24,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,8.9,83,101565,273,1331,340,11,0,11,1080,0,1088,485,10,5.1,9,9,8047.0,1829,9,999999999,24,0.1990,0,88,0.097,0.0,0.0 +2014,5,24,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,8.3,77,101635,513,1331,351,42,0,42,4212,0,4246,1960,360,4.1,10,10,8047.0,1981,9,999999999,22,0.1990,0,88,0.097,0.0,0.0 +2014,5,24,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.2,8.3,77,101635,739,1331,351,115,1,114,13756,62,13686,5393,360,4.1,10,10,8047.0,1981,0,919999999,22,0.1990,0,88,0.097,0.0,0.0 +2014,5,24,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,7.8,67,101695,936,1331,349,207,14,198,24519,1010,23569,9408,10,4.1,9,9,8047.0,2134,0,919999999,21,0.1990,0,88,0.097,0.0,0.0 +2014,5,24,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,8.3,69,101705,1091,1331,350,519,261,308,60782,21181,36291,14012,60,4.1,9,9,8047.0,2134,0,919999999,22,0.1990,0,88,0.097,0.0,0.0 +2014,5,24,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.9,8.3,69,101705,1193,1331,350,592,210,409,68800,18571,47860,17507,60,4.1,9,9,8047.0,2134,0,919999999,22,0.1990,0,88,0.097,0.0,0.0 +2014,5,24,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,6.1,55,101685,1236,1331,353,613,186,445,71255,17037,52095,18703,90,5.1,9,9,8047.0,2438,0,919999999,18,0.1990,0,88,0.097,0.0,0.0 +2014,5,24,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,7.2,57,101646,1216,1331,357,730,386,375,85722,32869,44328,16623,100,5.1,9,9,8047.0,3658,0,919999999,20,0.1990,0,88,0.097,0.0,0.0 +2014,5,24,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.6,7.2,57,101646,1134,1331,357,726,389,381,84175,34243,44468,16423,100,5.1,9,9,8047.0,3658,0,919999999,20,0.1990,0,88,0.097,0.0,0.0 +2014,5,24,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,8.3,69,101555,997,1331,350,756,729,181,90976,50347,21884,8951,120,3.6,9,9,8047.0,7620,0,919999999,22,0.1990,0,88,0.097,0.0,0.0 +2014,5,24,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,8.3,67,101535,813,1331,352,562,506,196,65285,37099,22880,8737,80,3.1,9,9,8047.0,7620,0,919999999,22,0.1990,0,88,0.097,0.0,0.0 +2014,5,24,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,14.4,8.3,67,101535,595,1331,352,488,719,101,57353,41341,11911,4468,80,3.1,9,9,8047.0,7620,0,919999999,22,0.1990,0,88,0.097,0.0,0.0 +2014,5,24,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,7.8,72,101645,359,1331,344,305,595,81,34456,24556,9181,3041,110,5.1,9,9,8047.0,8534,0,919999999,21,0.1990,0,88,0.097,0.0,0.0 +2014,5,24,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,8.3,74,101695,119,1331,354,134,364,49,14230,0,5224,1292,100,4.6,10,10,8047.0,1829,0,919999999,22,0.1990,0,88,0.097,0.0,0.0 +2014,5,24,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.8,8.3,74,101695,0,702,354,0,0,0,0,0,0,0,100,4.6,10,10,8047.0,1829,0,919999999,22,0.1990,0,88,0.098,0.0,0.0 +2014,5,24,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,9.4,86,101745,0,0,340,0,0,0,0,0,0,0,110,1.5,9,9,8047.0,3353,0,919999999,25,0.1990,0,88,0.098,4.6,0.0 +2014,5,24,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,10.0,89,101735,0,0,341,0,0,0,0,0,0,0,110,1.5,9,9,8047.0,2438,0,919999999,27,0.1990,0,88,0.098,0.0,0.0 +2014,5,24,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,10.0,89,101735,0,0,351,0,0,0,0,0,0,0,110,1.5,10,10,8047.0,2438,0,919999999,27,0.1990,0,88,0.098,0.0,0.0 +2014,5,24,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,10.0,89,101695,0,0,341,0,0,0,0,0,0,0,259,0.0,9,9,8047.0,2743,0,919999999,27,0.1990,0,88,0.098,0.0,0.0 +2014,5,25,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,10.0,89,101655,0,0,341,0,0,0,0,0,0,0,287,0.0,9,9,8047.0,2743,0,919999999,27,0.2000,0,88,0.098,0.0,0.0 +2014,5,25,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,10.0,89,101655,0,0,322,0,0,0,0,0,0,0,335,0.0,5,5,8047.0,2743,0,919999999,27,0.2000,0,88,0.098,0.0,0.0 +2014,5,25,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.0,9.0,87,101280,0,0,346,0,0,0,0,0,0,0,13,0.0,10,10,8047.0,427,0,919999999,24,0.2000,0,88,0.098,0.0,0.0 +2014,5,25,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.0,10.0,94,101280,0,0,347,0,0,0,0,0,0,0,40,1.5,10,10,8047.0,396,0,919999999,27,0.2000,0,88,0.098,0.0,0.0 +2014,5,25,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,10.0,89,101685,39,242,351,7,28,6,825,0,707,223,70,1.5,10,10,8047.0,396,0,919999999,27,0.2000,0,88,0.098,0.0,0.0 +2014,5,25,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,10.6,93,101775,276,1331,352,41,63,34,4826,812,4009,1378,130,1.5,10,10,8047.0,274,0,919999999,28,0.2000,0,88,0.098,0.0,0.0 +2014,5,25,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.0,11.0,94,101280,515,1331,353,82,63,74,9693,3003,8772,3254,150,1.5,10,10,8047.0,305,0,919999999,29,0.2000,0,88,0.098,0.0,0.0 +2014,5,25,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.2,10.6,90,101825,741,1331,354,177,17,167,20537,1164,19465,7378,168,0.0,10,10,8047.0,305,0,919999999,28,0.2000,0,88,0.098,0.0,0.0 +2014,5,25,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,10.0,80,101865,938,1331,359,226,17,215,26578,1240,25415,10051,80,2.1,10,10,8047.0,366,0,919999999,27,0.2000,0,88,0.098,0.0,0.0 +2014,5,25,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,10.0,77,101885,1092,1331,362,299,26,279,35267,2006,33100,13028,60,2.1,10,10,8047.0,488,0,919999999,27,0.2000,0,88,0.098,0.0,0.0 +2014,5,25,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.9,10.0,77,101885,1195,1331,352,632,457,223,76914,31850,27284,11095,60,2.1,9,9,8047.0,488,0,919999999,27,0.2000,0,88,0.098,0.0,0.0 +2014,5,25,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.0,11.0,72,101281,1237,1331,338,791,663,176,98471,42512,22016,9104,100,3.1,3,3,8047.0,77777,0,919999999,29,0.2000,0,88,0.098,0.0,0.0 +2014,5,25,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,10.6,72,101805,1217,1331,336,941,880,131,100032,90912,16968,5921,110,5.1,3,3,8047.0,77777,0,919999999,28,0.2000,0,88,0.098,0.0,0.0 +2014,5,25,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.6,10.6,72,101805,1135,1331,341,897,869,129,95448,89655,17011,4288,110,5.1,5,5,8047.0,77777,0,919999999,28,0.2000,0,88,0.098,0.0,0.0 +2014,5,25,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,10.0,67,101676,998,1331,342,800,844,123,99053,51879,15288,6405,110,6.7,5,5,8047.0,77777,0,919999999,26,0.2000,0,88,0.098,0.0,0.0 +2014,5,25,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,10.0,65,101656,815,1331,345,661,801,113,80086,48659,13740,5556,100,5.7,5,5,8047.0,77777,0,919999999,26,0.2000,0,88,0.098,0.0,0.0 +2014,5,25,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.7,10.0,65,101656,598,1331,345,497,759,90,58919,41379,10703,4062,100,5.7,5,5,8047.0,77777,0,919999999,26,0.2000,0,88,0.098,0.0,0.0 +2014,5,25,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,11.7,75,101596,362,1331,344,313,641,72,35656,23354,8227,2792,130,3.1,5,5,8047.0,77777,0,919999999,31,0.2000,0,88,0.098,0.0,0.0 +2014,5,25,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,11.7,67,101626,123,1331,353,139,408,46,14846,0,4931,1278,200,4.1,5,5,8047.0,77777,0,919999999,31,0.2000,0,88,0.098,0.0,0.0 +2014,5,25,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,11.7,67,101626,0,722,353,0,0,0,0,0,0,0,200,4.1,5,5,8047.0,77777,9,999999999,31,0.2000,0,88,0.098,0.0,0.0 +2014,5,25,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,11.7,78,101666,0,0,337,0,0,0,0,0,0,0,180,3.6,3,3,8047.0,77777,9,999999999,31,0.2000,0,88,0.098,0.0,0.0 +2014,5,25,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,11.7,84,101635,0,0,336,0,0,0,0,0,0,0,210,3.1,5,5,8047.0,77777,9,999999999,31,0.2000,0,88,0.098,0.0,0.0 +2014,5,25,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,14.4,11.7,84,101635,0,0,336,0,0,0,0,0,0,0,210,3.1,5,5,8047.0,77777,9,999999999,31,0.2000,0,88,0.098,0.0,0.0 +2014,5,25,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,11.1,87,101525,0,0,331,0,0,0,0,0,0,0,220,4.1,5,5,8047.0,77777,9,999999999,30,0.2000,0,88,0.098,0.0,0.0 +2014,5,26,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,10.6,84,101465,0,0,312,0,0,0,0,0,0,0,220,4.1,0,0,8047.0,77777,9,999999999,28,0.2010,0,88,0.098,0.0,0.0 +2014,5,26,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,10.6,84,101465,0,0,325,0,0,0,0,0,0,0,220,4.1,3,3,8047.0,77777,9,999999999,28,0.2010,0,88,0.098,0.0,0.0 +2014,5,26,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,10.6,84,101395,0,0,330,0,0,0,0,0,0,0,210,4.1,5,5,8047.0,77777,9,999999999,28,0.2010,0,88,0.098,0.0,0.0 +2014,5,26,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,10.6,86,101375,0,0,328,0,0,0,0,0,0,0,220,4.1,5,5,8047.0,77777,9,999999999,28,0.2010,0,88,0.098,0.0,0.0 +2014,5,26,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.8,10.6,86,101375,42,258,328,6,0,6,576,0,580,224,220,4.1,5,5,8047.0,77777,9,999999999,28,0.2010,0,88,0.098,0.0,0.0 +2014,5,26,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,10.0,63,101386,278,1331,368,17,30,13,2153,157,1646,571,250,5.7,9,9,8047.0,4267,9,999999999,26,0.2010,0,88,0.098,0.0,0.0 +2014,5,26,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,11.1,67,101386,517,1331,380,44,30,40,5451,1207,4963,1878,250,5.7,10,10,8047.0,2134,9,999999999,29,0.2010,0,88,0.098,0.0,0.0 +2014,5,26,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.2,11.1,67,101386,742,1331,380,71,0,71,7249,0,7313,3548,250,5.7,10,10,8047.0,2134,9,999999999,29,0.2010,0,88,0.098,0.0,0.0 +2014,5,26,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,12.2,72,101266,939,1331,381,126,1,125,15429,61,15366,6381,240,7.7,10,10,8047.0,2896,0,919999999,33,0.2010,0,88,0.098,0.0,0.0 +2014,5,26,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,12.2,61,101206,1094,1331,396,472,227,286,55508,17347,33834,13278,250,5.7,10,10,8047.0,3353,0,919999999,33,0.2010,0,88,0.098,0.0,0.0 +2014,5,26,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,12.2,61,101206,1196,1331,385,662,359,344,77856,28642,40719,15570,250,5.7,9,9,8047.0,3353,0,919999999,33,0.2010,0,88,0.098,0.0,0.0 +2014,5,26,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,11.1,43,101097,1238,1331,419,645,253,418,75196,21835,49073,17991,260,6.7,10,10,8047.0,4877,0,919999999,29,0.2010,0,88,0.098,0.0,0.0 +2014,5,26,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,12.8,53,101047,1218,1331,413,472,110,371,55334,8947,43785,16513,260,6.2,10,10,8047.0,4267,0,919999999,34,0.2010,0,88,0.098,0.0,0.0 +2014,5,26,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.8,12.8,53,101047,1137,1331,413,572,178,417,65684,15694,48219,17408,260,6.2,10,10,8047.0,4267,0,919999999,34,0.2010,0,88,0.098,0.0,0.0 +2014,5,26,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,11.1,40,100927,1000,1331,426,525,180,383,59524,16266,43715,15528,260,7.2,10,10,8047.0,4877,0,919999999,29,0.2010,0,88,0.098,0.0,0.0 +2014,5,26,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,11.1,39,100887,817,1331,429,407,136,312,45516,11936,35107,11982,260,7.7,10,10,8047.0,4877,0,919999999,29,0.2010,0,88,0.098,0.0,0.0 +2014,5,26,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,26.1,11.1,39,100887,600,1331,429,294,126,229,32336,10103,25326,8003,260,7.7,10,10,8047.0,4877,0,919999999,29,0.2010,0,88,0.098,0.0,0.0 +2014,5,26,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,12.8,47,100837,365,1331,413,186,99,144,20011,5758,15568,4351,230,5.1,9,9,8047.0,4877,0,919999999,34,0.2010,0,88,0.098,0.0,0.0 +2014,5,26,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,13.9,54,100867,126,1331,409,82,46,65,8504,241,6772,1433,220,4.6,9,9,8047.0,3353,0,919999999,38,0.2010,0,88,0.098,0.0,0.0 +2014,5,26,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.9,13.9,54,100867,0,742,409,0,0,0,0,0,0,0,220,4.6,9,9,8047.0,3353,9,999999999,38,0.2010,0,88,0.098,0.0,0.0 +2014,5,26,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,13.9,57,100897,0,0,414,0,0,0,0,0,0,0,210,3.6,10,10,8047.0,3658,9,999999999,38,0.2010,0,88,0.098,0.0,0.0 +2014,5,26,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,13.3,57,100887,0,0,399,0,0,0,0,0,0,0,230,3.1,9,9,8047.0,3353,9,999999999,36,0.2010,0,88,0.098,0.0,0.0 +2014,5,26,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,13.3,57,100887,0,0,399,0,0,0,0,0,0,0,230,3.1,9,9,8047.0,3353,9,999999999,36,0.2010,0,88,0.098,0.0,0.0 +2014,5,26,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,11.7,48,100877,0,0,402,0,0,0,0,0,0,0,270,4.1,9,9,8047.0,3048,9,999999999,31,0.2010,0,88,0.098,0.0,0.0 +2014,5,27,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,11.7,50,100867,0,0,377,0,0,0,0,0,0,0,280,3.6,5,5,8047.0,77777,9,999999999,31,0.2020,0,88,0.098,0.0,0.0 +2014,5,27,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.8,11.7,50,100867,0,0,372,0,0,0,0,0,0,0,280,3.6,3,3,8047.0,77777,9,999999999,31,0.2020,0,88,0.098,0.0,0.0 +2014,5,27,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,12.2,63,100886,0,0,382,0,0,0,0,0,0,0,40,1.5,9,9,8047.0,3353,9,999999999,33,0.2020,0,88,0.098,0.0,0.0 +2014,5,27,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,12.8,70,100866,0,0,377,0,0,0,0,0,0,0,299,0.0,9,9,8047.0,3353,9,999999999,35,0.2020,0,88,0.098,0.0,0.0 +2014,5,27,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.3,12.8,70,100866,45,274,377,6,0,6,576,0,580,225,308,0.0,9,9,8047.0,3353,9,999999999,35,0.2020,0,88,0.098,0.0,0.0 +2014,5,27,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,13.3,75,101006,280,1330,375,72,128,47,8262,2174,5406,1818,70,2.1,9,9,8047.0,5791,9,999999999,37,0.2020,0,88,0.098,0.0,0.0 +2014,5,27,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,12.8,57,101027,518,1330,395,193,253,105,22191,13510,12117,4352,30,3.6,9,9,8047.0,8534,9,999999999,35,0.2020,0,88,0.098,0.0,0.0 +2014,5,27,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,12.8,57,101027,744,1330,406,343,335,173,39659,22735,20097,7599,30,3.6,10,10,8047.0,8534,9,999999999,35,0.2020,0,88,0.098,0.0,0.0 +2014,5,27,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,16.0,13.0,82,101281,940,1330,376,465,318,264,53742,24439,30686,11748,60,7.2,10,10,1609.0,3658,0,999999999,36,0.2020,0,88,0.098,0.0,0.0 +2014,5,27,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.3,11.7,90,101265,1095,1330,351,566,295,344,65639,24414,40150,15166,70,7.7,9,9,402.0,61,0,999999999,31,0.2020,0,88,0.098,0.0,0.0 +2014,5,27,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.3,11.7,90,101265,1197,1330,361,507,144,387,59109,12122,45425,16904,70,7.7,10,10,400.0,120,0,999999999,31,0.2020,0,88,0.098,0.0,0.0 +2014,5,27,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.3,11.1,87,101265,1239,1330,360,451,82,378,53005,6772,44725,16819,90,6.7,10,10,402.0,61,0,999999999,30,0.2020,0,88,0.098,0.0,0.0 +2014,5,27,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.0,11.0,88,101280,1219,1330,358,376,26,352,44318,2099,41761,15918,80,7.2,10,10,4828.0,122,0,999999999,29,0.2020,0,88,0.098,0.0,0.0 +2014,5,27,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,12.8,10.0,83,101295,1138,1330,356,380,32,351,44319,2667,41202,15567,70,7.7,10,10,4800.0,122,0,999999999,27,0.2020,0,88,0.098,0.0,0.0 +2014,5,27,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,8.9,77,101245,1002,1330,355,214,10,205,25525,714,24575,9941,70,7.2,10,10,4800.0,396,0,999999999,24,0.2020,0,88,0.098,0.0,0.0 +2014,5,27,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.0,8.0,76,101280,819,1330,350,224,11,216,25857,838,25061,9437,70,6.7,10,10,4800.0,457,0,999999999,22,0.2020,0,88,0.098,0.0,0.0 +2014,5,27,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,8.3,80,101255,603,1330,349,130,5,127,15030,313,14742,5406,70,6.7,10,10,4800.0,457,0,999999999,22,0.2020,0,88,0.098,0.0,0.0 +2014,5,27,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,11.0,9.0,87,101280,367,1330,346,110,10,106,12181,490,11785,3705,80,5.1,10,10,8047.0,274,0,999999999,24,0.2020,0,88,0.098,0.0,0.0 +2014,5,27,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,10.6,8.9,89,101305,129,1330,344,41,6,40,4457,0,4363,1218,60,7.2,10,10,8047.0,213,0,919999999,24,0.2020,0,88,0.098,0.0,0.0 +2014,5,27,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,10.6,8.9,89,101305,0,761,344,0,0,0,0,0,0,0,60,7.2,10,10,8000.0,213,0,919999999,24,0.2020,0,88,0.098,5.0,0.0 +2014,5,27,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,10.0,8.3,89,101425,0,0,341,0,0,0,0,0,0,0,50,5.1,10,10,6437.0,274,0,919999999,23,0.2020,0,88,0.098,5.0,0.0 +2014,5,27,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,10.0,8.0,87,101280,0,0,340,0,0,0,0,0,0,0,60,6.2,10,10,2816.0,274,0,019999999,22,0.2020,0,88,0.098,4.0,0.0 +2014,5,27,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.0,8.3,89,101375,0,0,341,0,0,0,0,0,0,0,50,6.2,10,10,2816.0,274,0,019999999,23,0.2020,0,88,0.098,0.0,0.0 +2014,5,27,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,8.3,89,101345,0,0,341,0,0,0,0,0,0,0,50,6.7,10,10,2816.0,274,0,019999999,23,0.2020,0,88,0.098,0.0,0.0 +2014,5,28,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,8.3,89,101325,0,0,341,0,0,0,0,0,0,0,50,6.7,10,10,2816.0,274,0,019999999,23,0.2030,0,88,0.098,0.0,0.0 +2014,5,28,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.0,8.3,89,101325,0,0,341,0,0,0,0,0,0,0,50,6.7,10,10,2816.0,274,0,019999999,23,0.2030,0,88,0.098,0.0,0.0 +2014,5,28,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,10.0,8.0,87,101280,0,0,340,0,0,0,0,0,0,0,40,4.6,10,10,4023.0,213,0,019999999,22,0.2030,0,88,0.098,0.0,0.0 +2014,5,28,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,10.0,8.0,87,101280,0,0,340,0,0,0,0,0,0,0,40,6.2,10,10,4828.0,152,0,019999999,22,0.2030,0,88,0.098,0.0,0.0 +2014,5,28,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.0,8.3,89,101305,47,289,341,0,0,0,0,0,0,0,60,8.2,10,10,4828.0,152,0,019999999,23,0.2030,0,88,0.098,0.0,0.0 +2014,5,28,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,10.0,9.0,93,101280,282,1330,341,7,0,7,688,0,693,315,50,6.2,10,10,3219.0,213,0,019999999,24,0.2030,0,88,0.098,0.0,0.0 +2014,5,28,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,10.0,8.9,93,101495,520,1330,341,19,0,19,1906,0,1922,928,50,7.2,10,10,4023.0,213,0,019999999,24,0.2030,0,88,0.098,0.0,0.0 +2014,5,28,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,10.0,8.9,93,101495,745,1330,341,77,0,77,7874,0,7944,3826,50,7.2,10,10,4000.0,213,0,019999999,24,0.2030,0,88,0.098,0.0,0.0 +2014,5,28,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,10.0,9.0,93,101280,941,1330,341,150,14,141,18242,903,17218,7098,50,7.2,10,10,2414.0,213,0,019999999,24,0.2030,0,88,0.098,0.0,0.0 +2014,5,28,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,10.0,9.0,93,101280,1096,1330,341,152,14,143,18879,889,17836,7473,60,8.2,10,10,2816.0,152,0,019999999,24,0.2030,0,88,0.098,0.0,0.0 +2014,5,28,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,10.0,8.3,89,101705,1198,1330,341,147,3,144,18503,189,18203,7591,50,6.7,10,10,4000.0,152,0,019999999,23,0.2030,0,88,0.098,0.0,0.0 +2014,5,28,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,10.0,8.0,87,101280,1240,1330,340,144,2,143,18236,126,18187,7570,50,9.3,10,10,4023.0,488,0,019999999,22,0.2030,0,88,0.098,0.0,0.0 +2014,5,28,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,9.4,7.2,86,101894,1220,1330,336,152,4,148,19159,255,18737,7795,50,10.3,10,10,4023.0,366,0,019999999,20,0.2030,0,88,0.098,0.0,0.0 +2014,5,28,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,9.4,7.2,86,101894,1140,1330,336,115,1,115,14609,61,14664,6161,50,10.3,10,10,4000.0,366,0,019999999,20,0.2030,0,88,0.098,0.0,0.0 +2014,5,28,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,8.9,7.2,89,102034,1003,1330,334,133,1,133,16408,64,16473,6878,40,8.2,10,10,4828.0,305,0,019999999,20,0.2030,0,88,0.098,0.0,0.0 +2014,5,28,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,6.1,83,102064,821,1330,333,128,0,128,13192,0,13312,6210,50,7.2,10,10,4828.0,305,0,019999999,18,0.2030,0,88,0.098,0.0,0.0 +2014,5,28,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.9,6.1,83,102064,605,1330,333,85,0,85,8602,0,8674,3886,50,7.2,10,10,4828.0,305,0,019999999,18,0.2030,0,88,0.098,0.0,0.0 +2014,5,28,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,6.1,86,102124,370,1330,330,43,0,43,4264,0,4297,1831,50,6.7,10,10,4828.0,305,0,019999999,18,0.2030,0,88,0.098,0.0,0.0 +2014,5,28,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,5.6,83,102174,132,1330,329,49,97,39,5357,0,4277,1212,50,6.2,10,10,4828.0,427,0,019999999,17,0.2030,0,88,0.098,0.0,0.0 +2014,5,28,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.3,5.6,83,102174,0,780,320,0,0,0,0,0,0,0,50,6.2,9,9,4828.0,427,9,999999999,17,0.2030,0,88,0.098,0.0,0.0 +2014,5,28,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.0,4.0,76,101280,0,0,295,0,0,0,0,0,0,0,30,5.1,3,3,4828.0,77777,9,999999999,15,0.2030,0,88,0.098,0.0,0.0 +2014,5,28,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,3.9,76,102274,0,0,282,0,0,0,0,0,0,0,340,2.6,0,0,4828.0,77777,9,999999999,15,0.2030,0,88,0.098,0.0,0.0 +2014,5,28,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.8,3.9,76,102274,0,0,282,0,0,0,0,0,0,0,340,2.6,0,0,4828.0,77777,9,999999999,15,0.2030,0,88,0.098,0.0,0.0 +2014,5,28,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,4.4,85,102264,0,0,278,0,0,0,0,0,0,0,330,2.6,0,0,4828.0,77777,9,999999999,15,0.2030,0,88,0.098,0.0,0.0 +2014,5,29,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,3.9,82,102224,0,0,277,0,0,0,0,0,0,0,340,2.1,0,0,4828.0,77777,9,999999999,15,0.2040,0,88,0.098,0.0,0.0 +2014,5,29,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.7,3.9,82,102224,0,0,277,0,0,0,0,0,0,0,340,2.1,0,0,4828.0,77777,9,999999999,15,0.2040,0,88,0.098,0.0,0.0 +2014,5,29,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,4.4,85,102244,0,0,278,0,0,0,0,0,0,0,320,3.1,0,0,4828.0,77777,9,999999999,15,0.2040,0,88,0.098,0.0,0.0 +2014,5,29,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,4.4,85,102244,0,0,278,0,0,0,0,0,0,0,290,2.1,0,0,4828.0,77777,9,999999999,15,0.2040,0,88,0.098,0.0,0.0 +2014,5,29,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.7,4.4,85,102244,49,303,278,10,34,8,1166,0,934,292,290,2.1,0,0,4828.0,77777,9,999999999,15,0.2040,0,88,0.098,0.0,0.0 +2014,5,29,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,5.0,77,102334,284,1329,287,100,289,44,11600,6105,5115,1730,360,2.6,0,0,4828.0,77777,9,999999999,16,0.2040,0,88,0.098,0.0,0.0 +2014,5,29,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,5.0,63,102355,522,1329,312,258,544,76,30568,28055,9030,3346,330,2.1,3,3,4828.0,77777,9,999999999,16,0.2040,0,88,0.098,0.0,0.0 +2014,5,29,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,5.0,63,102355,746,1329,312,449,728,92,54744,43583,11251,4492,330,2.1,3,3,4828.0,77777,9,999999999,16,0.2040,0,88,0.098,0.0,0.0 +2014,5,29,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,6.1,59,102365,942,1329,323,631,822,105,66973,83739,14530,2493,70,3.1,3,3,4828.0,77777,9,999999999,18,0.2040,0,88,0.098,0.0,0.0 +2014,5,29,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,5.0,53,102355,1097,1329,324,786,872,116,82991,89098,15486,3647,80,4.1,3,3,4828.0,77777,9,999999999,16,0.2040,0,88,0.098,0.0,0.0 +2014,5,29,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,14.4,5.0,53,102355,1198,1329,324,909,931,105,96207,95389,13811,4771,80,4.1,3,3,4828.0,77777,9,999999999,16,0.2040,0,88,0.098,0.0,0.0 +2014,5,29,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,7.8,67,102325,1241,1329,330,977,957,100,104040,98572,13085,5533,110,4.6,5,5,4828.0,77777,9,999999999,21,0.2040,0,88,0.098,0.0,0.0 +2014,5,29,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,7.8,69,102335,1221,1329,327,988,960,100,105227,98856,13139,5058,130,5.1,5,5,4828.0,77777,9,999999999,21,0.2040,0,88,0.098,0.0,0.0 +2014,5,29,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,7.8,69,102335,1141,1329,356,841,646,263,100463,48901,31596,12576,130,5.1,10,10,4828.0,77777,9,999999999,21,0.2040,0,88,0.098,0.0,0.0 +2014,5,29,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,6.7,66,102275,1005,1329,352,705,518,286,82070,42278,33488,12864,120,4.6,10,10,4828.0,6096,9,999999999,19,0.2040,0,88,0.098,0.0,0.0 +2014,5,29,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,5.0,59,102225,823,1329,350,577,495,236,66270,39721,27250,10087,120,4.1,10,10,4828.0,6096,9,999999999,16,0.2040,0,88,0.098,0.0,0.0 +2014,5,29,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.8,5.0,59,102225,607,1329,350,433,487,175,48913,35627,19862,6865,120,4.1,10,10,4828.0,6096,9,999999999,16,0.2040,0,88,0.098,0.0,0.0 +2014,5,29,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,0.0,43,102105,373,1329,341,308,576,94,34621,28479,10604,3446,90,2.6,10,10,4828.0,6096,9,999999999,10,0.2040,0,88,0.098,0.0,0.0 +2014,5,29,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,6.7,71,102105,135,1329,337,147,402,46,15871,0,4984,1346,80,2.6,9,9,4828.0,9754,9,999999999,19,0.2040,0,88,0.098,0.0,0.0 +2014,5,29,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,6.7,71,102105,0,799,319,0,0,0,0,0,0,0,80,2.6,5,5,4828.0,9754,9,999999999,19,0.2040,0,88,0.098,0.0,0.0 +2014,5,29,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,5.6,69,102135,0,0,315,0,0,0,0,0,0,0,140,3.6,5,5,4828.0,77777,9,999999999,17,0.2040,0,88,0.098,0.0,0.0 +2014,5,29,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,5.6,69,102125,0,0,333,0,0,0,0,0,0,0,200,3.1,9,9,4828.0,6706,9,999999999,17,0.2040,0,88,0.098,0.0,0.0 +2014,5,29,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.1,5.6,69,102125,0,0,333,0,0,0,0,0,0,0,200,3.1,9,9,4828.0,6706,9,999999999,17,0.2040,0,88,0.098,0.0,0.0 +2014,5,29,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,6.7,77,102035,0,0,332,0,0,0,0,0,0,0,210,3.1,9,9,4828.0,6706,9,999999999,19,0.2040,0,88,0.098,0.0,0.0 +2014,5,30,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,6.7,80,101985,0,0,311,0,0,0,0,0,0,0,200,3.6,5,5,4828.0,77777,9,999999999,19,0.2050,0,88,0.098,0.0,0.0 +2014,5,30,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.0,6.7,80,101985,0,0,306,0,0,0,0,0,0,0,200,3.6,3,3,4828.0,77777,9,999999999,19,0.2050,0,88,0.098,0.0,0.0 +2014,5,30,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,6.1,80,101884,0,0,308,0,0,0,0,0,0,0,220,2.6,5,5,4828.0,77777,9,999999999,18,0.2050,0,88,0.098,0.0,0.0 +2014,5,30,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,6.1,83,101854,0,0,324,0,0,0,0,0,0,0,200,3.6,9,9,4828.0,4877,9,999999999,18,0.2050,0,88,0.098,0.0,0.0 +2014,5,30,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.9,6.1,83,101854,51,316,324,8,0,8,771,0,776,293,200,3.6,9,9,4828.0,4877,9,999999999,18,0.2050,0,88,0.098,0.0,0.0 +2014,5,30,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,6.7,80,101845,286,1329,329,88,234,42,10245,4647,4900,1667,190,3.1,9,9,4828.0,7620,9,999999999,19,0.2050,0,88,0.098,0.0,0.0 +2014,5,30,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,6.7,69,101835,523,1329,321,245,471,83,28821,24680,9793,3610,190,3.6,5,5,4828.0,77777,9,999999999,19,0.2050,0,88,0.098,0.0,0.0 +2014,5,30,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.2,6.7,69,101835,747,1329,321,430,665,103,51961,40427,12488,4966,190,3.6,5,5,4828.0,77777,9,999999999,19,0.2050,0,88,0.098,0.0,0.0 +2014,5,30,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,8.3,60,101776,943,1329,341,605,754,122,74429,47191,15065,6256,160,3.6,5,5,4828.0,77777,9,999999999,22,0.2050,0,88,0.098,0.0,0.0 +2014,5,30,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,8.9,60,101746,1097,1329,344,751,788,145,93216,50223,18074,7568,130,3.1,5,5,4828.0,77777,9,999999999,24,0.2050,0,88,0.098,0.0,0.0 +2014,5,30,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.7,8.9,60,101746,1199,1329,344,862,819,155,107926,52231,19493,8110,130,3.1,5,5,4828.0,77777,9,999999999,24,0.2050,0,88,0.098,0.0,0.0 +2014,5,30,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,10.0,63,101676,1242,1329,342,922,823,168,115333,52612,21114,8745,110,6.2,3,3,4828.0,77777,9,999999999,26,0.2050,0,88,0.098,0.0,0.0 +2014,5,30,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,9.4,56,101606,1222,1329,347,931,821,171,116051,53168,21416,8866,100,5.7,3,3,4828.0,77777,9,999999999,25,0.2050,0,88,0.098,0.0,0.0 +2014,5,30,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.3,9.4,56,101606,1142,1329,352,884,798,174,108889,52621,21534,8925,100,5.7,5,5,4828.0,77777,9,999999999,25,0.2050,0,88,0.098,0.0,0.0 +2014,5,30,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,9.4,58,101536,1007,1329,371,597,323,322,68782,27208,37329,13985,110,6.7,9,9,4828.0,3353,9,999999999,25,0.2050,0,88,0.098,0.0,0.0 +2014,5,30,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,8.9,62,101526,825,1329,361,367,130,273,41606,10844,31128,11143,120,5.7,9,9,4828.0,3658,9,999999999,24,0.2050,0,88,0.098,0.0,0.0 +2014,5,30,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.1,8.9,62,101526,610,1329,361,184,92,121,21382,5633,14115,5233,120,5.7,9,9,4828.0,3658,0,919999999,24,0.2050,0,88,0.098,0.0,0.0 +2014,5,30,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,11.1,81,101545,375,1329,356,72,0,72,7123,0,7178,2834,200,2.6,9,9,4828.0,2134,0,919999999,30,0.2050,0,88,0.098,0.0,0.0 +2014,5,30,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,14.4,11.1,81,101595,138,1329,356,38,8,36,4186,0,3977,1172,171,0.0,9,9,9656.0,1981,0,019999999,30,0.2050,0,88,0.098,0.0,0.0 +2014,5,30,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,14.4,11.1,81,101595,0,817,336,0,0,0,0,0,0,0,184,0.0,5,5,9000.0,1981,0,919999999,30,0.2050,0,88,0.098,3.0,0.0 +2014,5,30,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.0,10.0,82,101280,0,0,357,0,0,0,0,0,0,0,40,3.6,10,10,9000.0,762,0,919999999,27,0.2050,0,88,0.098,0.0,0.0 +2014,5,30,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,9.4,80,101705,0,0,356,0,0,0,0,0,0,0,10,3.1,10,10,9000.0,2438,0,919999999,25,0.2050,0,88,0.098,0.0,0.0 +2014,5,30,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.8,9.4,80,101705,0,0,356,0,0,0,0,0,0,0,10,3.1,10,10,9000.0,2438,0,919999999,25,0.2050,0,88,0.098,0.0,0.0 +2014,5,30,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.0,9.0,82,101280,0,0,351,0,0,0,0,0,0,0,350,4.1,10,10,9000.0,2438,0,919999999,24,0.2050,0,88,0.098,0.0,0.0 +2014,5,31,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.0,9.0,87,101280,0,0,346,0,0,0,0,0,0,0,10,3.1,10,10,9000.0,2743,0,919999999,24,0.2060,0,88,0.098,0.0,0.0 +2014,5,31,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.1,8.9,86,101755,0,0,347,0,0,0,0,0,0,0,360,3.1,10,10,9000.0,2743,0,919999999,24,0.2060,0,88,0.098,0.0,0.0 +2014,5,31,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.0,9.0,87,101280,0,0,346,0,0,0,0,0,0,0,10,2.6,10,10,9000.0,274,0,919999999,24,0.2060,0,88,0.098,0.0,0.0 +2014,5,31,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,9.4,86,101825,0,0,350,0,0,0,0,0,0,0,360,3.6,10,10,9000.0,274,0,919999999,25,0.2060,0,88,0.098,0.0,0.0 +2014,5,31,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,9.4,86,101825,53,329,350,3,0,3,289,0,291,119,360,3.6,10,10,9000.0,274,0,919999999,25,0.2060,0,88,0.098,0.0,0.0 +2014,5,31,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.0,9.0,82,101280,287,1328,351,21,0,21,2064,0,2080,902,20,3.6,10,10,9000.0,2134,0,919999999,24,0.2060,0,88,0.098,0.0,0.0 +2014,5,31,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.0,9.0,82,101280,524,1328,341,56,0,56,5620,0,5666,2565,360,3.6,9,9,9000.0,1829,0,919999999,24,0.2060,0,88,0.098,0.0,0.0 +2014,5,31,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.2,8.9,80,102025,748,1328,342,126,1,126,14982,63,15039,5907,30,5.1,9,9,9000.0,1829,0,919999999,24,0.2060,0,88,0.098,0.0,0.0 +2014,5,31,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,7.8,69,102145,944,1328,327,481,421,185,57363,29649,22167,8943,70,6.2,5,5,9000.0,77777,0,919999999,21,0.2060,0,88,0.098,0.0,0.0 +2014,5,31,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,7.2,64,102205,1098,1328,329,703,645,189,85629,44610,23133,9529,70,5.7,5,5,9000.0,77777,0,919999999,20,0.2060,0,88,0.098,0.0,0.0 +2014,5,31,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.9,7.2,64,102205,1200,1328,329,880,863,132,92861,88567,17123,5578,70,5.7,5,5,9000.0,77777,0,919999999,20,0.2060,0,88,0.098,0.0,0.0 +2014,5,31,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,9.4,72,102295,1243,1328,334,954,904,125,101255,93240,16134,6601,80,6.2,5,5,9000.0,77777,0,919999999,25,0.2060,0,88,0.098,0.0,0.0 +2014,5,31,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,8.3,69,102315,1223,1328,330,971,917,122,102909,94382,15829,5896,80,7.7,5,5,9000.0,77777,0,919999999,23,0.2060,0,88,0.098,0.0,0.0 +2014,5,31,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.9,8.3,69,102315,1143,1328,330,931,913,119,98795,93861,15724,4260,80,7.7,5,5,9000.0,77777,0,919999999,23,0.2060,0,88,0.098,0.0,0.0 +2014,5,31,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,6.1,57,102355,1008,1328,330,837,890,115,88591,90850,15632,2926,70,5.7,5,5,9000.0,77777,0,919999999,18,0.2060,0,88,0.098,0.0,0.0 +2014,5,31,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,6.1,57,102355,827,1328,325,696,848,107,85005,52545,13113,5327,90,5.7,3,3,9000.0,77777,0,919999999,18,0.2060,0,88,0.098,0.0,0.0 +2014,5,31,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,14.4,6.1,57,102355,612,1328,325,524,786,93,62261,45182,11085,4217,90,5.7,3,3,9000.0,77777,0,919999999,18,0.2060,0,88,0.098,0.0,0.0 +2014,5,31,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,7.8,74,102445,378,1328,304,336,670,76,38375,27731,8707,2965,70,3.1,0,0,9000.0,77777,0,919999999,22,0.2060,0,88,0.098,0.0,0.0 +2014,5,31,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.9,6.8,71,102508,141,1328,302,156,448,50,16776,0,5397,1435,185,2.2,0,0,9000.0,77777,0,919999999,19,0.2060,0,88,0.098,0.0,0.0 +2014,5,31,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.1,5.9,66,102515,0,835,315,0,0,0,0,0,0,0,245,2.7,3,3,9000.0,77777,9,999999999,18,0.2060,0,88,0.098,0.0,0.0 +2014,5,31,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.1,4.4,59,102513,0,0,303,0,0,0,0,0,0,0,305,2.8,0,0,9000.0,77777,9,999999999,15,0.2060,0,88,0.098,0.0,0.0 +2014,5,31,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,6.7,57,102231,0,0,300,0,0,0,0,0,0,0,290,3.6,0,0,9000.0,77777,9,999999999,19,0.2060,0,88,0.098,0.0,0.0 +2014,5,31,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.9,9.6,58,101946,0,0,300,0,0,0,0,0,0,0,270,4.0,0,0,9000.0,77777,9,999999999,25,0.2060,0,88,0.098,0.0,0.0 +2014,5,31,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.4,12.4,60,101657,0,0,296,0,0,0,0,0,0,0,251,3.7,0,0,9000.0,77777,9,999999999,33,0.2060,0,88,0.098,0.0,0.0 +2013,6,1,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.0,16.0,64,101382,0,0,383,0,0,0,0,0,0,0,229,4.2,3,3,4800.0,77777,9,999999999,48,0.2060,0,88,0.098,0.0,0.0 +2013,6,1,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.6,16.0,66,101382,0,0,367,0,0,0,0,0,0,0,226,4.0,0,0,4800.0,77777,9,999999999,48,0.2060,0,88,0.098,0.0,0.0 +2013,6,1,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.4,16.1,68,101387,0,0,358,0,0,0,0,0,0,0,221,3.5,0,0,4800.0,77777,9,999999999,48,0.2060,0,88,0.098,0.0,0.0 +2013,6,1,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.2,16.4,66,101397,0,0,374,0,0,0,0,0,0,0,222,3.6,3,3,4800.0,77777,9,999999999,50,0.2060,0,88,0.098,0.0,0.0 +2013,6,1,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,24.0,16.6,63,101402,55,341,374,9,36,8,1049,0,933,295,227,3.3,3,3,4800.0,77777,9,999999999,50,0.2060,0,88,0.098,0.0,0.0 +2013,6,1,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.9,17.1,59,101407,289,1328,362,97,283,41,11258,3716,4769,1639,232,3.5,0,0,4800.0,77777,9,999999999,53,0.2060,0,88,0.098,0.0,0.0 +2013,6,1,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,16.7,58,101407,526,1328,376,246,519,71,29135,22365,8432,3166,240,3.1,0,0,4800.0,77777,9,999999999,51,0.2060,0,88,0.098,0.0,0.0 +2013,6,1,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.6,16.7,58,101407,749,1328,376,413,619,113,49285,34344,13535,5387,240,3.1,0,0,4800.0,77777,9,999999999,51,0.2060,0,88,0.098,0.0,0.0 +2013,6,1,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,29.4,18.3,51,101408,945,1328,415,560,611,176,66593,37527,21030,8586,240,4.6,3,3,4800.0,77777,9,999999999,59,0.2060,0,88,0.098,0.0,0.0 +2013,6,1,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,31.1,17.2,43,101388,1099,1328,405,683,564,251,80930,38622,29912,12028,240,7.2,0,0,4800.0,77777,9,999999999,53,0.2060,0,88,0.098,0.0,0.0 +2013,6,1,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,31.1,17.2,43,101388,1201,1328,423,772,522,322,91020,38297,38208,14861,240,7.2,3,3,4800.0,77777,9,999999999,53,0.2060,0,88,0.098,0.0,0.0 +2013,6,1,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,32.2,16.7,40,101258,1243,1328,428,819,493,366,96208,37921,43285,16467,230,7.7,3,3,4800.0,77777,9,999999999,50,0.2060,0,88,0.098,0.0,0.0 +2013,6,1,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,32.2,17.2,41,101198,1224,1328,429,876,593,325,103544,43355,38663,15039,250,7.7,3,3,4800.0,77777,9,999999999,53,0.2060,0,88,0.098,0.0,0.0 +2013,6,1,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,32.2,17.2,41,101198,1145,1328,429,827,574,315,96909,42469,37146,14441,250,7.7,3,3,4800.0,77777,9,999999999,53,0.2060,0,88,0.098,0.0,0.0 +2013,6,1,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,32.8,16.7,38,101108,1010,1328,431,743,595,261,86663,42740,30619,12056,220,7.2,3,3,4800.0,77777,9,999999999,50,0.2060,0,88,0.098,0.0,0.0 +2013,6,1,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,32.2,17.2,41,101108,829,1328,435,628,641,186,73051,41785,21743,8482,210,7.7,5,5,4800.0,77777,9,999999999,53,0.2060,0,88,0.098,0.0,0.0 +2013,6,1,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,32.2,17.2,41,101108,614,1328,435,483,657,127,55658,36929,14694,5456,210,7.7,5,5,4800.0,77777,9,999999999,53,0.2060,0,88,0.098,0.0,0.0 +2013,6,1,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.0,17.8,48,101078,380,1328,424,310,562,93,34622,22052,10426,3455,220,7.2,5,5,4800.0,77777,9,999999999,56,0.2060,0,88,0.098,0.0,0.0 +2013,6,1,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,18.3,55,101118,144,1328,440,144,348,57,15221,0,6050,1539,230,8.8,9,9,4800.0,9144,9,999999999,59,0.2060,0,88,0.098,0.0,0.0 +2013,6,1,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,28.3,18.3,55,101118,0,852,415,0,0,0,0,0,0,0,230,8.8,5,5,4800.0,9144,9,999999999,59,0.2060,0,88,0.099,0.0,0.0 +2013,6,1,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,18.3,64,101177,0,0,424,0,0,0,0,0,0,0,210,6.2,9,9,4800.0,9144,9,999999999,60,0.2060,0,88,0.099,0.0,0.0 +2013,6,1,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,18.3,69,101157,0,0,417,0,0,0,0,0,0,0,220,6.7,9,9,4800.0,9144,9,999999999,60,0.2060,0,88,0.099,0.0,0.0 +2013,6,1,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,24.4,18.3,69,101157,0,0,394,0,0,0,0,0,0,0,220,6.7,5,5,4800.0,9144,9,999999999,60,0.2060,0,88,0.099,0.0,0.0 +2013,6,1,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,17.8,73,101137,0,0,385,0,0,0,0,0,0,0,220,5.1,5,5,4800.0,77777,9,999999999,57,0.2060,0,88,0.099,0.0,0.0 +2013,6,2,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,17.8,76,101107,0,0,376,0,0,0,0,0,0,0,210,3.6,3,3,4800.0,77777,9,999999999,57,0.2070,0,88,0.099,0.0,0.0 +2013,6,2,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,17.8,76,101107,0,0,376,0,0,0,0,0,0,0,210,3.6,3,3,4800.0,77777,9,999999999,57,0.2070,0,88,0.099,0.0,0.0 +2013,6,2,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,17.8,81,101047,0,0,370,0,0,0,0,0,0,0,210,6.7,3,3,4800.0,77777,9,999999999,57,0.2070,0,88,0.099,0.0,0.0 +2013,6,2,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,17.2,81,101047,0,0,373,0,0,0,0,0,0,0,210,6.2,5,5,4800.0,77777,9,999999999,54,0.2070,0,88,0.099,0.0,0.0 +2013,6,2,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.6,17.2,81,101047,57,351,373,9,22,8,1050,0,934,296,210,6.2,5,5,4800.0,77777,9,999999999,54,0.2070,0,88,0.099,0.0,0.0 +2013,6,2,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,17.8,81,101087,290,1328,370,93,240,45,10709,3313,5194,1775,220,5.1,3,3,4800.0,77777,9,999999999,57,0.2070,0,88,0.099,0.0,0.0 +2013,6,2,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,18.3,76,101067,527,1328,380,240,467,80,28130,20301,9405,3509,210,5.7,3,3,4800.0,77777,9,999999999,60,0.2070,0,88,0.099,0.0,0.0 +2013,6,2,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.8,18.3,76,101067,750,1328,380,417,633,104,50020,33244,12519,5016,210,5.7,3,3,4800.0,77777,9,999999999,60,0.2070,0,88,0.099,0.0,0.0 +2013,6,2,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,19.4,62,100958,946,1328,404,591,734,117,72426,38979,14393,6034,190,6.2,3,3,4800.0,77777,9,999999999,66,0.2070,0,88,0.099,0.0,0.0 +2013,6,2,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,19.4,57,100938,1099,1328,396,742,801,124,81350,84705,16574,3801,200,7.2,0,0,4800.0,77777,9,999999999,66,0.2070,0,88,0.099,0.0,0.0 +2013,6,2,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,28.9,19.4,57,100938,1201,1328,413,861,857,118,94476,90840,15492,5249,200,7.2,3,3,4800.0,77777,9,999999999,66,0.2070,0,88,0.099,0.0,0.0 +2013,6,2,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.6,18.3,48,100848,1244,1328,421,834,567,318,98920,40199,37960,14856,210,9.8,3,3,4800.0,77777,9,999999999,59,0.2070,0,88,0.099,0.0,0.0 +2013,6,2,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.6,18.3,48,100788,1225,1328,404,849,533,354,99606,39786,41811,16014,200,9.8,0,0,4800.0,77777,9,999999999,59,0.2070,0,88,0.099,0.0,0.0 +2013,6,2,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,30.6,18.3,48,100788,1146,1328,421,812,535,335,94619,40024,39291,15103,200,9.8,3,3,4800.0,77777,9,999999999,59,0.2070,0,88,0.099,0.0,0.0 +2013,6,2,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,29.4,17.8,50,100678,1011,1328,414,728,551,280,84386,40136,32650,12709,200,11.3,3,3,4800.0,77777,9,999999999,56,0.2070,0,88,0.099,0.0,0.0 +2013,6,2,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,17.8,51,100638,830,1328,411,618,604,201,71435,40233,23353,9016,200,11.8,3,3,4800.0,77777,9,999999999,56,0.2070,0,88,0.099,0.0,0.0 +2013,6,2,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,28.9,17.8,51,100638,616,1328,418,455,530,157,51543,32408,17868,6418,200,11.8,5,5,4800.0,77777,9,999999999,56,0.2070,0,88,0.099,0.0,0.0 +2013,6,2,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,18.3,66,100787,383,1328,421,265,327,118,29025,15117,12982,4059,210,6.7,9,9,4800.0,6706,9,999999999,59,0.2070,0,88,0.099,0.0,0.0 +2013,6,2,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,17.8,67,100807,146,1328,417,105,100,70,10926,684,7318,1655,210,6.2,9,9,4800.0,6096,9,999999999,57,0.2070,0,88,0.099,0.0,0.0 +2013,6,2,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,24.4,17.8,67,100807,0,868,428,0,0,0,0,0,0,0,210,6.2,10,10,4800.0,6096,9,999999999,57,0.2070,0,88,0.099,0.0,0.0 +2013,6,2,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,16.7,73,100877,0,0,400,0,0,0,0,0,0,0,190,6.2,9,9,4800.0,6706,9,999999999,51,0.2070,0,88,0.099,0.0,0.0 +2013,6,2,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,16.7,73,100877,0,0,400,0,0,0,0,0,0,0,200,4.1,9,9,4800.0,6706,9,999999999,51,0.2070,0,88,0.099,0.0,0.0 +2013,6,2,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,16.7,73,100877,0,0,392,0,0,0,0,0,0,0,200,4.1,8,8,4800.0,6706,9,999999999,51,0.2070,0,88,0.099,0.0,0.0 +2013,6,2,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,17.2,78,100897,0,0,398,0,0,0,0,0,0,0,230,5.1,9,9,4800.0,6706,9,999999999,54,0.2070,0,88,0.099,0.0,0.0 +2013,6,3,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,17.2,81,100947,0,0,406,0,0,0,0,0,0,0,250,5.1,10,10,4800.0,3353,9,999999999,54,0.2080,0,88,0.099,2.5,0.0 +2013,6,3,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.6,17.2,81,100947,0,0,406,0,0,0,0,0,0,0,250,5.1,10,10,4800.0,3353,9,999999999,54,0.2080,0,88,0.099,0.0,0.0 +2013,6,3,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,17.2,81,100807,0,0,395,0,0,0,0,0,0,0,220,4.6,9,9,4800.0,3048,9,999999999,54,0.2080,0,88,0.099,0.0,0.0 +2013,6,3,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,16.7,87,100906,0,0,396,0,0,0,0,0,0,0,200,5.7,10,10,4800.0,2286,9,999999999,51,0.2080,0,88,0.099,0.0,0.0 +2013,6,3,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.9,16.7,87,100906,58,362,396,1,0,1,96,0,96,41,200,5.7,10,10,4800.0,2286,9,999999999,51,0.2080,0,88,0.099,0.0,0.0 +2013,6,3,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,19.4,17.8,90,101016,291,1327,400,11,0,11,1074,0,1082,490,250,3.1,10,10,6437.0,305,0,919999999,57,0.2080,0,88,0.099,0.0,0.0 +2013,6,3,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,18.0,88,101281,528,1327,404,38,0,38,3787,0,3819,1802,280,3.6,10,10,6437.0,1829,0,919999999,58,0.2080,0,88,0.099,0.0,0.0 +2013,6,3,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,20.0,17.8,87,101026,751,1327,404,147,6,144,17206,355,16927,6609,280,3.6,10,10,3200.0,1829,0,919999999,57,0.2080,0,88,0.099,0.0,0.0 +2013,6,3,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,19.0,17.0,88,101281,946,1327,397,198,7,193,23412,453,22935,9269,270,1.5,10,10,9656.0,3048,0,919999999,53,0.2080,0,88,0.099,0.0,0.0 +2013,6,3,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,17.0,83,101281,1100,1327,403,197,7,191,23846,437,23236,9618,273,0.0,10,10,9656.0,640,0,919999999,53,0.2080,0,88,0.099,0.0,0.0 +2013,6,3,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,18.9,16.7,87,101036,1202,1327,396,176,6,170,21795,357,21153,8803,290,2.1,10,10,4800.0,640,0,919999999,51,0.2080,0,88,0.099,0.0,0.0 +2013,6,3,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,19.0,17.0,88,101281,1245,1327,397,449,58,395,52432,4595,46448,17372,234,0.0,10,10,8047.0,549,0,919999999,53,0.2080,0,88,0.099,0.0,0.0 +2013,6,3,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.0,17.0,88,101281,1226,1327,397,575,126,458,66193,10783,53113,19000,200,2.1,10,10,8047.0,427,0,919999999,53,0.2080,0,88,0.099,0.0,0.0 +2013,6,3,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.6,18.3,87,100907,1147,1327,388,688,338,391,79212,27149,45330,16787,190,3.1,8,8,8047.0,427,0,919999999,60,0.2080,0,88,0.099,0.0,0.0 +2013,6,3,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,18.9,76,100837,1012,1327,412,599,315,349,68169,25001,39980,14798,190,4.6,9,9,8047.0,3048,0,919999999,63,0.2080,0,88,0.099,0.0,0.0 +2013,6,3,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,18.3,71,100767,832,1327,414,522,366,276,58814,27921,31283,11292,200,4.1,9,9,8047.0,3658,0,919999999,60,0.2080,0,88,0.099,0.0,0.0 +2013,6,3,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.9,18.3,71,100767,618,1327,406,377,274,215,41621,19524,23866,7914,200,4.1,8,8,8047.0,3658,0,919999999,60,0.2080,0,88,0.099,0.0,0.0 +2013,6,3,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,18.3,76,100747,385,1327,408,202,116,146,21747,6325,15796,4575,200,6.2,9,9,8047.0,3658,0,919999999,60,0.2080,0,88,0.099,0.0,0.0 +2013,6,3,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,18.9,82,100777,149,1327,406,81,40,66,8476,121,6937,1658,210,5.1,9,9,8047.0,6096,0,919999999,63,0.2080,0,88,0.099,0.0,0.0 +2013,6,3,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,18.9,82,100777,0,885,383,0,0,0,0,0,0,0,210,5.1,5,5,8047.0,6096,9,999999999,63,0.2080,0,88,0.099,5.0,0.0 +2013,6,3,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,10.6,49,100917,0,0,371,0,0,0,0,0,0,0,300,5.1,5,5,8047.0,77777,9,999999999,28,0.2080,0,88,0.099,5.0,0.0 +2013,6,3,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,6.1,40,100947,0,0,357,0,0,0,0,0,0,0,290,7.2,5,5,8047.0,77777,9,999999999,18,0.2080,0,88,0.099,5.0,0.0 +2013,6,3,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,6.1,40,100947,0,0,351,0,0,0,0,0,0,0,290,7.2,3,3,8047.0,77777,9,999999999,18,0.2080,0,88,0.099,0.5,0.0 +2013,6,3,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,6.1,48,100956,0,0,338,0,0,0,0,0,0,0,300,6.7,3,3,8047.0,77777,9,999999999,18,0.2080,0,88,0.099,0.0,0.0 +2013,6,4,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,6.1,51,101036,0,0,333,0,0,0,0,0,0,0,290,5.1,3,3,8047.0,77777,9,999999999,18,0.2090,0,88,0.099,0.0,0.0 +2013,6,4,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.1,6.1,51,101036,0,0,333,0,0,0,0,0,0,0,290,5.1,3,3,8047.0,77777,9,999999999,18,0.2090,0,88,0.099,0.0,0.0 +2013,6,4,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,3.9,51,101096,0,0,320,0,0,0,0,0,0,0,290,5.7,3,3,8047.0,77777,9,999999999,14,0.2090,0,88,0.099,0.0,0.0 +2013,6,4,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,3.9,53,101105,0,0,318,0,0,0,0,0,0,0,290,5.7,3,3,8047.0,77777,9,999999999,14,0.2090,0,88,0.099,0.0,0.0 +2013,6,4,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,3.9,53,101105,60,371,318,13,90,9,1518,0,1051,330,290,5.7,3,3,8047.0,77777,9,999999999,14,0.2090,0,88,0.099,0.0,0.0 +2013,6,4,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,3.3,47,101216,292,1327,322,112,396,34,13304,7659,4045,1400,300,4.6,3,3,8047.0,77777,9,999999999,14,0.2090,0,88,0.099,0.0,0.0 +2013,6,4,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,3.3,44,101216,528,1327,327,275,656,58,33338,31970,7046,2655,310,6.2,3,3,8047.0,77777,9,999999999,14,0.2090,0,88,0.099,0.0,0.0 +2013,6,4,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.6,3.3,44,101216,752,1327,314,444,740,85,54549,44062,10473,4199,310,6.2,0,0,8047.0,77777,9,999999999,14,0.2090,0,88,0.099,0.0,0.0 +2013,6,4,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,5.6,43,101216,947,1327,342,590,702,147,71708,46937,17941,7379,300,5.1,3,3,8047.0,77777,9,999999999,17,0.2090,0,88,0.099,0.0,0.0 +2013,6,4,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,5.6,40,101256,1100,1327,348,707,628,226,85056,46268,27332,11063,300,6.2,3,3,8047.0,77777,9,999999999,17,0.2090,0,88,0.099,0.0,0.0 +2013,6,4,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,19.4,5.6,40,101256,1202,1327,353,744,473,340,87983,39177,40463,15476,300,6.2,5,5,8047.0,77777,9,999999999,17,0.2090,0,88,0.099,0.0,0.0 +2013,6,4,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,5.6,37,101306,1245,1327,359,800,468,370,94542,39569,44015,16606,310,7.2,5,5,8047.0,77777,9,999999999,17,0.2090,0,88,0.099,0.0,0.0 +2013,6,4,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,6.1,38,101317,1227,1327,383,593,194,412,69305,17205,48483,17783,310,6.2,9,9,8047.0,1829,9,999999999,18,0.2090,0,88,0.099,0.0,0.0 +2013,6,4,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,6.1,38,101317,1148,1327,375,568,220,376,66124,19255,44062,16368,310,6.2,8,8,8047.0,1829,9,999999999,18,0.2090,0,88,0.099,0.0,0.0 +2013,6,4,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,5.6,35,101297,1014,1327,364,674,502,278,78797,40646,32688,12661,320,5.7,5,5,8047.0,77777,9,999999999,17,0.2090,0,88,0.099,0.0,0.0 +2013,6,4,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,5.0,34,101307,834,1327,358,635,655,181,74627,47501,21371,8330,310,7.2,3,3,8047.0,77777,9,999999999,16,0.2090,0,88,0.099,0.0,0.0 +2013,6,4,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,5.0,34,101307,620,1327,364,515,759,101,60936,45255,11990,4548,310,7.2,5,5,8047.0,77777,9,999999999,16,0.2090,0,88,0.099,0.0,0.0 +2013,6,4,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,5.0,34,101427,387,1327,364,344,700,69,39749,29020,7996,2774,310,3.6,5,5,8047.0,77777,9,999999999,16,0.2090,0,88,0.099,0.0,0.0 +2013,6,4,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,5.0,36,101506,151,1327,353,163,482,48,17724,233,5237,1458,320,4.6,3,3,8047.0,77777,9,999999999,16,0.2090,0,88,0.099,0.0,0.0 +2013,6,4,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.6,5.0,36,101506,0,900,353,0,0,0,0,0,0,0,320,4.6,3,3,8047.0,77777,9,999999999,16,0.2090,0,88,0.099,0.0,0.0 +2013,6,4,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,7.2,52,101706,0,0,339,0,0,0,0,0,0,0,20,2.1,3,3,8047.0,77777,9,999999999,20,0.2090,0,88,0.099,0.0,0.0 +2013,6,4,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,6.1,46,101796,0,0,327,0,0,0,0,0,0,0,20,4.1,0,0,8047.0,77777,9,999999999,18,0.2090,0,88,0.099,0.0,0.0 +2013,6,4,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,6.1,46,101796,0,0,327,0,0,0,0,0,0,0,20,4.1,0,0,8047.0,77777,9,999999999,18,0.2090,0,88,0.099,0.0,0.0 +2013,6,4,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,6.1,53,101895,0,0,317,0,0,0,0,0,0,0,350,3.6,0,0,8047.0,77777,9,999999999,18,0.2090,0,88,0.099,0.0,0.0 +2013,6,5,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,5.6,51,101935,0,0,330,0,0,0,0,0,0,0,330,3.1,3,3,8047.0,77777,9,999999999,17,0.2100,0,88,0.099,0.0,0.0 +2013,6,5,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.6,5.6,51,101935,0,0,330,0,0,0,0,0,0,0,330,3.1,3,3,8047.0,77777,9,999999999,17,0.2100,0,88,0.099,0.0,0.0 +2013,6,5,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,6.1,57,101955,0,0,330,0,0,0,0,0,0,0,300,3.1,5,5,8047.0,77777,9,999999999,18,0.2100,0,88,0.099,0.0,0.0 +2013,6,5,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,6.7,62,101995,0,0,329,0,0,0,0,0,0,0,290,3.1,5,5,8047.0,77777,9,999999999,19,0.2100,0,88,0.099,0.0,0.0 +2013,6,5,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.9,6.7,62,101995,61,380,329,11,0,11,1061,0,1068,393,290,3.1,5,5,8047.0,77777,9,999999999,19,0.2100,0,88,0.099,0.0,0.0 +2013,6,5,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,6.7,54,102105,293,1326,359,93,257,42,10857,5428,4913,1682,320,3.6,9,9,8047.0,7620,9,999999999,19,0.2100,0,88,0.099,0.0,0.0 +2013,6,5,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,6.1,46,102126,529,1326,367,252,543,62,30372,26326,7490,2819,340,3.1,9,9,8047.0,7620,9,999999999,18,0.2100,0,88,0.099,0.0,0.0 +2013,6,5,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,6.1,46,102126,752,1326,341,419,638,100,50811,38701,12166,4853,340,3.1,3,3,8047.0,7620,9,999999999,18,0.2100,0,88,0.099,0.0,0.0 +2013,6,5,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,4.4,37,102156,947,1326,352,577,668,155,69885,45636,18854,7724,5,2.6,5,5,8047.0,77777,9,999999999,15,0.2100,0,88,0.099,0.0,0.0 +2013,6,5,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,5.6,37,102146,1101,1326,380,693,592,240,82998,44463,28900,11615,356,2.1,9,9,8047.0,7620,9,999999999,17,0.2100,0,88,0.099,0.0,0.0 +2013,6,5,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.6,5.6,37,102146,1203,1326,359,790,573,295,94460,45015,35485,13919,329,2.1,5,5,8047.0,7620,9,999999999,17,0.2100,0,88,0.099,0.0,0.0 +2013,6,5,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,7.2,41,102086,1246,1326,363,855,570,332,101838,45784,39795,15353,237,2.6,5,5,8047.0,77777,9,999999999,20,0.2100,0,88,0.099,0.0,0.0 +2013,6,5,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,6.7,38,102036,1228,1326,366,883,613,312,105436,48505,37485,14598,195,2.1,5,5,8047.0,77777,9,999999999,19,0.2100,0,88,0.099,0.0,0.0 +2013,6,5,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,6.7,38,102036,1149,1326,366,814,551,320,95960,45003,37957,14627,180,2.1,5,5,8047.0,77777,9,999999999,19,0.2100,0,88,0.099,0.0,0.0 +2013,6,5,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,7.2,45,101946,1015,1326,355,732,560,274,85639,44657,32240,12535,110,7.7,5,5,8047.0,77777,9,999999999,20,0.2100,0,88,0.099,0.0,0.0 +2013,6,5,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,9.4,50,101926,835,1326,382,582,476,246,66654,37681,28328,10485,110,6.2,9,9,8047.0,7620,9,999999999,25,0.2100,0,88,0.099,0.0,0.0 +2013,6,5,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,9.4,50,101926,622,1326,374,356,229,212,39643,17793,23731,7886,110,6.2,8,8,8047.0,7620,9,999999999,25,0.2100,0,88,0.099,0.0,0.0 +2013,6,5,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,8.9,49,101916,390,1326,392,232,213,151,25115,13509,16426,4690,180,6.7,10,10,8047.0,7620,9,999999999,24,0.2100,0,88,0.099,0.0,0.0 +2013,6,5,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,9.4,56,101976,154,1326,373,122,242,73,12789,3883,7687,1742,200,5.7,9,9,8047.0,7620,9,999999999,25,0.2100,0,88,0.099,0.0,0.0 +2013,6,5,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.3,9.4,56,101976,0,916,365,0,0,0,0,0,0,0,200,5.7,8,8,8047.0,7620,9,999999999,25,0.2100,0,88,0.099,0.0,0.0 +2013,6,5,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,7.8,54,102056,0,0,366,0,0,0,0,0,0,0,200,4.1,9,9,8047.0,6096,9,999999999,21,0.2100,0,88,0.099,0.0,0.0 +2013,6,5,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,7.8,54,102076,0,0,366,0,0,0,0,0,0,0,210,4.6,9,9,8047.0,5486,9,999999999,21,0.2100,0,88,0.099,0.0,0.0 +2013,6,5,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.2,7.8,54,102076,0,0,358,0,0,0,0,0,0,0,210,4.6,8,8,8047.0,5486,9,999999999,21,0.2100,0,88,0.099,0.0,0.0 +2013,6,5,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,8.3,60,102085,0,0,361,0,0,0,0,0,0,0,210,3.1,9,9,8047.0,5182,9,999999999,22,0.2100,0,88,0.099,0.0,0.0 +2013,6,6,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,9.4,67,102085,0,0,360,0,0,0,0,0,0,0,220,3.1,9,9,8047.0,5486,9,999999999,25,0.2110,0,88,0.099,0.0,0.0 +2013,6,6,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.6,9.4,67,102085,0,0,334,0,0,0,0,0,0,0,220,3.1,3,3,8047.0,5486,9,999999999,25,0.2110,0,88,0.099,0.0,0.0 +2013,6,6,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,8.9,67,102115,0,0,356,0,0,0,0,0,0,0,230,2.6,9,9,8047.0,4572,9,999999999,24,0.2110,0,88,0.099,0.0,0.0 +2013,6,6,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,8.9,72,102115,0,0,351,0,0,0,0,0,0,0,200,2.6,9,9,8047.0,4572,9,999999999,24,0.2110,0,88,0.099,0.0,0.0 +2013,6,6,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.9,8.9,72,102115,62,387,343,9,0,9,867,0,873,332,200,2.6,8,8,8047.0,4572,9,999999999,24,0.2110,0,88,0.099,0.0,0.0 +2013,6,6,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,9.4,64,102165,294,1326,342,94,256,42,10964,5085,4909,1683,220,2.6,5,5,8047.0,77777,9,999999999,25,0.2110,0,88,0.099,0.0,0.0 +2013,6,6,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,10.0,63,102196,530,1326,348,219,359,99,25414,19521,11528,4198,210,2.1,5,5,8047.0,77777,9,999999999,27,0.2110,0,88,0.099,0.0,0.0 +2013,6,6,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.2,10.0,63,102196,753,1326,348,374,459,154,43801,30644,18114,6987,210,2.1,5,5,8047.0,77777,9,999999999,27,0.2110,0,88,0.099,0.0,0.0 +2013,6,6,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,10.6,59,102146,947,1326,378,560,605,175,67029,40889,21044,8559,150,3.6,9,9,8047.0,7620,9,999999999,28,0.2110,0,88,0.099,0.0,0.0 +2013,6,6,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,10.0,53,102146,1101,1326,383,652,493,279,77044,37893,33161,13066,120,3.6,9,9,8047.0,7620,9,999999999,26,0.2110,0,88,0.099,0.0,0.0 +2013,6,6,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,10.0,53,102146,1203,1326,375,746,486,329,88288,38637,39184,15113,120,3.6,8,8,8047.0,7620,9,999999999,26,0.2110,0,88,0.099,0.0,0.0 +2013,6,6,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,10.6,55,102076,1246,1326,383,816,486,367,96296,39664,43598,16517,110,6.7,9,9,8047.0,7620,9,999999999,28,0.2110,0,88,0.099,0.0,0.0 +2013,6,6,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,11.7,61,102036,1228,1326,382,740,334,429,85999,29089,50209,18265,100,7.2,9,9,8047.0,3962,9,999999999,31,0.2110,0,88,0.099,0.0,0.0 +2013,6,6,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,19.4,11.7,61,102036,1150,1326,374,647,236,435,74278,21280,50293,17961,100,7.2,8,8,8047.0,3962,9,999999999,31,0.2110,0,88,0.099,0.0,0.0 +2013,6,6,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,11.7,61,101956,1016,1326,393,542,181,391,61514,16323,44677,15904,120,6.2,10,10,8047.0,3962,9,999999999,31,0.2110,0,88,0.099,0.0,0.0 +2013,6,6,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,11.1,61,101946,837,1326,389,445,172,323,49822,15226,36389,12468,120,5.1,10,10,8047.0,3962,9,999999999,29,0.2110,0,88,0.099,0.0,0.0 +2013,6,6,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.9,11.1,61,101946,624,1326,389,270,76,221,29947,5949,24644,8099,120,5.1,10,10,8047.0,3962,9,999999999,29,0.2110,0,88,0.099,0.0,0.0 +2013,6,6,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,11.1,65,101996,392,1326,383,175,55,151,18934,3419,16417,4711,130,4.1,10,10,8047.0,3962,9,999999999,30,0.2110,0,88,0.099,0.0,0.0 +2013,6,6,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,8.9,56,101996,156,1326,380,71,23,62,7562,207,6630,1681,160,3.1,10,10,8047.0,3962,9,999999999,24,0.2110,0,88,0.099,0.0,0.0 +2013,6,6,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,8.9,56,101996,0,930,380,0,0,0,0,0,0,0,160,3.1,10,10,8047.0,3962,9,999999999,24,0.2110,0,88,0.099,0.0,0.0 +2013,6,6,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,11.7,75,102005,0,0,375,0,0,0,0,0,0,0,120,4.6,10,10,8047.0,3962,9,999999999,31,0.2110,0,88,0.099,0.0,0.0 +2013,6,6,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,11.1,75,101945,0,0,372,0,0,0,0,0,0,0,120,4.1,10,10,8047.0,3048,9,999999999,30,0.2110,0,88,0.099,0.0,0.0 +2013,6,6,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.6,11.1,75,101945,0,0,372,0,0,0,0,0,0,0,120,4.1,10,10,8047.0,3048,0,919999999,30,0.2110,0,88,0.099,0.0,0.0 +2013,6,6,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,11.7,84,101925,0,0,366,0,0,0,0,0,0,0,110,3.6,10,10,8047.0,3048,0,919999999,32,0.2110,0,88,0.099,2.0,0.0 +2013,6,7,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,12.2,89,101865,0,0,364,0,0,0,0,0,0,0,90,4.6,10,10,8047.0,3353,0,919999999,33,0.2120,0,88,0.099,0.3,0.0 +2013,6,7,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.9,12.2,89,101865,0,0,364,0,0,0,0,0,0,0,90,4.6,10,10,8047.0,3353,0,919999999,33,0.2120,0,88,0.099,0.0,0.0 +2013,6,7,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,11.1,87,101715,0,0,360,0,0,0,0,0,0,0,90,6.2,10,10,8047.0,2438,0,919999999,30,0.2120,0,88,0.099,0.0,0.0 +2013,6,7,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,10.0,80,101725,0,0,359,0,0,0,0,0,0,0,110,5.1,10,10,8047.0,2134,0,919999999,27,0.2120,0,88,0.099,0.0,0.0 +2013,6,7,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,10.0,80,101725,63,394,359,2,0,2,193,0,194,81,110,5.1,10,10,8047.0,2134,0,919999999,27,0.2120,0,88,0.099,0.0,0.0 +2013,6,7,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.0,11.0,88,101280,295,1326,358,21,0,21,2063,0,2079,907,100,4.6,10,10,8047.0,671,0,919999999,29,0.2120,0,88,0.099,0.0,0.0 +2013,6,7,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.0,12.0,94,101280,530,1326,360,40,0,40,4009,0,4042,1893,90,4.1,10,10,8047.0,335,0,919999999,32,0.2120,0,88,0.099,0.0,0.0 +2013,6,7,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,13.3,11.7,90,101745,753,1326,361,116,0,116,11852,0,11958,5524,80,3.6,10,10,9000.0,335,0,919999999,32,0.2120,0,88,0.099,0.0,0.0 +2013,6,7,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.3,12.8,97,101745,948,1326,362,183,5,179,21840,333,21464,8723,60,3.6,10,10,9656.0,152,0,919999999,35,0.2120,0,88,0.099,0.0,0.0 +2013,6,7,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,14.0,13.0,94,101280,1101,1326,366,234,10,226,28056,694,27243,11067,70,5.1,10,10,2414.0,152,0,919999999,36,0.2120,0,88,0.099,0.0,0.0 +2013,6,7,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,13.9,13.3,96,101745,1203,1326,366,286,14,274,34265,1009,33021,13144,80,4.1,10,10,2400.0,152,0,919999999,37,0.2120,0,88,0.099,0.0,0.0 +2013,6,7,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,14.0,13.0,94,101280,1247,1326,366,330,18,313,39373,1351,37580,14690,90,4.6,10,10,2414.0,152,0,919999999,36,0.2120,0,88,0.099,0.0,0.0 +2013,6,7,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.9,12.8,93,101665,1229,1326,365,369,24,347,43577,1889,41247,15804,60,5.7,10,10,9656.0,152,0,919999999,35,0.2120,0,88,0.099,0.0,0.0 +2013,6,7,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,13.9,12.8,93,101665,1151,1326,365,335,20,316,39420,1553,37417,14501,60,5.7,10,10,9000.0,152,0,919999999,35,0.2120,0,88,0.099,0.0,0.0 +2013,6,7,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.3,12.8,97,101565,1017,1326,362,281,15,268,32849,1135,31511,12346,60,6.2,10,10,4023.0,152,0,919999999,35,0.2120,0,88,0.099,0.0,0.0 +2013,6,7,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.3,12.2,93,101495,838,1326,361,238,12,229,27386,900,26491,9990,60,7.7,10,10,4023.0,152,0,919999999,33,0.2120,0,88,0.099,0.0,0.0 +2013,6,7,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,13.3,12.2,93,101495,626,1326,361,150,3,148,17184,193,17028,6199,60,7.7,10,10,4000.0,152,0,919999999,33,0.2120,0,88,0.099,0.0,0.0 +2013,6,7,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,12.8,11.7,93,101445,394,1326,358,70,0,70,6934,0,6989,2825,50,5.7,10,10,4023.0,152,0,919999999,32,0.2120,0,88,0.099,0.0,0.0 +2013,6,7,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.0,12.0,94,101280,159,1326,360,54,5,53,5826,7,5739,1576,60,6.2,10,10,2414.0,213,0,919999999,32,0.2120,0,88,0.099,0.0,0.0 +2013,6,7,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,12.8,11.7,93,101285,0,944,358,0,0,0,0,0,0,0,50,7.7,10,10,4000.0,213,0,919999999,31,0.2120,0,88,0.099,5.0,0.0 +2013,6,7,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.0,12.0,94,101280,0,0,360,0,0,0,0,0,0,0,50,8.8,10,10,2816.0,305,0,919999999,32,0.2120,0,88,0.099,5.0,0.0 +2013,6,7,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.0,12.0,94,101280,0,0,360,0,0,0,0,0,0,0,40,8.2,10,10,4023.0,152,0,919999999,32,0.2120,0,88,0.099,5.0,0.0 +2013,6,7,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,12.8,11.7,93,101045,0,0,358,0,0,0,0,0,0,0,40,6.2,10,10,4000.0,152,0,919999999,31,0.2120,0,88,0.099,5.0,0.0 +2013,6,7,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,12.8,11.7,93,100785,0,0,358,0,0,0,0,0,0,0,30,7.2,10,10,3219.0,213,0,919999999,31,0.2120,0,88,0.099,5.0,0.0 +2013,6,8,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,12.8,11.7,93,100686,0,0,358,0,0,0,0,0,0,0,30,6.7,10,10,4023.0,213,0,919999999,31,0.2130,0,88,0.099,5.0,0.0 +2013,6,8,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,12.8,11.7,93,100686,0,0,358,0,0,0,0,0,0,0,30,6.7,10,10,4000.0,213,0,919999999,31,0.2130,0,88,0.099,5.0,0.0 +2013,6,8,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.0,12.0,94,101280,0,0,360,0,0,0,0,0,0,0,20,6.7,10,10,4023.0,366,0,919999999,32,0.2130,0,88,0.099,5.0,0.0 +2013,6,8,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,12.8,11.7,93,100336,0,0,358,0,0,0,0,0,0,0,10,4.1,10,10,4023.0,152,0,919999999,31,0.2130,0,88,0.099,5.0,0.0 +2013,6,8,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,12.8,11.7,93,100336,64,401,358,6,0,6,577,0,581,232,10,4.1,10,10,4000.0,152,0,919999999,31,0.2130,0,88,0.099,5.0,0.0 +2013,6,8,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.0,12.0,94,101280,296,1325,360,68,84,49,7828,1773,5655,1916,350,5.7,10,10,3219.0,152,0,919999999,32,0.2130,0,88,0.099,5.0,0.0 +2013,6,8,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.3,12.2,93,100256,531,1325,361,139,70,115,15924,3948,13225,4728,330,5.7,10,10,3219.0,213,0,919999999,33,0.2130,0,88,0.099,5.0,0.0 +2013,6,8,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,13.3,12.2,93,100256,753,1325,361,275,233,169,31939,15750,19718,7524,330,5.7,10,10,3200.0,213,0,919999999,33,0.2130,0,88,0.099,5.0,0.0 +2013,6,8,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.0,12.0,88,101280,948,1325,365,490,557,129,59982,34066,15853,6589,300,7.2,10,10,3200.0,274,0,919999999,32,0.2130,0,88,0.099,5.0,0.0 +2013,6,8,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,12.8,78,100676,1102,1325,380,385,67,332,44814,5391,38890,14843,300,5.7,10,10,3200.0,427,0,919999999,35,0.2130,0,88,0.099,5.0,0.0 +2013,6,8,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.7,12.8,78,100676,1204,1325,380,592,196,418,68663,16860,48822,17837,300,5.7,10,10,3200.0,427,0,919999999,35,0.2130,0,88,0.099,5.0,0.0 +2013,6,8,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,14.4,63,100877,1247,1325,397,732,342,413,85405,28406,48525,17919,270,5.7,9,9,3200.0,762,0,919999999,40,0.2130,0,88,0.099,5.0,0.0 +2013,6,8,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.0,15.0,64,101282,1230,1325,400,813,459,385,95104,36943,45346,17011,270,5.1,9,9,3200.0,914,0,919999999,43,0.2130,0,88,0.099,4.9,0.0 +2013,6,8,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.3,15.0,60,100897,1152,1325,398,694,313,414,79837,26772,47960,17442,250,6.7,8,8,3200.0,914,0,919999999,43,0.2130,0,88,0.099,0.0,0.0 +2013,6,8,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,15.6,56,100967,1019,1325,417,573,270,344,65556,22098,39612,14719,260,6.2,9,9,3200.0,1219,0,919999999,45,0.2130,0,88,0.099,0.0,0.0 +2013,6,8,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,16.1,58,101027,840,1325,418,436,190,289,49114,15195,32752,11707,250,6.7,9,9,3200.0,1250,0,919999999,48,0.2130,0,88,0.099,0.0,0.0 +2013,6,8,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.0,16.1,58,101027,627,1325,409,295,106,238,32429,8208,26312,8475,250,6.7,8,8,3200.0,1250,0,919999999,48,0.2130,0,88,0.099,0.0,0.0 +2013,6,8,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,15.0,57,101187,396,1325,410,213,244,131,23287,13105,14388,4411,280,7.7,9,9,3200.0,4267,0,919999999,43,0.2130,0,88,0.099,0.0,0.0 +2013,6,8,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,15.0,61,101287,161,1325,404,75,41,68,7912,384,7205,1772,300,5.1,9,9,3200.0,4572,0,919999999,43,0.2130,0,88,0.099,0.0,0.0 +2013,6,8,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.8,15.0,61,101287,0,958,381,0,0,0,0,0,0,0,300,5.1,5,5,3200.0,4572,9,999999999,43,0.2130,0,88,0.099,0.0,0.0 +2013,6,8,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,13.9,65,101446,0,0,363,0,0,0,0,0,0,0,280,5.1,3,3,3200.0,77777,9,999999999,39,0.2130,0,88,0.099,0.0,0.0 +2013,6,8,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,13.9,68,101506,0,0,360,0,0,0,0,0,0,0,270,4.1,3,3,3200.0,77777,9,999999999,39,0.2130,0,88,0.099,0.0,0.0 +2013,6,8,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,13.9,68,101506,0,0,366,0,0,0,0,0,0,0,270,4.1,5,5,3200.0,77777,9,999999999,39,0.2130,0,88,0.099,0.0,0.0 +2013,6,8,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,13.9,73,101596,0,0,355,0,0,0,0,0,0,0,280,3.6,3,3,3200.0,77777,9,999999999,39,0.2130,0,88,0.099,0.0,0.0 +2013,6,9,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,13.3,75,101646,0,0,349,0,0,0,0,0,0,0,270,3.6,3,3,3200.0,77777,9,999999999,37,0.2130,0,88,0.099,0.0,0.0 +2013,6,9,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,13.3,75,101646,0,0,335,0,0,0,0,0,0,0,270,3.6,0,0,3200.0,77777,9,999999999,37,0.2130,0,88,0.099,0.0,0.0 +2013,6,9,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,13.3,80,101716,0,0,344,0,0,0,0,0,0,0,290,3.6,3,3,3200.0,77777,9,999999999,37,0.2130,0,88,0.099,5.0,0.0 +2013,6,9,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,13.3,80,101756,0,0,344,0,0,0,0,0,0,0,290,3.1,3,3,3200.0,77777,9,999999999,37,0.2130,0,88,0.099,5.0,0.0 +2013,6,9,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.7,13.3,80,101756,65,406,344,12,64,9,1401,0,1052,334,290,3.1,3,3,3200.0,77777,9,999999999,37,0.2130,0,88,0.099,3.7,0.0 +2013,6,9,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,12.8,73,101846,296,1325,348,103,314,40,12045,5415,4687,1618,290,3.6,3,3,3200.0,77777,9,999999999,35,0.2130,0,88,0.099,0.0,0.0 +2013,6,9,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,12.2,65,101896,531,1325,338,256,543,72,30429,25674,8581,3218,280,5.1,0,0,3200.0,77777,9,999999999,33,0.2130,0,88,0.099,0.0,0.0 +2013,6,9,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.9,12.2,65,101896,753,1325,353,441,713,87,53904,39411,10666,4293,280,5.1,3,3,3200.0,77777,9,999999999,33,0.2130,0,88,0.099,0.0,0.0 +2013,6,9,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,12.2,55,101936,948,1325,367,616,798,101,66324,82310,14012,2505,300,5.7,3,3,3200.0,77777,9,999999999,33,0.2130,0,88,0.099,0.0,0.0 +2013,6,9,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,12.2,50,101907,1102,1325,375,689,594,240,82282,42413,28819,11619,285,3.1,3,3,3200.0,77777,9,999999999,33,0.2130,0,88,0.099,0.0,0.0 +2013,6,9,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.3,12.2,50,101907,1204,1325,375,781,535,317,92604,41149,37823,14708,282,3.1,3,3,3200.0,77777,9,999999999,33,0.2130,0,88,0.099,0.0,0.0 +2013,6,9,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,10.6,40,101837,1248,1325,387,652,245,431,76005,21408,50599,18428,300,4.6,5,5,3200.0,77777,9,999999999,28,0.2130,0,88,0.099,0.0,0.0 +2013,6,9,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,10.6,38,101807,1230,1325,416,672,257,432,78133,22614,50584,18361,290,4.1,9,9,3200.0,1981,9,999999999,28,0.2130,0,88,0.099,0.0,0.0 +2013,6,9,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,26.1,10.6,38,101807,1152,1325,408,591,176,432,67964,15922,50029,17908,290,4.1,8,8,3200.0,1981,9,999999999,28,0.2130,0,88,0.099,0.0,0.0 +2013,6,9,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,11.1,38,101797,1020,1325,420,532,176,383,60542,15759,43877,15750,280,4.6,9,9,3200.0,2438,9,999999999,29,0.2130,0,88,0.099,0.0,0.0 +2013,6,9,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,11.7,39,101797,841,1325,421,413,128,323,46263,11259,36408,12524,270,5.1,9,9,3200.0,6706,9,999999999,31,0.2130,0,88,0.099,0.0,0.0 +2013,6,9,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,26.7,11.7,39,101797,629,1325,398,446,559,156,50932,36955,17894,6466,270,5.1,5,5,3200.0,6706,9,999999999,31,0.2130,0,88,0.099,0.0,0.0 +2013,6,9,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,10.0,37,101837,398,1325,390,333,615,86,37834,27454,9804,3332,290,5.7,5,5,3200.0,77777,9,999999999,26,0.2130,0,88,0.099,0.0,0.0 +2013,6,9,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,10.6,40,101917,163,1325,410,161,418,57,17319,2320,6155,1661,290,4.1,9,9,3200.0,7620,9,999999999,28,0.2130,0,88,0.099,0.0,0.0 +2013,6,9,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.0,10.6,40,101917,0,971,387,0,0,0,0,0,0,0,290,4.1,5,5,3200.0,7620,9,999999999,28,0.2130,0,88,0.100,0.0,0.0 +2013,6,9,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,11.7,48,102017,0,0,374,0,0,0,0,0,0,0,280,2.6,3,3,3200.0,77777,9,999999999,31,0.2130,0,88,0.100,0.0,0.0 +2013,6,9,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,11.7,51,102056,0,0,353,0,0,0,0,0,0,0,260,3.1,0,0,3200.0,77777,9,999999999,31,0.2130,0,88,0.100,0.0,0.0 +2013,6,9,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,11.7,51,102056,0,0,353,0,0,0,0,0,0,0,260,3.1,0,0,3200.0,77777,9,999999999,31,0.2130,0,88,0.100,0.0,0.0 +2013,6,9,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,12.2,59,102096,0,0,346,0,0,0,0,0,0,0,290,4.1,0,0,3200.0,77777,9,999999999,33,0.2130,0,88,0.100,0.0,0.0 +2013,6,10,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,12.2,61,102076,0,0,344,0,0,0,0,0,0,0,300,3.1,0,0,3200.0,77777,9,999999999,33,0.2140,0,88,0.100,0.0,0.0 +2013,6,10,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,12.2,61,102076,0,0,344,0,0,0,0,0,0,0,300,3.1,0,0,3200.0,77777,9,999999999,33,0.2140,0,88,0.100,0.0,0.0 +2013,6,10,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,12.2,65,102096,0,0,380,0,0,0,0,0,0,0,290,2.6,9,9,3200.0,7620,9,999999999,33,0.2140,0,88,0.100,0.0,0.0 +2013,6,10,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,12.2,68,102146,0,0,356,0,0,0,0,0,0,0,310,2.6,5,5,3200.0,77777,9,999999999,33,0.2140,0,88,0.100,0.0,0.0 +2013,6,10,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.3,12.2,68,102146,66,411,356,6,0,6,577,0,581,232,310,2.6,5,5,3200.0,77777,9,999999999,33,0.2140,0,88,0.100,0.0,0.0 +2013,6,10,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,12.8,73,102206,297,1325,385,68,83,50,7814,1749,5760,1950,40,1.5,10,10,3200.0,6096,9,999999999,35,0.2140,0,88,0.100,0.0,0.0 +2013,6,10,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,12.2,70,102256,531,1325,385,172,141,118,19667,8046,13546,4826,70,2.6,10,10,3200.0,6096,9,999999999,33,0.2140,0,88,0.100,0.0,0.0 +2013,6,10,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,12.2,70,102256,754,1325,385,362,380,162,42188,25286,18965,7282,70,2.6,10,10,3200.0,6096,9,999999999,33,0.2140,0,88,0.100,0.0,0.0 +2013,6,10,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,13.3,73,102246,948,1325,389,516,449,229,60409,32407,26953,10630,70,4.1,10,10,3200.0,7620,9,999999999,37,0.2140,0,88,0.100,0.0,0.0 +2013,6,10,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,12.8,75,102265,1102,1325,382,416,175,297,48852,13446,35089,13699,70,3.6,10,10,3200.0,4877,9,999999999,35,0.2140,0,88,0.100,0.0,0.0 +2013,6,10,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.2,12.8,75,102265,1204,1325,382,450,82,381,52582,6766,44821,16781,70,3.6,10,10,3200.0,4877,9,999999999,35,0.2140,0,88,0.100,0.0,0.0 +2013,6,10,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,13.3,80,102255,1248,1325,380,472,64,413,55121,5368,48570,17925,90,3.6,10,10,3200.0,4267,9,999999999,37,0.2140,0,88,0.100,0.0,0.0 +2013,6,10,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,13.3,78,102166,1231,1325,383,559,117,449,64698,10260,52343,18813,80,3.6,10,10,3200.0,2896,9,999999999,37,0.2140,0,88,0.100,0.0,0.0 +2013,6,10,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.2,13.3,78,102166,1153,1325,383,430,70,365,50038,5740,42757,16076,80,3.6,10,10,3200.0,2896,9,999999999,37,0.2140,0,88,0.100,0.0,0.0 +2013,6,10,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,13.9,87,102105,1021,1325,378,393,51,351,44966,4282,40422,14932,80,3.6,10,10,3200.0,3048,0,919999999,39,0.2140,0,88,0.100,0.0,0.0 +2013,6,10,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,13.9,84,102036,843,1325,381,294,30,272,33356,2384,31040,11289,90,3.1,10,10,3200.0,3048,0,919999999,39,0.2140,0,88,0.100,0.0,0.0 +2013,6,10,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.7,13.9,84,102036,631,1325,381,251,78,212,27927,5815,23713,7968,90,3.1,10,10,3200.0,3048,0,919999999,39,0.2140,0,88,0.100,0.0,0.0 +2013,6,10,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,14.4,96,101925,400,1325,373,123,2,122,13549,104,13498,4255,60,3.6,10,10,3200.0,2896,0,919999999,41,0.2140,0,88,0.100,0.0,0.0 +2013,6,10,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,15.0,14.4,96,101905,165,1325,373,69,1,68,7300,10,7225,1806,80,3.1,10,10,9656.0,2896,0,919999999,41,0.2140,0,88,0.100,0.0,0.0 +2013,6,10,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,15.0,14.4,96,101905,0,984,373,0,0,0,0,0,0,0,80,3.1,10,10,9000.0,2896,0,919999999,41,0.2140,0,88,0.100,5.0,0.0 +2013,6,10,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,15.0,13.9,93,101705,0,0,372,0,0,0,0,0,0,0,90,5.7,10,10,8047.0,2134,0,919999999,39,0.2140,0,88,0.100,5.0,0.0 +2013,6,10,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,14.0,94,101281,0,0,372,0,0,0,0,0,0,0,100,6.2,10,10,8047.0,1829,0,919999999,39,0.2140,0,88,0.100,5.0,0.0 +2013,6,10,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,14.4,13.3,93,101725,0,0,368,0,0,0,0,0,0,0,110,5.1,10,10,4800.0,1829,0,919999999,37,0.2140,0,88,0.100,5.0,0.0 +2013,6,10,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,13.3,93,101545,0,0,368,0,0,0,0,0,0,0,100,7.2,10,10,4800.0,152,0,919999999,37,0.2140,0,88,0.100,5.0,0.0 +2013,6,11,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.9,12.8,93,101455,0,0,365,0,0,0,0,0,0,0,100,8.8,10,10,6437.0,213,0,919999999,35,0.2150,0,88,0.100,5.0,0.0 +2013,6,11,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,13.9,12.8,93,101455,0,0,365,0,0,0,0,0,0,0,100,8.8,10,10,6000.0,213,0,919999999,35,0.2150,0,88,0.100,5.0,0.0 +2013,6,11,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,14.0,13.0,94,101280,0,0,366,0,0,0,0,0,0,0,80,8.8,10,10,3219.0,152,0,919999999,36,0.2150,0,88,0.100,5.0,0.0 +2013,6,11,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,14.0,13.0,94,101280,0,0,366,0,0,0,0,0,0,0,70,8.8,10,10,4023.0,152,0,919999999,36,0.2150,0,88,0.100,4.7,0.0 +2013,6,11,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,13.9,12.8,93,101016,66,414,365,1,0,1,96,0,97,41,70,8.2,10,10,9000.0,152,0,919999999,35,0.2150,0,88,0.100,0.0,0.0 +2013,6,11,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,14.0,13.0,94,101280,297,1325,366,19,0,19,1864,0,1879,828,60,5.1,10,10,2414.0,152,0,919999999,36,0.2150,0,88,0.100,0.0,0.0 +2013,6,11,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,14.4,13.9,97,100666,532,1325,369,82,2,81,9649,96,9560,3562,40,3.1,10,10,805.0,91,0,919999999,39,0.2150,0,88,0.100,0.0,0.0 +2013,6,11,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,14.4,13.9,97,100666,754,1325,369,203,45,179,23447,3053,20774,7869,40,3.1,10,10,800.0,91,0,919999999,39,0.2150,0,88,0.100,0.0,0.0 +2013,6,11,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,15.6,14.4,93,100536,948,1325,376,207,26,194,24531,1745,23104,9323,320,2.6,10,10,402.0,91,0,919999999,41,0.2150,0,88,0.100,0.0,0.0 +2013,6,11,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,15.6,13.9,90,100556,1102,1325,375,219,8,212,26376,538,25667,10503,330,4.6,10,10,2414.0,152,0,919999999,39,0.2150,0,88,0.100,0.0,0.0 +2013,6,11,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,15.6,13.9,90,100556,1204,1325,375,283,16,269,33948,1138,32459,12958,330,4.6,10,10,2400.0,152,0,919999999,39,0.2150,0,88,0.100,0.0,0.0 +2013,6,11,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.0,14.0,88,101281,1248,1325,377,330,20,312,39370,1483,37457,14662,290,4.1,10,10,2400.0,213,0,919999999,39,0.2150,0,88,0.100,0.0,0.0 +2013,6,11,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.0,13.0,77,101281,1231,1325,381,305,16,290,36532,1172,34947,13813,280,3.6,10,10,2400.0,335,0,919999999,36,0.2150,0,88,0.100,0.0,0.0 +2013,6,11,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.2,13.9,81,100476,1154,1325,384,262,12,251,31379,844,30232,12156,330,3.6,10,10,2400.0,335,0,919999999,39,0.2150,0,88,0.100,0.0,0.0 +2013,6,11,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,13.9,81,100356,1022,1325,384,310,25,290,36018,1929,33897,13111,330,2.6,10,10,2400.0,457,0,919999999,39,0.2150,0,88,0.100,0.0,0.0 +2013,6,11,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,13.3,78,100306,844,1325,383,308,44,278,34906,3550,31691,11463,350,2.6,10,10,2400.0,457,0,919999999,36,0.2150,0,88,0.100,0.0,0.0 +2013,6,11,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.2,13.3,78,100306,632,1325,383,249,65,215,27694,4909,24040,8051,350,2.6,10,10,2400.0,457,0,919999999,36,0.2150,0,88,0.100,0.0,0.0 +2013,6,11,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.9,12.8,93,100196,401,1325,365,126,24,112,14002,1208,12497,4039,70,5.7,10,10,8047.0,457,0,919999999,35,0.2150,0,88,0.100,0.0,0.0 +2013,6,11,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,14.0,13.0,94,101280,167,1325,366,10,0,10,970,0,977,413,60,5.7,10,10,3219.0,396,0,919999999,36,0.2150,0,88,0.100,0.0,0.0 +2013,6,11,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,13.3,12.2,93,100156,0,996,361,0,0,0,0,0,0,0,40,5.1,10,10,4800.0,396,0,919999999,33,0.2150,0,88,0.100,5.0,0.0 +2013,6,11,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.3,12.2,93,100226,0,0,361,0,0,0,0,0,0,0,80,1.5,10,10,8047.0,549,0,919999999,33,0.2150,0,88,0.100,5.0,0.0 +2013,6,11,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,12.2,89,100186,0,0,364,0,0,0,0,0,0,0,7,0.0,10,10,8047.0,274,0,919999999,33,0.2150,0,88,0.100,4.2,0.0 +2013,6,11,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.9,12.2,89,100186,0,0,364,0,0,0,0,0,0,0,358,0.0,10,10,8047.0,274,0,919999999,33,0.2150,0,88,0.100,0.0,0.0 +2013,6,11,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.0,13.0,100,101280,0,0,361,0,0,0,0,0,0,0,180,2.1,10,10,9656.0,305,0,919999999,36,0.2150,0,88,0.100,0.0,0.0 +2013,6,12,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.9,13.3,96,100096,0,0,366,0,0,0,0,0,0,0,10,1.5,10,10,4828.0,122,0,919999999,37,0.2150,0,88,0.100,0.0,0.0 +2013,6,12,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,13.9,13.3,96,100096,0,0,366,0,0,0,0,0,0,0,10,1.5,10,10,4800.0,122,0,919999999,37,0.2150,0,88,0.100,0.0,0.0 +2013,6,12,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.9,13.3,96,100086,0,0,366,0,0,0,0,0,0,0,310,1.5,10,10,4828.0,183,0,919999999,37,0.2150,0,88,0.100,0.0,0.0 +2013,6,12,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,14.0,13.0,94,101280,0,0,366,0,0,0,0,0,0,0,285,0.0,10,10,8047.0,122,0,919999999,36,0.2150,0,88,0.100,0.0,0.0 +2013,6,12,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,13.9,13.3,96,100116,67,417,366,5,0,5,481,0,484,196,360,2.1,10,10,9000.0,122,0,919999999,37,0.2150,0,88,0.100,0.0,0.0 +2013,6,12,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,14.0,13.0,94,101280,297,1324,366,54,21,49,6216,433,5654,1920,330,3.6,10,10,4828.0,640,0,919999999,36,0.2150,0,88,0.100,0.0,0.0 +2013,6,12,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,16.1,13.3,83,100196,532,1324,367,185,195,113,21214,10768,13007,4670,290,5.1,9,9,4828.0,3658,0,919999999,36,0.2150,0,88,0.100,0.0,0.0 +2013,6,12,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,16.1,13.3,83,100196,754,1324,359,290,202,199,33229,14403,22917,8515,290,5.1,8,8,4800.0,3658,0,919999999,36,0.2150,0,88,0.100,0.0,0.0 +2013,6,12,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,11.7,70,100206,948,1324,370,496,500,155,59902,32232,18801,7731,300,10.3,9,9,4800.0,732,0,919999999,31,0.2150,0,88,0.100,0.0,0.0 +2013,6,12,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.0,12.0,68,101281,1102,1324,375,423,236,240,50527,16880,28826,11621,300,9.8,9,9,4800.0,1036,0,919999999,32,0.2150,0,88,0.100,0.0,0.0 +2013,6,12,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.3,11.1,63,100237,1204,1324,367,668,484,263,80411,35110,31842,12727,300,7.2,8,8,4800.0,1036,0,919999999,29,0.2150,0,88,0.100,0.0,0.0 +2013,6,12,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,10.6,53,100317,1249,1324,387,893,775,178,111357,49876,22304,9211,310,9.8,9,9,4800.0,1676,0,919999999,28,0.2150,0,88,0.100,0.0,0.0 +2013,6,12,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,10.0,51,100327,1232,1324,386,733,319,435,85233,28252,50941,18454,320,9.3,9,9,4800.0,1250,0,919999999,26,0.2150,0,88,0.100,0.0,0.0 +2013,6,12,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.6,10.0,51,100327,1155,1324,378,684,285,428,78777,25746,49639,17827,320,9.3,8,8,4800.0,1250,0,919999999,26,0.2150,0,88,0.100,0.0,0.0 +2013,6,12,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,10.6,51,100427,1023,1324,400,414,108,318,47859,8913,36989,13999,330,7.2,10,10,4800.0,1829,0,919999999,28,0.2150,0,88,0.100,0.0,0.0 +2013,6,12,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,12.2,61,100507,845,1324,396,285,41,256,32546,3218,29399,10862,340,5.7,10,10,4800.0,1981,0,919999999,32,0.2150,0,88,0.100,0.0,0.0 +2013,6,12,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,12.2,61,100507,634,1324,396,180,23,169,20438,1566,19279,6881,340,5.7,10,10,4800.0,1981,0,919999999,32,0.2150,0,88,0.100,0.0,0.0 +2013,6,12,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,13.3,75,100636,403,1324,375,136,33,126,14969,1780,13929,4363,360,3.6,9,9,4800.0,2286,0,919999999,36,0.2150,0,88,0.100,0.0,0.0 +2013,6,12,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,11.7,70,100726,169,1324,381,57,0,57,5535,0,5575,1694,330,4.6,10,10,4800.0,1524,0,919999999,31,0.2150,0,88,0.100,0.0,0.0 +2013,6,12,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.2,11.7,70,100726,0,1007,381,0,0,0,0,0,0,0,330,4.6,10,10,4800.0,1524,0,919999999,31,0.2150,0,88,0.100,0.0,0.0 +2013,6,12,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,12.2,70,100876,0,0,385,0,0,0,0,0,0,0,340,2.6,10,10,4800.0,1829,0,919999999,33,0.2150,0,88,0.100,0.0,0.0 +2013,6,12,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,10.6,61,100906,0,0,385,0,0,0,0,0,0,0,340,4.6,10,10,4800.0,1463,0,919999999,28,0.2150,0,88,0.100,0.0,0.0 +2013,6,12,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.3,10.6,61,100906,0,0,348,0,0,0,0,0,0,0,340,4.6,3,3,4800.0,1463,0,919999999,28,0.2150,0,88,0.100,0.0,0.0 +2013,6,12,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,10.6,67,100856,0,0,327,0,0,0,0,0,0,0,290,3.6,0,0,4800.0,77777,0,919999999,28,0.2150,0,88,0.100,0.0,0.0 +2013,6,13,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,10.6,72,100846,0,0,336,0,0,0,0,0,0,0,290,3.6,3,3,4800.0,77777,0,919999999,28,0.2160,0,88,0.100,0.0,0.0 +2013,6,13,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.6,10.6,72,100846,0,0,336,0,0,0,0,0,0,0,290,3.6,3,3,4800.0,77777,0,919999999,28,0.2160,0,88,0.100,0.0,0.0 +2013,6,13,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,10.6,75,100816,0,0,319,0,0,0,0,0,0,0,300,3.6,0,0,4800.0,77777,0,919999999,28,0.2160,0,88,0.100,0.0,0.0 +2013,6,13,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,10.6,75,100866,0,0,319,0,0,0,0,0,0,0,290,4.6,0,0,4800.0,77777,0,919999999,28,0.2160,0,88,0.100,0.0,0.0 +2013,6,13,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.0,10.6,75,100866,67,420,338,13,0,13,1252,0,1260,457,290,4.6,5,5,4800.0,77777,0,919999999,28,0.2160,0,88,0.100,0.0,0.0 +2013,6,13,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,10.6,65,100886,297,1324,369,65,108,50,7482,2447,5769,1952,290,2.1,9,9,4800.0,6096,0,919999999,28,0.2160,0,88,0.100,0.0,0.0 +2013,6,13,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,10.6,61,100896,532,1324,375,229,420,91,26758,22008,10668,3927,280,2.1,9,9,4800.0,6096,0,919999999,28,0.2160,0,88,0.100,0.0,0.0 +2013,6,13,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.3,10.6,61,100896,753,1324,367,276,233,173,32031,16134,20171,7667,280,2.1,8,8,4800.0,6096,0,919999999,28,0.2160,0,88,0.100,0.0,0.0 +2013,6,13,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,12.2,68,100846,948,1324,387,333,172,243,38833,12837,28494,11123,130,2.6,10,10,4800.0,5182,0,919999999,33,0.2160,0,88,0.100,0.0,0.0 +2013,6,13,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,11.7,61,100826,1102,1324,393,381,61,333,44376,4959,39032,14880,130,3.1,10,10,4800.0,3048,0,919999999,31,0.2160,0,88,0.100,0.0,0.0 +2013,6,13,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,19.4,11.7,61,100826,1204,1324,393,441,67,385,51530,5603,45292,16905,130,3.1,10,10,4800.0,3048,0,919999999,31,0.2160,0,88,0.100,0.0,0.0 +2013,6,13,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,13.3,80,100836,1249,1324,380,319,20,300,38195,1472,36142,14228,150,3.1,10,10,4800.0,3048,0,919999999,37,0.2160,0,88,0.100,0.0,0.0 +2013,6,13,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,11.7,72,100686,1232,1324,378,286,16,271,34467,1158,32852,13096,180,1.5,10,10,4800.0,3048,0,919999999,31,0.2160,0,88,0.100,0.0,0.0 +2013,6,13,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.7,11.7,72,100686,1155,1324,378,217,9,209,26396,610,25555,10462,180,1.5,10,10,4800.0,3048,0,919999999,31,0.2160,0,88,0.100,0.0,0.0 +2013,6,13,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,15.0,12.2,83,100776,1024,1324,370,183,5,178,22112,330,21609,8917,190,4.6,10,10,9656.0,2134,0,919999999,33,0.2160,0,88,0.100,0.0,0.0 +2013,6,13,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,11.7,87,100716,846,1324,364,156,11,149,18598,709,17839,7161,150,5.7,10,10,9656.0,2286,0,919999999,31,0.2160,0,88,0.100,0.0,0.0 +2013,6,13,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.9,11.7,87,100716,635,1324,364,50,0,50,5058,0,5101,2452,150,5.7,10,10,9656.0,2286,0,919999999,31,0.2160,0,88,0.100,0.0,0.0 +2013,6,13,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.9,10.6,80,100646,405,1324,363,59,0,59,5855,0,5901,2476,120,3.6,10,10,6437.0,1158,0,919999999,28,0.2160,0,88,0.100,0.0,0.0 +2013,6,13,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,12.8,11.1,89,100686,171,1324,358,70,65,58,7548,455,6278,1719,80,2.6,10,10,8047.0,1402,0,919999999,30,0.2160,0,88,0.100,0.0,0.0 +2013,6,13,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,12.8,11.1,89,100686,0,1018,358,0,0,0,0,0,0,0,80,2.6,10,10,8000.0,1402,0,919999999,30,0.2160,0,88,0.100,5.0,0.0 +2013,6,13,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,12.2,10.6,90,100645,0,0,354,0,0,0,0,0,0,0,60,4.6,10,10,9656.0,1280,0,919999999,28,0.2160,0,88,0.100,5.0,0.0 +2013,6,13,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,12.2,10.6,90,100555,0,0,354,0,0,0,0,0,0,0,50,5.1,10,10,9656.0,2134,0,919999999,28,0.2160,0,88,0.100,5.0,0.0 +2013,6,13,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,12.2,10.6,90,100555,0,0,354,0,0,0,0,0,0,0,50,5.1,10,10,9000.0,2134,0,919999999,28,0.2160,0,88,0.100,5.0,0.0 +2013,6,13,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,12.0,11.0,94,101280,0,0,353,0,0,0,0,0,0,0,60,8.2,10,10,6437.0,732,0,919999999,29,0.2160,0,88,0.100,5.0,0.0 +2013,6,14,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,11.7,10.0,89,100346,0,0,351,0,0,0,0,0,0,0,40,8.8,10,10,8047.0,1676,0,919999999,26,0.2160,0,88,0.100,5.0,0.0 +2013,6,14,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,11.7,10.0,89,100346,0,0,351,0,0,0,0,0,0,0,40,8.8,10,10,8000.0,1676,0,919999999,26,0.2160,0,88,0.100,5.0,0.0 +2013,6,14,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,12.2,11.1,93,100366,0,0,355,0,0,0,0,0,0,0,50,8.2,10,10,8047.0,213,0,919999999,29,0.2160,0,88,0.100,5.0,0.0 +2013,6,14,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,11.1,93,100386,0,0,355,0,0,0,0,0,0,0,30,7.2,10,10,8047.0,274,0,919999999,29,0.2160,0,88,0.100,0.9,0.0 +2013,6,14,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.2,11.1,93,100386,67,421,355,4,0,4,385,0,388,159,30,7.2,10,10,8047.0,274,0,919999999,29,0.2160,0,88,0.100,0.0,0.0 +2013,6,14,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,12.0,11.0,94,101280,297,1324,353,9,0,9,884,0,891,405,30,6.2,10,10,9656.0,274,0,919999999,29,0.2160,0,88,0.100,0.0,0.0 +2013,6,14,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,10.0,86,100575,531,1324,353,77,0,77,7728,0,7792,3412,30,5.7,10,10,9656.0,2286,0,919999999,26,0.2160,0,88,0.100,0.0,0.0 +2013,6,14,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.2,10.0,86,100575,753,1324,353,117,0,117,11969,0,12076,5569,30,5.7,10,10,9656.0,2286,0,919999999,26,0.2160,0,88,0.100,0.0,0.0 +2013,6,14,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,10.6,84,100556,948,1324,359,241,20,226,28291,1473,26670,10524,30,5.1,10,10,9656.0,2591,0,919999999,28,0.2160,0,88,0.100,0.0,0.0 +2013,6,14,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,11.1,75,100546,1102,1324,362,413,88,341,48031,7261,39911,15128,20,5.7,9,9,9656.0,2896,0,919999999,29,0.2160,0,88,0.100,0.0,0.0 +2013,6,14,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.6,11.1,75,100546,1204,1324,354,486,100,400,56640,8542,46938,17344,20,5.7,8,8,9656.0,2896,0,919999999,29,0.2160,0,88,0.100,0.0,0.0 +2013,6,14,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,8.3,56,100616,1249,1324,366,663,267,414,77649,23250,48824,17963,40,6.2,9,9,9656.0,2286,0,919999999,22,0.2160,0,88,0.100,0.0,0.0 +2013,6,14,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,10.0,58,100616,1232,1324,353,743,431,339,88108,34351,40459,15556,40,3.1,5,5,9656.0,77777,0,919999999,26,0.2160,0,88,0.100,0.0,0.0 +2013,6,14,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.3,10.0,58,100616,1156,1324,366,692,379,344,81103,31096,40576,15443,40,3.1,8,8,9656.0,77777,0,919999999,26,0.2160,0,88,0.100,0.0,0.0 +2013,6,14,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,11.1,61,100547,1025,1324,378,677,538,252,79709,40272,29836,11823,140,3.6,9,9,9656.0,5182,0,919999999,29,0.2160,0,88,0.100,0.0,0.0 +2013,6,14,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,11.1,51,100507,847,1324,393,522,300,308,58793,25834,34902,12257,340,3.1,9,9,9656.0,4877,0,919999999,29,0.2160,0,88,0.100,0.0,0.0 +2013,6,14,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,11.1,51,100507,637,1324,371,441,488,185,49772,34975,20982,7347,340,3.1,5,5,9656.0,4877,0,919999999,29,0.2160,0,88,0.100,0.0,0.0 +2013,6,14,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,10.0,43,100537,406,1324,378,310,524,114,34506,27761,12741,4115,300,3.1,5,5,9656.0,77777,0,919999999,26,0.2160,0,88,0.100,0.0,0.0 +2013,6,14,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,9.4,44,100557,172,1324,372,167,442,55,18123,2829,5990,1679,280,3.6,5,5,9656.0,77777,0,919999999,24,0.2160,0,88,0.100,0.0,0.0 +2013,6,14,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,9.4,44,100557,0,1028,372,0,0,0,0,0,0,0,280,3.6,5,5,9656.0,77777,9,999999999,24,0.2160,0,88,0.100,0.0,0.0 +2013,6,14,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,10.6,53,100647,0,0,365,0,0,0,0,0,0,0,280,3.6,5,5,9656.0,77777,9,999999999,28,0.2160,0,88,0.100,0.0,0.0 +2013,6,14,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,11.7,61,100647,0,0,360,0,0,0,0,0,0,0,280,4.6,5,5,9656.0,77777,9,999999999,31,0.2160,0,88,0.100,3.0,0.0 +2013,6,14,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,19.4,11.7,61,100647,0,0,360,0,0,0,0,0,0,0,280,4.6,5,5,9656.0,77777,9,999999999,31,0.2160,0,88,0.100,0.3,0.0 +2013,6,14,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,11.1,63,100806,0,0,354,0,0,0,0,0,0,0,330,3.1,5,5,9656.0,77777,9,999999999,29,0.2160,0,88,0.100,0.0,0.0 +2013,6,15,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,10.6,59,100806,0,0,351,0,0,0,0,0,0,0,320,3.6,3,3,9656.0,77777,9,999999999,28,0.2160,0,88,0.100,0.0,0.0 +2013,6,15,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.9,10.6,59,100806,0,0,337,0,0,0,0,0,0,0,320,3.6,0,0,9656.0,77777,9,999999999,28,0.2160,0,88,0.100,0.0,0.0 +2013,6,15,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,10.6,67,100906,0,0,341,0,0,0,0,0,0,0,290,5.7,3,3,9656.0,77777,9,999999999,28,0.2160,0,88,0.100,0.0,0.0 +2013,6,15,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,8.9,60,100966,0,0,325,0,0,0,0,0,0,0,300,4.6,0,0,9656.0,77777,9,999999999,24,0.2160,0,88,0.100,0.0,0.0 +2013,6,15,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.7,8.9,60,100966,67,422,325,13,80,9,1525,0,1056,335,300,4.6,0,0,9656.0,77777,9,999999999,24,0.2160,0,88,0.100,0.0,0.0 +2013,6,15,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,7.8,54,101116,297,1324,326,110,367,36,13010,6971,4265,1479,310,4.1,0,0,9656.0,77777,9,999999999,21,0.2160,0,88,0.100,0.0,0.0 +2013,6,15,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,6.7,44,101146,531,1324,335,271,624,61,32716,30043,7381,2784,320,6.2,0,0,9656.0,77777,9,999999999,19,0.2160,0,88,0.100,0.0,0.0 +2013,6,15,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,19.4,6.7,44,101146,753,1324,335,457,767,79,56416,43907,9779,3936,320,6.2,0,0,9656.0,77777,9,999999999,19,0.2160,0,88,0.100,0.0,0.0 +2013,6,15,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,4.4,30,101247,947,1324,348,638,851,89,67859,86633,12407,2388,330,4.6,0,0,9656.0,77777,9,999999999,15,0.2160,0,88,0.100,0.0,0.0 +2013,6,15,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,4.4,29,101257,1101,1324,350,792,900,96,84014,92035,12935,3377,330,7.2,0,0,9656.0,77777,9,999999999,15,0.2160,0,88,0.100,0.0,0.0 +2013,6,15,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.3,4.4,29,101257,1204,1324,350,908,934,96,96258,95688,12665,4671,330,7.2,0,0,9656.0,77777,9,999999999,15,0.2160,0,88,0.100,0.0,0.0 +2013,6,15,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,5.6,30,101227,1249,1324,372,973,947,97,103282,97234,12672,5789,320,4.6,3,3,9656.0,77777,9,999999999,17,0.2160,0,88,0.100,0.0,0.0 +2013,6,15,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,6.1,31,101197,1233,1324,379,983,945,99,104383,97070,12964,5415,280,6.2,5,5,9656.0,77777,9,999999999,18,0.2160,0,88,0.100,0.0,0.0 +2013,6,15,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,24.4,6.1,31,101197,1157,1324,379,936,924,103,99329,94781,13671,4136,280,6.2,5,5,9656.0,77777,9,999999999,18,0.2160,0,88,0.100,0.0,0.0 +2013,6,15,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,5.0,27,101107,1025,1324,383,840,897,101,89082,91581,13774,2916,290,4.1,5,5,9656.0,77777,9,999999999,16,0.2160,0,88,0.100,0.0,0.0 +2013,6,15,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,4.4,25,101097,849,1324,385,701,853,96,74384,86286,13566,2100,290,4.1,5,5,9656.0,77777,9,999999999,15,0.2160,0,88,0.100,0.0,0.0 +2013,6,15,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,26.1,4.4,25,101097,638,1324,385,533,789,86,64102,45422,10373,4009,290,4.1,5,5,9656.0,77777,9,999999999,15,0.2160,0,88,0.100,0.0,0.0 +2013,6,15,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,3.9,25,101107,408,1324,376,350,681,72,40555,30266,8367,2929,320,6.7,3,3,9656.0,77777,9,999999999,14,0.2160,0,88,0.100,0.0,0.0 +2013,6,15,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,3.9,27,101157,174,1324,373,172,486,50,18878,2993,5506,1594,300,4.6,5,5,9656.0,77777,9,999999999,14,0.2160,0,88,0.100,0.0,0.0 +2013,6,15,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.9,3.9,27,101157,0,1037,367,0,0,0,0,0,0,0,300,4.6,3,3,9656.0,77777,9,999999999,14,0.2160,0,88,0.100,0.0,0.0 +2013,6,15,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,7.2,39,101267,0,0,361,0,0,0,0,0,0,0,240,1.5,3,3,9656.0,77777,9,999999999,20,0.2160,0,88,0.100,0.0,0.0 +2013,6,15,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,9.4,54,101296,0,0,335,0,0,0,0,0,0,0,220,3.1,0,0,9656.0,77777,9,999999999,25,0.2160,0,88,0.100,0.0,0.0 +2013,6,15,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.9,9.4,54,101296,0,0,335,0,0,0,0,0,0,0,220,3.1,0,0,9656.0,77777,9,999999999,25,0.2160,0,88,0.100,0.0,0.0 +2013,6,15,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,7.8,47,101316,0,0,336,0,0,0,0,0,0,0,270,3.1,0,0,9656.0,77777,9,999999999,21,0.2160,0,88,0.100,0.0,0.0 +2013,6,16,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,7.2,45,101276,0,0,335,0,0,0,0,0,0,0,270,4.1,0,0,9656.0,77777,9,999999999,20,0.2160,0,88,0.100,0.0,0.0 +2013,6,16,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,19.4,7.2,45,101276,0,0,350,0,0,0,0,0,0,0,270,4.1,3,3,9656.0,77777,9,999999999,20,0.2160,0,88,0.100,0.0,0.0 +2013,6,16,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,7.2,50,101286,0,0,342,0,0,0,0,0,0,0,250,3.1,3,3,9656.0,77777,9,999999999,20,0.2160,0,88,0.100,0.0,0.0 +2013,6,16,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,6.7,52,101276,0,0,342,0,0,0,0,0,0,0,260,3.1,5,5,9656.0,77777,9,999999999,19,0.2160,0,88,0.100,0.0,0.0 +2013,6,16,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.7,6.7,52,101276,67,422,342,12,64,9,1409,0,1057,335,260,3.1,5,5,9656.0,77777,9,999999999,19,0.2160,0,88,0.100,0.0,0.0 +2013,6,16,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,7.2,48,101316,297,1323,370,99,275,42,11572,5916,4919,1689,270,3.6,9,9,9656.0,7620,9,999999999,20,0.2160,0,88,0.100,0.0,0.0 +2013,6,16,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,7.2,43,101336,531,1323,379,201,290,108,23208,16783,12515,4507,260,3.6,9,9,9656.0,7620,9,999999999,20,0.2160,0,88,0.100,0.0,0.0 +2013,6,16,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,7.2,43,101336,753,1323,371,351,376,179,40691,27081,20848,7867,260,3.6,8,8,9656.0,7620,9,999999999,20,0.2160,0,88,0.100,0.0,0.0 +2013,6,16,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,8.3,38,101247,947,1323,398,526,483,211,62146,35349,25056,9972,260,3.6,9,9,9656.0,7620,9,999999999,22,0.2160,0,88,0.100,0.0,0.0 +2013,6,16,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,8.3,36,101177,1101,1323,404,651,502,276,77080,38884,32869,12965,250,4.6,9,9,9656.0,4572,9,999999999,22,0.2160,0,88,0.100,0.0,0.0 +2013,6,16,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,24.4,8.3,36,101177,1204,1323,395,472,160,342,55767,13055,40667,15559,250,4.6,8,8,9656.0,4572,9,999999999,22,0.2160,0,88,0.100,0.0,0.0 +2013,6,16,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,10.0,40,101067,1249,1323,418,508,136,382,59825,11316,45291,17010,210,5.7,10,10,9656.0,4572,9,999999999,26,0.2160,0,88,0.100,0.0,0.0 +2013,6,16,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,11.7,45,100987,1233,1323,420,345,25,321,41052,1924,38437,14940,210,3.6,10,10,9656.0,4267,9,999999999,31,0.2160,0,88,0.100,0.0,0.0 +2013,6,16,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,24.4,11.7,45,100987,1157,1323,420,433,54,385,50264,4587,44994,16686,210,3.6,10,10,9656.0,4267,9,999999999,31,0.2160,0,88,0.100,0.0,0.0 +2013,6,16,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,12.2,51,100797,1026,1323,412,302,19,285,35204,1477,33420,12976,190,5.1,10,10,9656.0,3048,9,999999999,32,0.2160,0,88,0.100,0.0,0.0 +2013,6,16,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,12.8,53,100727,850,1323,413,211,7,206,24527,499,24067,9307,190,5.1,10,10,9656.0,2438,9,999999999,34,0.2160,0,88,0.100,0.0,0.0 +2013,6,16,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.8,12.8,53,100727,639,1323,413,177,10,171,20094,680,19505,6973,190,5.1,10,10,9656.0,2438,9,999999999,34,0.2160,0,88,0.100,0.0,0.0 +2013,6,16,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,13.9,59,100607,409,1323,399,151,122,113,16792,6122,12618,4107,210,5.7,9,9,9656.0,2591,9,999999999,38,0.2160,0,88,0.100,0.0,0.0 +2013,6,16,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,15.6,66,100577,175,1323,402,71,6,69,7538,66,7356,1894,210,4.6,9,9,9656.0,6096,9,999999999,46,0.2160,0,88,0.100,0.0,0.0 +2013,6,16,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,15.6,66,100577,0,1046,393,0,0,0,0,0,0,0,210,4.6,8,8,9656.0,6096,9,999999999,46,0.2160,0,88,0.100,0.0,0.0 +2013,6,16,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,16.1,73,100667,0,0,374,0,0,0,0,0,0,0,230,4.6,5,5,9656.0,77777,9,999999999,48,0.2160,0,88,0.100,0.0,0.0 +2013,6,16,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,16.7,78,100717,0,0,372,0,0,0,0,0,0,0,230,3.1,5,5,9656.0,77777,9,999999999,51,0.2160,0,88,0.100,0.0,0.0 +2013,6,16,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.6,16.7,78,100717,0,0,372,0,0,0,0,0,0,0,230,3.1,5,5,9656.0,77777,9,999999999,51,0.2160,0,88,0.100,0.0,0.0 +2013,6,16,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,13.9,61,100817,0,0,375,0,0,0,0,0,0,0,280,5.7,5,5,9656.0,77777,9,999999999,38,0.2160,0,88,0.100,0.0,0.0 +2013,6,17,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,13.9,65,100847,0,0,369,0,0,0,0,0,0,0,270,4.1,5,5,9656.0,77777,9,999999999,39,0.2160,0,88,0.100,0.0,0.0 +2013,6,17,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.6,13.9,65,100847,0,0,348,0,0,0,0,0,0,0,270,4.1,0,0,9656.0,77777,9,999999999,39,0.2160,0,88,0.100,0.0,0.0 +2013,6,17,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,13.9,76,100916,0,0,358,0,0,0,0,0,0,0,240,3.6,5,5,9656.0,77777,9,999999999,39,0.2160,0,88,0.100,0.0,0.0 +2013,6,17,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,13.9,76,100956,0,0,358,0,0,0,0,0,0,0,240,4.1,5,5,9656.0,77777,9,999999999,39,0.2160,0,88,0.100,0.0,0.0 +2013,6,17,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.3,13.9,76,100956,67,421,358,12,63,9,1403,0,1053,335,240,4.1,5,5,9656.0,77777,9,999999999,39,0.2160,0,88,0.100,0.0,0.0 +2013,6,17,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,14.4,70,101016,297,1323,367,103,318,39,12059,5015,4575,1585,240,4.1,5,5,9656.0,77777,9,999999999,41,0.2160,0,88,0.100,0.0,0.0 +2013,6,17,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,15.6,66,101047,530,1323,373,257,560,67,30647,24393,8010,3023,250,4.1,3,3,9656.0,77777,9,999999999,46,0.2160,0,88,0.100,0.0,0.0 +2013,6,17,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,15.6,66,101047,752,1323,373,436,704,88,53125,37142,10756,4337,250,4.1,3,3,9656.0,77777,9,999999999,46,0.2160,0,88,0.100,0.0,0.0 +2013,6,17,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,15.6,54,100997,947,1323,397,609,782,105,75526,43390,13068,5481,250,6.2,5,5,9656.0,77777,9,999999999,45,0.2160,0,88,0.100,0.0,0.0 +2013,6,17,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,15.6,51,100997,1101,1323,403,758,833,114,82115,87051,15264,3713,260,5.1,5,5,9656.0,77777,9,999999999,45,0.2160,0,88,0.100,0.0,0.0 +2013,6,17,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,26.7,15.6,51,100997,1204,1323,403,870,865,117,94119,90551,15312,5372,260,5.1,5,5,9656.0,77777,9,999999999,45,0.2160,0,88,0.100,0.0,0.0 +2013,6,17,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,14.4,41,100928,1249,1323,413,934,878,122,100499,91631,15763,6913,230,3.1,5,5,9656.0,77777,9,999999999,40,0.2160,0,88,0.100,0.0,0.0 +2013,6,17,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,13.3,38,100888,1233,1323,412,945,879,123,101339,91449,15930,6380,220,5.7,5,5,9656.0,77777,9,999999999,36,0.2160,0,88,0.100,0.0,0.0 +2013,6,17,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,28.9,13.3,38,100888,1158,1323,412,903,866,122,96909,89995,16064,4604,220,5.7,5,5,9656.0,77777,9,999999999,36,0.2160,0,88,0.100,0.0,0.0 +2013,6,17,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,12.8,37,100798,1027,1323,411,684,510,247,80612,37274,29272,11654,230,6.7,5,5,9656.0,77777,9,999999999,34,0.2160,0,88,0.100,0.0,0.0 +2013,6,17,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,13.3,40,100828,851,1323,433,285,213,109,34786,12356,13351,5477,260,4.6,9,9,9656.0,2896,9,999999999,36,0.2160,0,88,0.100,0.0,0.0 +2013,6,17,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,28.3,13.3,40,100828,640,1323,423,203,62,172,23033,4205,19608,7010,260,4.6,8,8,9656.0,2896,0,019999999,36,0.2160,0,88,0.100,0.0,0.0 +2013,6,17,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,19.0,17.0,88,101281,410,1323,397,87,5,85,9881,199,9687,3349,340,14.4,10,10,805.0,1829,0,019999999,53,0.2160,0,88,0.100,0.0,0.0 +2013,6,17,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.0,17.0,94,101281,177,1323,381,45,5,43,4970,0,4763,1453,180,4.1,9,9,805.0,3048,0,019999999,53,0.2160,0,88,0.100,0.0,0.0 +2013,6,17,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,16.7,93,101166,0,1054,371,0,0,0,0,0,0,0,170,4.6,8,8,805.0,3048,0,919999999,51,0.2160,0,88,0.098,5.0,0.0 +2013,6,17,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,15.6,84,101246,0,0,359,0,0,0,0,0,0,0,230,4.6,5,5,805.0,77777,0,919999999,46,0.2160,0,88,0.098,5.0,0.0 +2013,6,17,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,15.6,87,101186,0,0,357,0,0,0,0,0,0,0,240,5.1,5,5,805.0,77777,0,919999999,46,0.2160,0,88,0.098,0.9,0.0 +2013,6,17,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,15.6,87,101186,0,0,357,0,0,0,0,0,0,0,240,5.1,5,5,805.0,77777,0,919999999,46,0.2160,0,88,0.098,0.0,0.0 +2013,6,17,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,15.0,84,101206,0,0,356,0,0,0,0,0,0,0,230,3.6,5,5,805.0,77777,0,919999999,43,0.2160,0,88,0.098,0.0,0.0 +2013,6,18,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,15.0,84,101186,0,0,336,0,0,0,0,0,0,0,250,4.6,0,0,805.0,77777,0,919999999,43,0.2160,0,88,0.098,0.0,0.0 +2013,6,18,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,15.0,84,101186,0,0,336,0,0,0,0,0,0,0,250,4.6,0,0,805.0,77777,0,919999999,43,0.2160,0,88,0.098,0.0,0.0 +2013,6,18,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,15.0,84,101176,0,0,377,0,0,0,0,0,0,0,310,3.1,9,9,805.0,3353,0,919999999,43,0.2160,0,88,0.098,0.0,0.0 +2013,6,18,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,15.0,87,101186,0,0,385,0,0,0,0,0,0,0,240,2.6,10,10,805.0,3353,0,919999999,43,0.2160,0,88,0.098,0.0,0.0 +2013,6,18,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.2,15.0,87,101186,67,419,385,5,0,5,480,0,483,196,240,2.6,10,10,805.0,3353,0,919999999,43,0.2160,0,88,0.098,0.0,0.0 +2013,6,18,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,15.6,87,101276,296,1323,378,47,3,47,5417,53,5430,1854,230,2.6,9,9,805.0,5486,0,919999999,46,0.2160,0,88,0.098,0.0,0.0 +2013,6,18,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,15.6,79,101326,530,1323,387,208,303,97,24096,15125,11276,4134,10,2.1,9,9,805.0,5486,0,919999999,46,0.2160,0,88,0.098,0.0,0.0 +2013,6,18,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,19.4,15.6,79,101326,752,1323,378,365,429,163,42410,27470,19026,7313,10,2.1,8,8,805.0,5486,0,919999999,46,0.2160,0,88,0.098,0.0,0.0 +2013,6,18,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,14.4,66,101347,946,1323,394,451,310,266,52136,23484,30927,11884,50,3.1,9,9,805.0,5486,0,919999999,41,0.2160,0,88,0.098,0.0,0.0 +2013,6,18,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,14.4,66,101347,1100,1323,386,511,198,361,59032,16274,41979,15723,80,3.1,8,8,805.0,2438,0,919999999,41,0.2160,0,88,0.098,0.0,0.0 +2013,6,18,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,13.9,61,101327,1204,1323,375,696,399,345,81917,31224,40870,15658,80,4.1,5,5,805.0,77777,0,919999999,39,0.2160,0,88,0.098,0.0,0.0 +2013,6,18,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,15.0,70,101276,1249,1323,370,787,476,352,92987,36611,41866,16050,80,5.7,5,5,805.0,77777,0,919999999,43,0.2160,0,88,0.098,0.0,0.0 +2013,6,18,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,15.0,70,101276,1234,1323,370,858,631,267,103333,43844,32346,12946,70,7.2,5,5,805.0,77777,0,919999999,43,0.2160,0,88,0.098,0.0,0.0 +2013,6,18,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.6,15.0,70,101276,1158,1323,384,450,200,261,53734,14059,31347,12553,70,7.2,8,8,805.0,77777,0,919999999,43,0.2160,0,88,0.098,0.0,0.0 +2013,6,18,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,18.0,14.0,77,101281,1028,1323,388,208,10,198,24918,668,23840,9762,40,8.8,10,10,4023.0,1280,0,019999999,39,0.2160,0,88,0.098,0.0,0.0 +2013,6,18,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,16.0,14.0,88,101281,851,1323,347,122,0,122,12550,0,12667,6050,100,4.1,5,5,4023.0,77777,0,019999999,39,0.2160,0,88,0.098,0.0,0.0 +2013,6,18,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,15.6,14.4,93,101376,641,1323,376,145,4,142,16698,247,16422,6086,100,4.1,10,10,4000.0,77777,0,019999999,41,0.2160,0,88,0.098,0.0,0.0 +2013,6,18,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,15.0,13.0,88,101281,412,1323,371,141,33,129,15530,1826,14271,4484,80,4.6,10,10,9656.0,579,0,019999999,36,0.2160,0,88,0.098,0.0,0.0 +2013,6,18,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,13.3,90,101266,178,1323,361,56,0,56,5436,0,5475,1725,30,2.1,9,9,9656.0,3658,0,019999999,37,0.2160,0,88,0.098,0.0,0.0 +2013,6,18,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.0,13.3,90,101266,0,1062,371,0,0,0,0,0,0,0,30,2.1,10,10,9656.0,3658,9,999999999,37,0.2160,0,88,0.098,5.0,0.0 +2013,6,18,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,13.9,90,101346,0,0,375,0,0,0,0,0,0,0,20,1.5,10,10,9656.0,1006,9,999999999,39,0.2160,0,88,0.098,5.0,0.0 +2013,6,18,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.0,13.0,82,101281,0,0,376,0,0,0,0,0,0,0,20,2.1,10,10,9656.0,1158,9,999999999,36,0.2160,0,88,0.098,5.0,0.0 +2013,6,18,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.6,13.3,86,101326,0,0,374,0,0,0,0,0,0,0,30,2.6,10,10,9656.0,1158,0,919999999,37,0.2160,0,88,0.098,1.0,0.0 +2013,6,18,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,13.9,93,101276,0,0,372,0,0,0,0,0,0,0,360,3.1,10,10,9656.0,1280,0,919999999,39,0.2160,0,88,0.098,0.0,0.0 +2013,6,19,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,13.0,88,101281,0,0,371,0,0,0,0,0,0,0,350,4.1,10,10,9656.0,1341,0,919999999,36,0.2170,0,88,0.098,0.0,0.0 +2013,6,19,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.0,12.8,87,101276,0,0,371,0,0,0,0,0,0,0,350,4.6,10,10,9656.0,1341,0,919999999,35,0.2170,0,88,0.098,0.0,0.0 +2013,6,19,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,12.2,87,101246,0,0,357,0,0,0,0,0,0,0,350,4.1,9,9,9656.0,1981,0,919999999,33,0.2170,0,88,0.098,0.0,0.0 +2013,6,19,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,11.7,84,101276,0,0,356,0,0,0,0,0,0,0,10,3.6,9,9,9656.0,2438,0,919999999,31,0.2170,0,88,0.098,0.0,0.0 +2013,6,19,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,14.4,11.7,84,101276,66,417,336,12,61,9,1404,0,1054,334,10,3.6,5,5,9656.0,2438,0,919999999,31,0.2170,0,88,0.098,0.0,0.0 +2013,6,19,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,12.8,81,101336,296,1323,346,89,234,45,10312,4473,5225,1787,340,3.6,5,5,9656.0,77777,0,919999999,35,0.2170,0,88,0.098,0.0,0.0 +2013,6,19,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,12.2,72,101396,529,1323,371,222,390,95,25819,20334,11086,4063,10,5.1,9,9,9656.0,7620,0,919999999,33,0.2170,0,88,0.098,0.0,0.0 +2013,6,19,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.2,12.2,72,101396,751,1323,363,407,553,120,48540,33307,14365,5686,10,5.1,8,8,9656.0,7620,0,919999999,33,0.2170,0,88,0.098,0.0,0.0 +2013,6,19,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,9.4,50,101496,946,1323,361,603,723,124,74131,44964,15302,6362,10,5.7,5,5,9656.0,77777,0,919999999,25,0.2170,0,88,0.098,0.0,0.0 +2013,6,19,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,8.9,46,101566,1100,1323,365,781,865,112,83147,88992,14973,3675,40,5.1,5,5,9656.0,77777,0,919999999,24,0.2170,0,88,0.098,0.0,0.0 +2013,6,19,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,8.9,46,101566,1203,1323,365,895,893,119,95053,92010,15515,5430,40,5.1,5,5,9656.0,77777,0,919999999,24,0.2170,0,88,0.098,0.0,0.0 +2013,6,19,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,10.6,53,101576,1249,1323,365,961,905,124,102293,93588,15979,7007,80,5.7,5,5,9656.0,77777,0,919999999,28,0.2170,0,88,0.098,0.0,0.0 +2013,6,19,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,11.7,59,101596,1234,1323,363,973,904,127,103792,93671,16402,6547,90,6.7,5,5,9656.0,77777,0,919999999,31,0.2170,0,88,0.098,0.0,0.0 +2013,6,19,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,11.7,59,101596,1158,1323,358,886,740,214,107643,50453,26136,10677,90,6.7,3,3,9656.0,77777,0,919999999,31,0.2170,0,88,0.098,0.0,0.0 +2013,6,19,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,10.6,61,101676,1028,1323,348,837,863,123,89227,88833,16597,3160,130,5.1,3,3,9656.0,77777,0,919999999,28,0.2170,0,88,0.098,0.0,0.0 +2013,6,19,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,10.0,54,101696,852,1323,353,701,822,115,85403,50155,14061,5747,130,4.1,3,3,9656.0,77777,0,919999999,26,0.2170,0,88,0.098,0.0,0.0 +2013,6,19,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,19.4,10.0,54,101696,642,1323,353,533,748,105,63034,43573,12461,4771,130,4.1,3,3,9656.0,77777,0,919999999,26,0.2170,0,88,0.098,0.0,0.0 +2013,6,19,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,19.0,10.0,56,101281,413,1323,351,349,629,89,39711,29250,10162,3477,120,4.1,3,3,2816.0,77777,0,919999999,26,0.2170,0,88,0.098,0.0,0.0 +2013,6,19,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,10.0,58,101786,179,1323,348,172,421,62,18538,4784,6708,1829,140,3.1,3,3,2816.0,77777,0,919999999,26,0.2170,0,88,0.098,0.0,0.0 +2013,6,19,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.3,10.0,58,101786,0,1068,353,0,0,0,0,0,0,0,140,3.1,5,5,2816.0,77777,9,999999999,26,0.2170,0,88,0.098,0.0,0.0 +2013,6,19,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,10.0,63,101976,0,0,368,0,0,0,0,0,0,0,180,2.6,9,9,2816.0,2438,9,999999999,26,0.2170,0,88,0.098,0.0,0.0 +2013,6,19,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,10.0,63,101996,0,0,348,0,0,0,0,0,0,0,200,3.6,5,5,2816.0,77777,9,999999999,26,0.2170,0,88,0.098,0.0,0.0 +2013,6,19,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.2,10.0,63,101996,0,0,342,0,0,0,0,0,0,0,200,3.6,3,3,2816.0,77777,9,999999999,26,0.2170,0,88,0.098,0.0,0.0 +2013,6,19,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,10.6,65,102096,0,0,343,0,0,0,0,0,0,0,250,3.1,3,3,2816.0,77777,9,999999999,28,0.2170,0,88,0.098,0.0,0.0 +2013,6,20,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,11.1,75,102115,0,0,336,0,0,0,0,0,0,0,210,3.1,3,3,2816.0,77777,9,999999999,30,0.2170,0,88,0.098,0.0,0.0 +2013,6,20,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.6,11.1,75,102115,0,0,336,0,0,0,0,0,0,0,210,3.1,3,3,2816.0,77777,9,999999999,30,0.2170,0,88,0.098,0.0,0.0 +2013,6,20,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,11.1,75,102175,0,0,322,0,0,0,0,0,0,0,280,1.5,0,0,2816.0,77777,9,999999999,30,0.2170,0,88,0.098,0.0,0.0 +2013,6,20,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,10.6,78,102205,0,0,316,0,0,0,0,0,0,0,310,2.6,0,0,2816.0,77777,9,999999999,28,0.2170,0,88,0.098,0.0,0.0 +2013,6,20,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,14.4,10.6,78,102205,66,414,316,12,69,9,1404,0,1054,334,310,2.6,0,0,2816.0,77777,9,999999999,28,0.2170,0,88,0.098,0.0,0.0 +2013,6,20,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,8.3,60,102335,295,1322,321,102,335,35,12080,6049,4152,1441,340,2.1,0,0,2816.0,77777,9,999999999,22,0.2170,0,88,0.098,0.0,0.0 +2013,6,20,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,8.3,52,102396,529,1322,331,259,574,67,31009,27851,8042,3020,20,1.5,0,0,2816.0,77777,9,999999999,22,0.2170,0,88,0.098,0.0,0.0 +2013,6,20,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.3,8.3,52,102396,750,1322,331,443,723,87,54241,41665,10684,4290,20,1.5,0,0,2816.0,77777,9,999999999,22,0.2170,0,88,0.098,0.0,0.0 +2013,6,20,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,10.6,59,102416,945,1322,337,620,808,100,66508,83049,13876,2492,140,3.6,0,0,2816.0,77777,9,999999999,28,0.2170,0,88,0.098,0.0,0.0 +2013,6,20,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,10.6,59,102406,1099,1322,337,773,859,109,82676,88690,14605,3621,140,4.1,0,0,2816.0,77777,9,999999999,28,0.2170,0,88,0.098,0.0,0.0 +2013,6,20,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.9,10.6,59,102406,1203,1322,357,885,881,120,94327,91072,15647,5456,140,4.1,5,5,2816.0,77777,9,999999999,28,0.2170,0,88,0.098,0.0,0.0 +2013,6,20,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,11.1,53,102396,1249,1322,368,949,889,126,101090,92020,16223,7091,80,4.1,5,5,2816.0,77777,9,999999999,29,0.2170,0,88,0.098,0.0,0.0 +2013,6,20,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,12.2,57,102356,1234,1322,369,960,884,131,102445,91681,16889,6696,100,4.6,5,5,2816.0,77777,9,999999999,33,0.2170,0,88,0.098,0.0,0.0 +2013,6,20,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,12.2,57,102356,1159,1322,369,916,867,133,97757,89797,17406,4849,100,4.6,5,5,2816.0,77777,9,999999999,33,0.2170,0,88,0.098,0.0,0.0 +2013,6,20,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,12.2,53,102296,1029,1322,375,822,837,130,101778,50721,16161,6792,120,6.7,5,5,2816.0,77777,9,999999999,33,0.2170,0,88,0.098,0.0,0.0 +2013,6,20,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,13.9,59,102256,853,1322,377,686,786,125,82874,46902,15160,6185,120,6.7,5,5,2816.0,77777,9,999999999,39,0.2170,0,88,0.098,0.0,0.0 +2013,6,20,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,13.9,59,102256,643,1322,377,524,730,107,61747,40844,12654,4850,120,6.7,5,5,2816.0,77777,9,999999999,39,0.2170,0,88,0.098,0.0,0.0 +2013,6,20,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,14.4,66,102236,414,1322,372,344,618,88,39080,26717,10032,3451,170,3.6,5,5,2816.0,77777,9,999999999,41,0.2170,0,88,0.098,0.0,0.0 +2013,6,20,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,11.1,48,102256,180,1322,377,169,421,60,18264,4057,6508,1804,200,5.7,5,5,2816.0,77777,9,999999999,29,0.2170,0,88,0.098,0.0,0.0 +2013,6,20,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.8,11.1,48,102256,0,1075,377,0,0,0,0,0,0,0,200,5.7,5,5,2816.0,77777,9,999999999,29,0.2170,0,88,0.098,0.0,0.0 +2013,6,20,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,13.3,65,102356,0,0,365,0,0,0,0,0,0,0,200,5.1,5,5,2816.0,77777,9,999999999,37,0.2170,0,88,0.098,0.0,0.0 +2013,6,20,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,13.3,70,102366,0,0,354,0,0,0,0,0,0,0,200,4.6,3,3,2816.0,77777,9,999999999,37,0.2170,0,88,0.098,0.0,0.0 +2013,6,20,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.9,13.3,70,102366,0,0,354,0,0,0,0,0,0,0,200,4.6,3,3,2816.0,77777,9,999999999,37,0.2170,0,88,0.098,0.0,0.0 +2013,6,20,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,11.7,70,102405,0,0,344,0,0,0,0,0,0,0,220,5.7,3,3,2816.0,77777,9,999999999,32,0.2170,0,88,0.098,0.0,0.0 +2013,6,21,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,11.7,72,102365,0,0,342,0,0,0,0,0,0,0,220,5.1,3,3,2816.0,77777,9,999999999,32,0.2170,0,88,0.098,0.0,0.0 +2013,6,21,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.7,11.7,72,102365,0,0,342,0,0,0,0,0,0,0,220,5.1,3,3,2816.0,77777,9,999999999,32,0.2170,0,88,0.098,0.0,0.0 +2013,6,21,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,11.7,75,102345,0,0,339,0,0,0,0,0,0,0,220,5.1,3,3,2816.0,77777,9,999999999,32,0.2170,0,88,0.098,0.0,0.0 +2013,6,21,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,11.7,75,102345,0,0,344,0,0,0,0,0,0,0,220,5.1,5,5,2816.0,77777,9,999999999,32,0.2170,0,88,0.098,0.0,0.0 +2013,6,21,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.1,11.7,75,102345,65,410,344,10,34,8,1180,0,944,301,220,5.1,5,5,2816.0,77777,9,999999999,32,0.2170,0,88,0.098,0.0,0.0 +2013,6,21,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,11.1,65,102396,294,1322,352,94,227,48,10842,4817,5549,1883,240,4.6,5,5,2816.0,77777,9,999999999,30,0.2170,0,88,0.098,0.0,0.0 +2013,6,21,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,12.2,63,102376,528,1322,361,236,412,96,27416,21550,11190,4093,230,5.1,5,5,2816.0,77777,9,999999999,33,0.2170,0,88,0.098,0.0,0.0 +2013,6,21,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,19.4,12.2,63,102376,750,1322,355,412,581,123,49032,35254,14694,5802,230,5.1,3,3,2816.0,77777,9,999999999,33,0.2170,0,88,0.098,0.0,0.0 +2013,6,21,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,13.9,57,102336,944,1322,380,581,675,147,70329,41804,17870,7381,230,3.1,5,5,2816.0,77777,9,999999999,39,0.2170,0,88,0.098,0.0,0.0 +2013,6,21,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,14.4,52,102357,1099,1322,392,725,722,167,88861,44938,20564,8575,280,5.1,5,5,2816.0,77777,9,999999999,41,0.2170,0,88,0.098,0.0,0.0 +2013,6,21,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.0,14.4,52,102357,1203,1322,392,838,769,169,104067,47143,21087,8763,280,5.1,5,5,2816.0,77777,9,999999999,41,0.2170,0,88,0.098,0.0,0.0 +2013,6,21,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,15.6,47,102317,1249,1322,409,903,792,171,112619,47507,21430,8893,267,2.1,5,5,2816.0,77777,9,999999999,46,0.2170,0,88,0.098,0.0,0.0 +2013,6,21,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,15.0,47,102267,1234,1322,429,503,224,294,60142,16116,35369,13973,262,2.6,9,9,2816.0,1524,9,999999999,43,0.2170,0,88,0.098,0.0,0.0 +2013,6,21,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,27.2,15.0,47,102267,1159,1322,420,557,136,435,63919,11867,50276,18040,262,2.6,8,8,2816.0,1524,9,999999999,43,0.2170,0,88,0.098,0.0,0.0 +2013,6,21,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,16.1,58,102227,1029,1322,418,443,137,332,50909,10917,38398,14469,90,4.1,9,9,2816.0,2591,9,999999999,48,0.2170,0,88,0.098,0.0,0.0 +2013,6,21,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,16.7,58,102197,854,1322,413,365,325,155,43290,19898,18465,7431,120,3.6,8,8,2816.0,2743,9,999999999,51,0.2170,0,88,0.098,0.0,0.0 +2013,6,21,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,16.1,56,102177,644,1322,421,285,176,193,31995,12175,21777,7617,130,3.1,9,9,2816.0,2438,9,999999999,48,0.2170,0,88,0.098,0.0,0.0 +2013,6,21,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,16.1,60,102227,415,1322,414,261,273,153,28297,16222,16670,4956,60,3.6,9,9,2816.0,7620,9,999999999,48,0.2170,0,88,0.098,0.0,0.0 +2013,6,21,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,17.2,73,102246,181,1322,381,134,226,85,13994,4471,8919,2069,80,2.1,5,5,2816.0,77777,9,999999999,54,0.2170,0,88,0.098,0.0,0.0 +2013,6,21,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,17.2,73,102246,0,1080,381,0,0,0,0,0,0,0,80,2.1,5,5,2816.0,77777,9,999999999,54,0.2170,0,88,0.098,0.0,0.0 +2013,6,21,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,17.2,69,102296,0,0,387,0,0,0,0,0,0,0,210,3.6,5,5,2816.0,77777,9,999999999,54,0.2170,0,88,0.098,0.0,0.0 +2013,6,21,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,16.1,75,102296,0,0,372,0,0,0,0,0,0,0,200,2.1,5,5,2816.0,77777,9,999999999,49,0.2170,0,88,0.098,0.0,0.0 +2013,6,21,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.6,16.1,75,102296,0,0,372,0,0,0,0,0,0,0,200,2.1,5,5,2816.0,77777,9,999999999,49,0.2170,0,88,0.098,0.0,0.0 +2013,6,21,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,14.4,68,102276,0,0,370,0,0,0,0,0,0,0,220,3.1,5,5,2816.0,77777,9,999999999,41,0.2170,0,88,0.098,0.0,0.0 +2013,6,22,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,13.3,68,102286,0,0,362,0,0,0,0,0,0,0,220,5.7,5,5,2816.0,77777,9,999999999,37,0.2170,0,88,0.098,0.0,0.0 +2013,6,22,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,19.4,13.3,68,102286,0,0,362,0,0,0,0,0,0,0,220,5.7,5,5,2816.0,77777,9,999999999,37,0.2170,0,88,0.098,0.0,0.0 +2013,6,22,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,12.8,68,102256,0,0,339,0,0,0,0,0,0,0,230,5.1,0,0,2816.0,77777,9,999999999,35,0.2170,0,88,0.098,0.0,0.0 +2013,6,22,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,12.2,68,102266,0,0,356,0,0,0,0,0,0,0,220,4.1,5,5,2816.0,77777,9,999999999,33,0.2170,0,88,0.098,0.0,0.0 +2013,6,22,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.3,12.2,68,102266,64,405,356,6,0,6,577,0,581,232,220,4.1,5,5,2816.0,77777,9,999999999,33,0.2170,0,88,0.098,0.0,0.0 +2013,6,22,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,12.2,63,102256,294,1322,341,60,51,51,6881,1097,5863,1976,220,5.1,0,0,2816.0,77777,9,999999999,33,0.2170,0,88,0.098,0.0,0.0 +2013,6,22,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,12.8,59,102236,527,1322,370,178,175,116,20358,9822,13319,4749,230,5.1,5,5,2816.0,77777,9,999999999,35,0.2170,0,88,0.098,0.0,0.0 +2013,6,22,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,12.8,59,102236,749,1322,370,359,357,173,41582,24203,20132,7648,230,5.1,5,5,2816.0,77777,9,999999999,35,0.2170,0,88,0.098,0.0,0.0 +2013,6,22,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,14.4,54,102227,944,1322,389,484,360,247,56261,26469,28872,11243,230,5.1,5,5,2816.0,77777,9,999999999,41,0.2170,0,88,0.098,0.0,0.0 +2013,6,22,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,15.0,50,102237,1098,1322,422,570,292,344,66056,23355,40125,15212,240,5.1,9,9,2816.0,7620,9,999999999,43,0.2170,0,88,0.098,0.0,0.0 +2013,6,22,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,26.1,15.0,50,102237,1202,1322,413,614,228,417,71136,19187,48653,17819,240,5.1,8,8,2816.0,7620,9,999999999,43,0.2170,0,88,0.098,0.0,0.0 +2013,6,22,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,15.0,44,102207,1249,1322,435,748,373,401,87488,30344,47229,17589,230,7.7,9,9,2816.0,6706,9,999999999,43,0.2170,0,88,0.098,0.0,0.0 +2013,6,22,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,14.4,41,102157,1234,1322,438,769,388,406,89714,32092,47697,17667,270,6.2,9,9,2816.0,7620,9,999999999,40,0.2170,0,88,0.098,0.0,0.0 +2013,6,22,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,28.9,14.4,41,102157,1159,1322,450,769,447,367,89488,36253,42993,16173,270,6.2,10,10,2816.0,7620,9,999999999,40,0.2170,0,88,0.098,0.0,0.0 +2013,6,22,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,13.9,40,102017,1030,1322,449,667,384,345,76551,31854,39851,14847,220,5.1,10,10,2816.0,9144,9,999999999,38,0.2170,0,88,0.098,0.0,0.0 +2013,6,22,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,13.3,38,101967,854,1322,436,547,354,292,61873,29107,33228,11937,220,5.7,9,9,2816.0,9144,9,999999999,36,0.2170,0,88,0.098,0.0,0.0 +2013,6,22,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,28.9,13.3,38,101967,645,1322,427,432,365,229,47933,28392,25548,8481,220,5.7,8,8,2816.0,9144,9,999999999,36,0.2170,0,88,0.098,0.0,0.0 +2013,6,22,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,15.6,54,101947,415,1322,420,277,287,163,29891,17963,17679,5116,200,7.2,9,9,2816.0,9144,9,999999999,46,0.2170,0,88,0.098,0.0,0.0 +2013,6,22,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,13.9,59,101976,182,1322,411,128,158,83,13440,3406,8755,2067,190,6.2,10,10,2816.0,9144,9,999999999,39,0.2170,0,88,0.098,0.0,0.0 +2013,6,22,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,13.9,59,101976,0,1085,411,0,0,0,0,0,0,0,190,6.2,10,10,2816.0,9144,9,999999999,39,0.2170,0,88,0.098,0.0,0.0 +2013,6,22,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,13.3,63,102086,0,0,368,0,0,0,0,0,0,0,210,4.6,5,5,2816.0,77777,9,999999999,37,0.2170,0,88,0.098,0.0,0.0 +2013,6,22,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,13.3,65,102076,0,0,387,0,0,0,0,0,0,0,210,5.1,9,9,2816.0,9144,9,999999999,37,0.2170,0,88,0.098,0.0,0.0 +2013,6,22,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,13.3,65,102076,0,0,379,0,0,0,0,0,0,0,210,5.1,8,8,2816.0,9144,9,999999999,37,0.2170,0,88,0.098,0.0,0.0 +2013,6,22,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,12.8,63,102106,0,0,386,0,0,0,0,0,0,0,220,5.1,9,9,2816.0,4267,9,999999999,35,0.2170,0,88,0.098,0.0,0.0 +2013,6,23,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,11.7,59,102086,0,0,396,0,0,0,0,0,0,0,230,4.1,10,10,2816.0,3048,9,999999999,31,0.2170,0,88,0.098,0.0,0.0 +2013,6,23,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,11.7,59,102086,0,0,396,0,0,0,0,0,0,0,230,4.1,10,10,2816.0,3048,0,919999999,31,0.2170,0,88,0.098,0.0,0.0 +2013,6,23,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,13.3,68,101986,0,0,395,0,0,0,0,0,0,0,220,3.1,10,10,2816.0,3048,0,919999999,37,0.2170,0,88,0.098,0.0,0.0 +2013,6,23,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,13.3,68,101986,0,0,384,0,0,0,0,0,0,0,190,1.5,9,9,2816.0,4877,0,919999999,37,0.2170,0,88,0.098,0.0,0.0 +2013,6,23,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,19.4,13.3,68,101986,63,400,362,7,0,7,673,0,677,266,190,1.5,5,5,2816.0,4877,0,919999999,37,0.2170,0,88,0.098,0.0,0.0 +2013,6,23,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,15.0,70,102006,293,1322,370,74,121,51,8467,2327,5851,1974,230,3.6,5,5,2816.0,77777,0,919999999,43,0.2170,0,88,0.098,0.0,0.0 +2013,6,23,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,15.6,66,102026,526,1322,379,205,291,101,23654,14740,11696,4258,230,5.1,5,5,2816.0,77777,0,919999999,46,0.2170,0,88,0.098,0.0,0.0 +2013,6,23,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,15.6,66,102026,748,1322,379,344,336,174,39741,22079,20197,7678,230,5.1,5,5,2816.0,77777,0,919999999,46,0.2170,0,88,0.098,0.0,0.0 +2013,6,23,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,17.8,62,101967,943,1322,400,542,541,193,64047,34599,22921,9270,250,4.1,5,5,2816.0,77777,0,919999999,57,0.2170,0,88,0.098,0.0,0.0 +2013,6,23,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,18.9,58,101897,1098,1322,413,685,594,225,81773,37985,27007,11026,220,4.6,5,5,2816.0,77777,0,919999999,63,0.2170,0,88,0.098,0.0,0.0 +2013,6,23,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,27.8,18.9,58,101897,1202,1322,413,755,529,301,89427,36742,35877,14145,220,4.6,5,5,2816.0,77777,0,919999999,63,0.2170,0,88,0.098,0.0,0.0 +2013,6,23,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.6,20.0,53,101798,1248,1322,430,841,620,268,101029,39830,32389,13017,210,4.6,5,5,2816.0,77777,0,919999999,70,0.2170,0,88,0.098,0.0,0.0 +2013,6,23,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,31.7,20.0,50,101718,1234,1322,436,809,497,343,95168,35474,40619,15701,220,6.7,5,5,2816.0,77777,0,919999999,70,0.2170,0,88,0.098,0.0,0.0 +2013,6,23,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,31.7,20.0,50,101718,1160,1322,436,829,635,255,98765,41029,30558,12327,220,6.7,5,5,2816.0,77777,0,919999999,70,0.2170,0,88,0.098,0.0,0.0 +2013,6,23,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,32.2,19.4,47,101578,1030,1322,477,678,410,337,77598,31494,38822,14622,230,9.8,10,10,2816.0,7620,0,919999999,66,0.2170,0,88,0.098,0.0,0.0 +2013,6,23,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,31.7,19.4,48,101538,855,1322,461,622,590,207,71958,38505,24073,9375,230,7.7,9,9,2816.0,7620,0,919999999,66,0.2170,0,88,0.098,0.0,0.0 +2013,6,23,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,31.7,19.4,48,101538,645,1322,452,493,612,142,56577,34799,16367,6107,230,7.7,8,8,2816.0,7620,0,919999999,66,0.2170,0,88,0.098,0.0,0.0 +2013,6,23,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,29.4,17.8,50,101568,416,1322,445,322,502,112,35792,23473,12501,4122,220,8.8,9,9,2816.0,7620,0,919999999,56,0.2170,0,88,0.098,0.0,0.0 +2013,6,23,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,18.3,56,101547,183,1322,437,156,303,74,16485,3718,7854,2003,230,8.2,9,9,2816.0,7620,0,919999999,59,0.2170,0,88,0.098,0.0,0.0 +2013,6,23,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,27.8,18.3,56,101547,0,1089,427,0,0,0,0,0,0,0,230,8.2,8,8,2816.0,7620,9,999999999,59,0.2170,0,88,0.098,0.0,0.0 +2013,6,23,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,19.4,69,101697,0,0,425,0,0,0,0,0,0,0,230,7.7,9,9,2816.0,7620,9,999999999,67,0.2170,0,88,0.098,0.0,0.0 +2013,6,23,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,19.4,71,101667,0,0,422,0,0,0,0,0,0,0,240,6.7,9,9,2816.0,7620,9,999999999,67,0.2170,0,88,0.098,0.0,0.0 +2013,6,23,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.0,19.4,71,101667,0,0,413,0,0,0,0,0,0,0,240,6.7,8,8,2816.0,7620,9,999999999,67,0.2170,0,88,0.098,0.0,0.0 +2013,6,23,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,19.4,76,101587,0,0,416,0,0,0,0,0,0,0,230,7.2,9,9,2816.0,7620,9,999999999,67,0.2170,0,88,0.098,0.0,0.0 +2013,6,24,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,19.4,76,101567,0,0,416,0,0,0,0,0,0,0,240,7.7,9,9,2816.0,7620,9,999999999,67,0.2170,0,88,0.098,0.0,0.0 +2013,6,24,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.9,19.4,76,101567,0,0,393,0,0,0,0,0,0,0,240,7.7,5,5,2816.0,7620,9,999999999,67,0.2170,0,88,0.098,0.0,0.0 +2013,6,24,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,20.0,87,101537,0,0,407,0,0,0,0,0,0,0,220,4.1,9,9,2816.0,7620,9,999999999,71,0.2170,0,88,0.098,0.0,0.0 +2013,6,24,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,20.0,87,101467,0,0,384,0,0,0,0,0,0,0,250,4.6,5,5,2816.0,77777,9,999999999,71,0.2170,0,88,0.098,0.0,0.0 +2013,6,24,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,20.0,87,101467,62,394,384,9,22,8,1052,0,936,300,250,4.6,5,5,2816.0,77777,9,999999999,71,0.2170,0,88,0.098,0.0,0.0 +2013,6,24,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,20.0,82,101467,292,1322,390,90,211,48,10297,2722,5506,1877,230,4.6,5,5,2816.0,77777,9,999999999,71,0.2170,0,88,0.098,0.0,0.0 +2013,6,24,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,20.6,74,101457,525,1322,403,231,418,88,26814,17791,10249,3803,240,6.2,5,5,2816.0,77777,9,999999999,75,0.2170,0,88,0.098,0.0,0.0 +2013,6,24,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.6,20.6,74,101457,747,1322,397,399,558,124,47108,29511,14699,5835,240,6.2,3,3,2816.0,77777,9,999999999,75,0.2170,0,88,0.098,0.0,0.0 +2013,6,24,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,29.4,20.6,59,101408,942,1322,400,566,652,146,68136,35955,17653,7332,270,5.1,0,0,2816.0,77777,9,999999999,75,0.2170,0,88,0.098,0.0,0.0 +2013,6,24,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,31.1,20.0,52,101368,1097,1322,409,712,713,161,87079,39991,19783,8304,260,5.7,0,0,2816.0,77777,9,999999999,70,0.2170,0,88,0.098,0.0,0.0 +2013,6,24,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,31.1,20.0,52,101368,1202,1322,426,825,762,164,102194,42132,20413,8533,260,5.7,3,3,2816.0,77777,9,999999999,70,0.2170,0,88,0.098,0.0,0.0 +2013,6,24,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,33.3,20.6,47,101308,1248,1322,440,890,782,168,110653,42574,20990,8755,270,4.6,3,3,2816.0,77777,9,999999999,74,0.2170,0,88,0.098,0.0,0.0 +2013,6,24,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,33.9,18.9,41,101278,1234,1322,448,901,775,175,111664,44358,21796,9064,280,5.7,5,5,2816.0,77777,9,999999999,62,0.2170,0,88,0.098,0.0,0.0 +2013,6,24,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,33.9,18.9,41,101278,1160,1322,448,853,723,199,103677,43678,24314,10045,280,5.7,5,5,2816.0,77777,9,999999999,62,0.2170,0,88,0.098,0.0,0.0 +2013,6,24,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,34.4,18.9,40,101138,1031,1322,450,762,673,204,90766,42244,24426,10016,260,5.1,5,5,2816.0,77777,9,999999999,62,0.2170,0,88,0.098,0.0,0.0 +2013,6,24,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,33.9,19.4,43,101088,855,1322,448,634,612,194,73730,38884,22675,8919,260,5.1,5,5,2816.0,77777,9,999999999,66,0.2170,0,88,0.098,0.0,0.0 +2013,6,24,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,33.9,19.4,43,101088,646,1322,448,441,413,192,49398,27091,21617,7607,260,5.1,5,5,2816.0,77777,9,999999999,66,0.2170,0,88,0.098,0.0,0.0 +2013,6,24,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,32.2,20.0,49,101118,417,1322,465,298,397,128,32691,19316,14105,4500,240,5.1,9,9,2816.0,6096,9,999999999,70,0.2170,0,88,0.098,0.0,0.0 +2013,6,24,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,31.0,21.0,55,101283,183,1322,434,142,209,78,14896,2410,8220,2045,260,5.7,5,5,2816.0,77777,9,999999999,77,0.2170,0,88,0.098,0.0,0.0 +2013,6,24,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,27.8,18.9,58,101228,0,1092,428,0,0,0,0,0,0,0,360,9.3,8,8,2816.0,77777,0,019999999,63,0.2170,0,88,0.098,0.0,0.0 +2013,6,24,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,22.0,20.0,88,101282,0,0,406,0,0,0,0,0,0,0,260,1.5,9,9,9656.0,3048,0,019999999,71,0.2170,0,88,0.098,4.0,0.0 +2013,6,24,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.0,19.0,74,101282,0,0,416,0,0,0,0,0,0,0,258,0.0,9,9,9656.0,3353,0,019999999,64,0.2170,0,88,0.098,4.0,0.0 +2013,6,24,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.3,19.4,79,101317,0,0,389,0,0,0,0,0,0,0,250,2.6,5,5,9656.0,3353,0,019999999,67,0.2170,0,88,0.098,0.4,0.0 +2013,6,24,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,18.9,79,101237,0,0,386,0,0,0,0,0,0,0,250,4.1,5,5,9656.0,77777,0,019999999,64,0.2170,0,88,0.098,0.0,0.0 +2013,6,25,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,18.9,79,101257,0,0,409,0,0,0,0,0,0,0,270,5.7,9,9,9656.0,3353,0,019999999,64,0.2180,0,88,0.098,0.0,0.0 +2013,6,25,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.8,18.9,79,101257,0,0,386,0,0,0,0,0,0,0,270,5.7,5,5,9656.0,3353,0,019999999,64,0.2180,0,88,0.098,0.0,0.0 +2013,6,25,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,18.3,76,101177,0,0,385,0,0,0,0,0,0,0,260,4.1,5,5,9656.0,77777,0,019999999,60,0.2180,0,88,0.098,0.0,0.0 +2013,6,25,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,17.8,73,101207,0,0,408,0,0,0,0,0,0,0,280,4.6,9,9,9656.0,3658,0,019999999,57,0.2180,0,88,0.098,0.0,0.0 +2013,6,25,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.8,17.8,73,101207,61,387,399,2,0,2,191,0,193,81,280,4.6,8,8,9656.0,3658,0,019999999,57,0.2180,0,88,0.098,0.0,0.0 +2013,6,25,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,17.2,66,101187,290,1322,413,38,0,38,3713,0,3741,1541,270,4.6,9,9,9656.0,4267,0,019999999,53,0.2180,0,88,0.098,0.0,0.0 +2013,6,25,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,16.7,60,101147,524,1322,418,158,123,111,18070,6362,12743,4579,260,4.6,9,9,9656.0,4267,0,019999999,51,0.2180,0,88,0.098,0.0,0.0 +2013,6,25,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.0,16.7,60,101147,746,1322,395,357,381,154,41591,23504,18021,6969,260,4.6,5,5,9656.0,4267,0,019999999,51,0.2180,0,88,0.098,0.0,0.0 +2013,6,25,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,18.3,53,101088,941,1322,412,545,560,176,64817,34390,21032,8589,270,4.1,3,3,9656.0,77777,0,019999999,59,0.2180,0,88,0.098,0.0,0.0 +2013,6,25,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.0,18.9,51,101118,1096,1322,419,706,682,179,85745,40389,21847,9102,260,4.6,3,3,9656.0,77777,0,019999999,63,0.2180,0,88,0.098,0.0,0.0 +2013,6,25,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,30.0,18.9,51,101118,1201,1322,419,822,741,179,101266,42962,22162,9214,260,4.6,3,3,9656.0,77777,0,019999999,63,0.2180,0,88,0.098,0.0,0.0 +2013,6,25,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,32.2,18.9,45,101048,1248,1322,431,891,773,176,110579,44195,21952,9122,250,6.2,3,3,9656.0,77777,0,019999999,62,0.2180,0,88,0.098,0.0,0.0 +2013,6,25,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,33.3,18.3,41,100958,1234,1322,443,906,783,173,112441,45183,21576,8973,250,7.2,5,5,9656.0,77777,0,019999999,59,0.2180,0,88,0.098,0.0,0.0 +2013,6,25,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,33.3,18.3,41,100958,1160,1322,443,792,531,310,93104,38173,36673,14338,250,7.2,5,5,9656.0,77777,0,019999999,59,0.2180,0,88,0.098,0.0,0.0 +2013,6,25,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,33.3,17.8,40,100768,1031,1322,469,683,439,316,78706,33463,36644,14001,240,5.1,9,9,9656.0,7620,0,019999999,56,0.2180,0,88,0.098,0.0,0.0 +2013,6,25,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,32.8,18.3,42,100698,856,1322,466,609,542,220,70204,36953,25497,9823,230,6.2,9,9,9656.0,7620,0,019999999,59,0.2180,0,88,0.098,0.0,0.0 +2013,6,25,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,32.8,18.3,42,100698,647,1322,440,450,446,204,50218,30730,22886,7920,230,6.2,5,5,9656.0,7620,0,019999999,59,0.2180,0,88,0.098,0.0,0.0 +2013,6,25,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.6,19.4,51,100648,417,1322,455,289,335,140,31492,17623,15329,4749,220,7.7,9,9,9656.0,7620,0,019999999,66,0.2180,0,88,0.098,0.0,0.0 +2013,6,25,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,29.4,19.4,55,100638,184,1322,460,131,147,82,13712,2334,8624,2080,220,7.2,10,10,9656.0,4877,0,019999999,66,0.2180,0,88,0.098,0.0,0.0 +2013,6,25,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,29.4,19.4,55,100638,0,1095,460,0,0,0,0,0,0,0,220,7.2,10,10,9656.0,4877,9,999999999,66,0.2180,0,88,0.099,0.0,0.0 +2013,6,25,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.0,18.0,55,101283,0,0,413,0,0,0,0,0,0,0,250,6.7,5,5,9656.0,77777,0,919999999,58,0.2180,0,88,0.099,0.0,0.0 +2013,6,25,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.0,18.0,58,101282,0,0,432,0,0,0,0,0,0,0,240,5.7,9,9,9656.0,4877,0,919999999,58,0.2180,0,88,0.099,0.0,0.0 +2013,6,25,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.6,18.9,67,100697,0,0,416,0,0,0,0,0,0,0,280,4.1,8,8,9656.0,4877,0,919999999,63,0.2180,0,88,0.099,0.0,0.0 +2013,6,25,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,18.9,90,100707,0,0,397,0,0,0,0,0,0,0,247,0.0,9,9,9656.0,2134,0,919999999,64,0.2180,0,88,0.099,0.0,0.0 +2013,6,26,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,19.4,79,100657,0,0,389,0,0,0,0,0,0,0,280,4.1,5,5,9656.0,77777,0,919999999,66,0.2180,0,88,0.099,0.0,0.0 +2013,6,26,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.3,19.4,79,100657,0,0,389,0,0,0,0,0,0,0,280,4.1,5,5,9656.0,77777,0,919999999,66,0.2180,0,88,0.099,0.0,0.0 +2013,6,26,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,18.9,74,100617,0,0,386,0,0,0,0,0,0,0,270,3.6,3,3,9656.0,77777,0,919999999,63,0.2180,0,88,0.099,0.0,0.0 +2013,6,26,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,18.9,74,100687,0,0,370,0,0,0,0,0,0,0,280,3.6,0,0,9656.0,77777,0,919999999,63,0.2180,0,88,0.099,0.0,0.0 +2013,6,26,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.9,18.9,74,100687,60,379,370,2,0,2,191,0,192,81,280,3.6,0,0,9656.0,77777,0,919999999,63,0.2180,0,88,0.099,0.0,0.0 +2013,6,26,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,18.9,69,100687,289,1322,421,48,26,42,5553,300,4869,1676,300,4.1,9,9,9656.0,3353,0,919999999,63,0.2180,0,88,0.099,0.0,0.0 +2013,6,26,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,18.9,65,100698,523,1322,428,143,81,113,16293,4039,12926,4638,280,3.6,9,9,9656.0,7620,0,919999999,63,0.2180,0,88,0.099,0.0,0.0 +2013,6,26,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,26.1,18.9,65,100698,745,1322,419,316,247,186,36187,15878,21406,8059,280,3.6,8,8,9656.0,7620,0,919999999,63,0.2180,0,88,0.099,0.0,0.0 +2013,6,26,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,18.9,61,100748,940,1322,434,460,296,264,52961,21120,30573,11787,270,4.1,9,9,9656.0,6096,0,919999999,63,0.2180,0,88,0.099,0.0,0.0 +2013,6,26,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,18.9,55,100728,1096,1322,419,595,378,306,69334,27345,35882,13991,11,0.0,5,5,9656.0,77777,0,919999999,63,0.2180,0,88,0.099,0.0,0.0 +2013,6,26,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,28.9,18.9,55,100728,1200,1322,419,565,264,351,66115,19587,41348,15844,24,0.0,5,5,9656.0,77777,0,919999999,63,0.2180,0,88,0.099,0.0,0.0 +2013,6,26,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,19.4,79,100777,1248,1322,424,320,69,260,38551,4432,31509,12701,140,4.1,10,10,9656.0,1097,0,919999999,67,0.2180,0,88,0.099,0.0,0.0 +2013,6,26,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,19.4,79,100757,1234,1322,413,316,34,283,37753,2264,34019,13563,70,3.1,9,9,9656.0,1829,0,919999999,67,0.2180,0,88,0.099,0.0,0.0 +2013,6,26,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.3,19.4,79,100757,1160,1322,404,491,162,348,57139,12049,40768,15592,70,3.1,8,8,9656.0,1829,0,919999999,67,0.2180,0,88,0.099,0.0,0.0 +2013,6,26,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,19.4,81,100757,1031,1322,410,412,80,344,47085,6204,39573,14831,110,3.1,9,9,9656.0,2743,0,919999999,67,0.2180,0,88,0.099,0.0,0.0 +2013,6,26,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,19.4,81,100757,856,1322,410,400,126,308,44831,9900,34737,12358,70,2.6,9,9,9656.0,1829,0,919999999,67,0.2180,0,88,0.099,0.0,0.0 +2013,6,26,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.8,19.4,81,100757,647,1322,421,217,23,204,24192,1557,22863,7923,70,2.6,10,10,9656.0,1829,0,919999999,67,0.2180,0,88,0.099,0.0,0.0 +2013,6,26,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.0,19.0,88,101282,418,1322,411,127,8,123,13998,388,13617,4395,70,3.6,10,10,9656.0,823,0,919999999,64,0.2180,0,88,0.099,0.0,0.0 +2013,6,26,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.0,19.0,88,101282,184,1322,399,70,2,69,7443,17,7367,1959,80,2.6,9,9,9656.0,2286,0,919999999,64,0.2180,0,88,0.099,0.0,0.0 +2013,6,26,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,20.6,18.9,90,100927,0,1097,389,0,0,0,0,0,0,0,80,1.5,8,8,9000.0,2286,9,999999999,64,0.2180,0,88,0.099,1.0,0.0 +2013,6,26,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.0,19.0,94,101281,0,0,394,0,0,0,0,0,0,0,60,1.5,9,9,2414.0,488,9,999999999,65,0.2180,0,88,0.099,0.0,0.0 +2013,6,26,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.0,18.0,88,101281,0,0,393,0,0,0,0,0,0,0,80,2.6,9,9,4023.0,1981,9,999999999,58,0.2180,0,88,0.099,0.0,0.0 +2013,6,26,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,18.9,18.3,96,101056,0,0,345,0,0,0,0,0,0,0,90,2.6,0,0,800.0,1981,0,999999999,60,0.2180,0,88,0.099,0.0,0.0 +2013,6,26,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,18.0,18.0,100,101281,0,0,340,0,0,0,0,0,0,0,50,3.1,0,0,402.0,30,0,999999999,59,0.2180,0,88,0.099,0.0,0.0 +2013,6,27,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,18.0,17.0,94,101281,0,0,346,0,0,0,0,0,0,0,80,2.6,1,1,402.0,61,0,999999999,53,0.2180,0,88,0.099,0.0,0.0 +2013,6,27,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.8,17.2,96,101026,0,0,356,0,0,0,0,0,0,0,80,2.6,4,4,400.0,120,0,999999999,54,0.2180,0,88,0.099,0.0,0.0 +2013,6,27,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,16.7,16.7,100,100986,0,0,374,0,0,0,0,0,0,0,40,4.6,9,9,402.0,61,0,999999999,51,0.2180,0,88,0.099,0.0,0.0 +2013,6,27,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,16.1,16.1,100,100946,0,0,370,0,0,0,0,0,0,0,50,4.1,9,9,402.0,61,0,999999999,48,0.2180,0,88,0.099,0.0,0.0 +2013,6,27,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,16.1,16.1,100,100946,59,371,370,2,0,2,192,0,193,81,50,4.1,9,9,400.0,120,0,999999999,48,0.2180,0,88,0.099,0.0,0.0 +2013,6,27,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,16.7,16.1,96,101096,288,1322,384,19,0,19,1858,0,1872,823,30,2.6,10,10,402.0,61,0,999999999,48,0.2180,0,88,0.099,0.0,0.0 +2013,6,27,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,16.7,16.1,96,101116,522,1322,384,80,1,80,9389,46,9417,3503,30,2.1,10,10,402.0,61,0,999999999,48,0.2180,0,88,0.099,0.0,0.0 +2013,6,27,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,16.7,16.1,96,101116,744,1322,384,239,108,182,27481,7183,21029,7923,30,2.1,10,10,400.0,61,0,999999999,48,0.2180,0,88,0.099,0.0,0.0 +2013,6,27,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.0,17.0,100,101281,939,1322,386,253,70,216,29641,4730,25440,10127,80,2.6,10,10,805.0,61,0,999999999,53,0.2180,0,88,0.099,0.0,0.0 +2013,6,27,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,18.3,17.2,93,101036,1095,1322,359,237,19,223,28345,1246,26815,10941,70,2.6,4,4,805.0,61,0,999999999,54,0.2180,0,88,0.099,0.0,0.0 +2013,6,27,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,18.3,17.2,93,101036,1200,1322,361,310,18,293,36843,1269,35037,13850,70,2.6,5,5,800.0,240,0,999999999,54,0.2180,0,88,0.099,0.0,0.0 +2013,6,27,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,18.9,17.2,90,100986,1247,1322,397,368,26,343,43487,1927,40800,15746,80,3.1,10,10,805.0,61,0,999999999,54,0.2180,0,88,0.099,0.0,0.0 +2013,6,27,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,18.0,17.0,94,101281,1234,1322,392,362,26,337,42764,1926,40072,15498,70,2.6,10,10,2012.0,61,0,919999999,53,0.2180,0,88,0.099,0.0,0.0 +2013,6,27,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,18.3,17.2,93,100956,1160,1322,394,314,20,296,37083,1433,35173,13849,70,3.1,10,10,400.0,61,0,919999999,54,0.2180,0,88,0.099,0.0,0.0 +2013,6,27,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.8,17.2,96,100936,1031,1322,391,265,14,252,31106,977,29749,11859,70,3.6,10,10,805.0,61,0,919999999,54,0.2180,0,88,0.099,0.0,0.0 +2013,6,27,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.8,16.7,93,100886,857,1322,390,138,1,137,16532,59,16480,6706,70,3.6,10,10,402.0,61,0,919999999,51,0.2180,0,88,0.099,0.0,0.0 +2013,6,27,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,17.8,16.7,93,100886,647,1322,390,192,43,171,21773,2784,19484,7028,70,3.6,10,10,400.0,61,0,919999999,51,0.2180,0,88,0.099,0.0,0.0 +2013,6,27,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.8,17.2,96,100876,418,1322,391,96,4,94,10837,171,10650,3646,70,3.1,10,10,402.0,61,0,919999999,54,0.2180,0,88,0.099,0.0,0.0 +2013,6,27,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.8,17.2,96,100856,185,1322,380,68,85,51,7433,12,5593,1659,90,3.1,9,9,402.0,61,0,919999999,54,0.2180,0,88,0.099,0.0,0.0 +2013,6,27,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.8,17.2,96,100856,0,1098,380,0,0,0,0,0,0,0,90,3.1,9,9,400.0,120,0,999999999,54,0.2180,0,88,0.099,6.0,0.0 +2013,6,27,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.2,16.7,97,100866,0,0,376,0,0,0,0,0,0,0,70,2.6,9,9,402.0,61,0,999999999,51,0.2180,0,88,0.099,5.4,0.0 +2013,6,27,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.2,16.7,97,100806,0,0,387,0,0,0,0,0,0,0,60,3.6,10,10,402.0,61,0,999999999,51,0.2180,0,88,0.099,0.0,0.0 +2013,6,27,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,17.2,16.7,97,100806,0,0,387,0,0,0,0,0,0,0,60,3.6,10,10,400.0,61,0,999999999,51,0.2180,0,88,0.099,0.0,0.0 +2013,6,27,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.2,16.7,97,100686,0,0,387,0,0,0,0,0,0,0,50,5.1,10,10,402.0,61,0,999999999,51,0.2180,0,88,0.099,0.0,0.0 +2013,6,28,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,16.7,16.1,96,100586,0,0,384,0,0,0,0,0,0,0,50,6.2,10,10,402.0,61,0,919999999,48,0.2180,0,88,0.099,0.0,0.0 +2013,6,28,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,16.7,16.1,96,100586,0,0,384,0,0,0,0,0,0,0,50,6.2,10,10,400.0,61,0,019999999,48,0.2180,0,88,0.099,0.0,0.0 +2013,6,28,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.0,16.0,94,101281,0,0,385,0,0,0,0,0,0,0,50,7.2,10,10,1609.0,122,0,019999999,48,0.2180,0,88,0.099,0.0,0.0 +2013,6,28,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,16.7,16.1,96,100346,0,0,384,0,0,0,0,0,0,0,60,5.7,10,10,1609.0,122,0,019999999,48,0.2180,0,88,0.099,0.0,0.0 +2013,6,28,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,16.7,16.1,96,100346,57,362,384,3,0,3,287,0,289,120,60,5.7,10,10,1600.0,122,0,019999999,48,0.2180,0,88,0.099,0.0,0.0 +2013,6,28,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,18.3,17.8,97,100207,287,1322,362,20,0,20,1952,0,1967,863,80,1.5,5,5,402.0,61,0,019999999,57,0.2180,0,88,0.099,0.0,0.0 +2013,6,28,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,19.0,18.0,94,101281,520,1322,398,109,45,91,12639,2070,10588,3896,120,1.5,10,10,402.0,61,0,019999999,58,0.2180,0,88,0.099,0.0,0.0 +2013,6,28,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,18.9,18.3,96,100167,742,1322,398,102,1,102,12244,52,12287,4921,120,2.6,10,10,400.0,61,0,019999999,60,0.2180,0,88,0.099,0.0,0.0 +2013,6,28,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.0,21.0,94,101282,938,1322,419,187,12,179,22140,704,21297,8700,160,4.6,10,10,400.0,427,0,019999999,79,0.2180,0,88,0.099,0.0,0.0 +2013,6,28,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.7,20.6,93,100017,1094,1322,417,289,22,273,33911,1473,32227,12841,170,5.1,10,10,8047.0,213,0,019999999,75,0.2180,0,88,0.099,0.0,0.0 +2013,6,28,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,21.7,20.6,93,100017,1199,1322,417,198,8,191,24229,457,23494,9746,170,5.1,10,10,8000.0,213,0,019999999,75,0.2180,0,88,0.099,0.0,0.0 +2013,6,28,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.0,21.0,89,101282,1247,1322,425,339,24,316,40162,1617,37681,14808,200,5.7,10,10,8000.0,396,0,019999999,78,0.2180,0,88,0.099,0.0,0.0 +2013,6,28,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,22.0,83,101282,1233,1322,425,707,411,323,83369,27526,38339,15016,180,6.2,9,9,8000.0,457,0,019999999,86,0.2180,0,88,0.099,0.0,0.0 +2013,6,28,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.6,21.1,76,99938,1160,1322,404,783,591,256,93156,37425,30637,12368,200,8.2,5,5,8000.0,457,0,019999999,78,0.2180,0,88,0.099,0.0,0.0 +2013,6,28,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,20.6,69,99858,1031,1322,433,774,711,185,92744,41712,22279,9237,200,7.7,9,9,8000.0,4877,0,019999999,74,0.2180,0,88,0.099,0.0,0.0 +2013,6,28,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,20.6,69,99858,857,1322,409,568,439,238,64924,29799,27358,10412,200,7.7,5,5,8000.0,77777,0,019999999,74,0.2180,0,88,0.099,0.0,0.0 +2013,6,28,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,26.7,20.6,69,99858,648,1322,409,487,565,160,55311,33092,18258,6698,200,7.7,5,5,8000.0,77777,0,019999999,74,0.2180,0,88,0.099,0.0,0.0 +2013,6,28,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,20.0,76,99908,418,1322,396,316,434,132,34593,21610,14517,4597,200,6.7,5,5,8000.0,77777,0,019999999,70,0.2180,0,88,0.099,0.0,0.0 +2013,6,28,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,19.4,84,99927,185,1322,406,153,244,83,16006,4036,8724,2095,190,6.2,9,9,8000.0,9144,0,019999999,66,0.2180,0,88,0.099,0.0,0.0 +2013,6,28,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,19.4,84,99927,0,1099,398,0,0,0,0,0,0,0,190,6.2,8,8,8000.0,9144,9,999999999,66,0.2180,0,88,0.099,3.0,0.0 +2013,6,28,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.0,19.0,83,101282,0,0,416,0,0,0,0,0,0,0,210,6.2,10,10,8000.0,366,9,999999999,64,0.2180,0,88,0.099,0.0,0.0 +2013,6,28,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,19.4,87,100057,0,0,404,0,0,0,0,0,0,0,200,6.2,9,9,8000.0,335,9,999999999,66,0.2180,0,88,0.099,0.0,0.0 +2013,6,28,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,19.4,87,100057,0,0,395,0,0,0,0,0,0,0,200,6.2,8,8,8000.0,335,9,999999999,66,0.2180,0,88,0.099,0.0,0.0 +2013,6,28,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,19.4,90,99997,0,0,412,0,0,0,0,0,0,0,200,5.1,10,10,8000.0,305,9,999999999,66,0.2180,0,88,0.099,0.0,0.0 +2013,6,29,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.0,20.0,88,101282,0,0,418,0,0,0,0,0,0,0,200,4.6,10,10,8000.0,244,9,999999999,71,0.2180,0,88,0.099,0.0,0.0 +2013,6,29,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,20.0,90,99957,0,0,416,0,0,0,0,0,0,0,200,4.1,10,10,8000.0,244,9,999999999,70,0.2180,0,88,0.099,0.0,0.0 +2013,6,29,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,20.0,93,99937,0,0,412,0,0,0,0,0,0,0,200,3.6,10,10,8000.0,213,9,999999999,70,0.2180,0,88,0.099,0.0,0.0 +2013,6,29,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,20.6,93,99967,0,0,417,0,0,0,0,0,0,0,200,4.1,10,10,8000.0,213,9,999999999,75,0.2180,0,88,0.099,0.0,0.0 +2013,6,29,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,20.6,93,99967,56,353,417,7,0,7,667,0,672,263,200,4.1,10,10,8000.0,213,0,919999999,75,0.2180,0,88,0.099,0.0,0.0 +2013,6,29,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,22.0,21.0,94,101282,285,1321,363,62,72,49,7058,801,5593,1895,200,3.6,0,0,8047.0,853,0,919999999,79,0.2180,0,88,0.099,0.0,0.0 +2013,6,29,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.0,21.0,89,101282,519,1321,390,160,134,117,18121,6446,13305,4746,220,3.6,5,5,8047.0,77777,0,919999999,78,0.2180,0,88,0.099,0.0,0.0 +2013,6,29,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,21.1,93,100077,741,1321,420,197,50,176,22591,3008,20282,7712,190,3.6,10,10,8047.0,77777,0,919999999,79,0.2180,0,88,0.099,0.0,0.0 +2013,6,29,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.0,20.0,83,101282,937,1321,389,344,99,281,39345,7148,32334,12301,210,5.1,5,5,8047.0,77777,0,919999999,71,0.2180,0,88,0.099,0.0,0.0 +2013,6,29,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,20.0,82,100127,1093,1321,425,307,41,277,36002,2793,32680,12982,200,4.6,10,10,8047.0,914,0,919999999,70,0.2180,0,88,0.099,0.0,0.0 +2013,6,29,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.3,20.0,82,100127,1199,1321,425,400,43,363,46621,3186,42596,16219,200,4.6,10,10,8047.0,914,0,919999999,70,0.2180,0,88,0.099,0.0,0.0 +2013,6,29,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,20.6,72,100198,1246,1321,406,643,258,401,74804,19507,46983,17581,200,5.7,5,5,8047.0,77777,0,919999999,74,0.2180,0,88,0.099,0.0,0.0 +2013,6,29,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,20.0,67,100158,1233,1321,408,700,295,423,80998,23224,49300,18148,200,6.7,5,5,8047.0,77777,0,919999999,70,0.2180,0,88,0.099,0.0,0.0 +2013,6,29,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,26.7,20.0,67,100158,1160,1321,423,777,459,362,90086,34440,42255,16027,200,6.7,8,8,8047.0,77777,0,919999999,70,0.2180,0,88,0.099,0.0,0.0 +2013,6,29,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,18.9,61,100198,1032,1321,434,718,551,269,83722,38502,31552,12464,190,8.2,9,9,8047.0,9144,0,919999999,63,0.2180,0,88,0.099,0.0,0.0 +2013,6,29,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,18.3,58,100238,857,1321,409,614,582,211,71030,38976,24538,9526,200,9.8,5,5,8047.0,77777,0,919999999,59,0.2180,0,88,0.099,0.0,0.0 +2013,6,29,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,27.2,18.3,58,100238,648,1321,409,470,521,161,53485,31989,18407,6730,200,9.8,5,5,8047.0,77777,0,919999999,59,0.2180,0,88,0.099,0.0,0.0 +2013,6,29,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,18.3,64,100288,419,1321,400,313,472,115,34724,22262,12812,4210,200,8.2,5,5,8047.0,77777,0,919999999,59,0.2180,0,88,0.099,0.0,0.0 +2013,6,29,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,18.9,74,100367,185,1321,392,146,296,80,15332,4547,8440,2075,200,7.2,5,5,8047.0,77777,0,919999999,63,0.2180,0,88,0.099,0.0,0.0 +2013,6,29,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.9,18.9,74,100367,0,1098,392,0,0,0,0,0,0,0,200,7.2,5,5,8047.0,77777,9,999999999,63,0.2180,0,88,0.099,0.0,0.0 +2013,6,29,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,19.4,87,100527,0,0,381,0,0,0,0,0,0,0,200,5.7,5,5,8047.0,77777,9,999999999,67,0.2180,0,88,0.099,1.8,0.0 +2013,6,29,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,19.4,87,100587,0,0,381,0,0,0,0,0,0,0,200,4.6,5,5,8047.0,77777,9,999999999,67,0.2180,0,88,0.099,0.0,0.0 +2013,6,29,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,19.4,87,100587,0,0,381,0,0,0,0,0,0,0,200,4.6,5,5,8047.0,77777,9,999999999,67,0.2180,0,88,0.099,0.0,0.0 +2013,6,29,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.0,19.0,88,101282,0,0,399,0,0,0,0,0,0,0,200,4.1,9,9,8047.0,9144,9,999999999,64,0.2180,0,88,0.099,0.0,0.0 +2013,6,30,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,19.4,90,100657,0,0,400,0,0,0,0,0,0,0,200,4.1,9,9,8047.0,4572,9,999999999,67,0.2180,0,88,0.099,0.0,0.0 +2013,6,30,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,19.4,90,100657,0,0,392,0,0,0,0,0,0,0,200,4.1,8,8,8047.0,4572,9,999999999,67,0.2180,0,88,0.099,0.0,0.0 +2013,6,30,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,19.4,90,100677,0,0,400,0,0,0,0,0,0,0,200,4.1,9,9,8047.0,9144,9,999999999,67,0.2180,0,88,0.099,0.0,0.0 +2013,6,30,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.0,19.0,88,101282,0,0,399,0,0,0,0,0,0,0,190,3.6,9,9,8047.0,366,9,999999999,64,0.2180,0,88,0.099,0.0,0.0 +2013,6,30,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.6,19.4,93,100727,54,342,389,6,0,6,572,0,576,228,200,2.6,8,8,8047.0,366,9,999999999,67,0.2180,0,88,0.099,0.0,0.0 +2013,6,30,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.0,20.0,88,101282,283,1321,406,76,154,44,8732,1568,5067,1732,190,3.6,9,9,8047.0,4572,9,999999999,71,0.2180,0,88,0.099,0.0,0.0 +2013,6,30,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,20.6,85,100947,517,1321,414,223,404,78,26088,16196,9153,3418,190,3.6,9,9,8047.0,7620,9,999999999,75,0.2180,0,88,0.099,0.0,0.0 +2013,6,30,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.3,20.6,85,100947,740,1321,405,328,316,182,37526,19503,20926,7902,190,3.6,8,8,8047.0,7620,9,999999999,75,0.2180,0,88,0.099,0.0,0.0 +2013,6,30,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,20.6,79,100987,936,1321,420,474,341,254,54606,23268,29431,11435,190,4.1,9,9,8047.0,7620,9,999999999,75,0.2180,0,88,0.099,0.0,0.0 +2013,6,30,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,21.1,79,101017,1092,1321,424,598,354,325,69157,25399,37830,14598,190,5.1,9,9,8047.0,7620,9,999999999,79,0.2180,0,88,0.099,0.0,0.0 +2013,6,30,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.0,21.1,79,101017,1198,1321,415,672,325,393,77731,24564,45780,17121,190,5.1,8,8,8047.0,7620,9,999999999,79,0.2180,0,88,0.099,0.0,0.0 +2013,6,30,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,21.1,67,101008,1246,1321,440,761,392,397,88546,29252,46522,17460,190,5.1,9,9,8047.0,7620,9,999999999,78,0.2180,0,88,0.099,0.0,0.0 +2013,6,30,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,20.6,63,100998,1233,1321,443,747,340,429,86280,26707,49912,18312,190,5.7,9,9,8047.0,6706,9,999999999,75,0.2180,0,88,0.099,0.0,0.0 +2013,6,30,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,28.3,20.6,63,100998,1160,1321,433,664,251,436,75802,20461,50138,18073,190,5.7,8,8,8047.0,6706,9,999999999,75,0.2180,0,88,0.099,0.0,0.0 +2013,6,30,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,21.1,69,101038,1032,1321,449,576,216,395,64981,17506,44874,16172,200,7.2,10,10,8047.0,6706,9,999999999,78,0.2180,0,88,0.099,0.0,0.0 +2013,6,30,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,21.1,71,101077,857,1321,434,481,217,325,53579,17079,36437,12765,200,7.2,9,9,8047.0,6706,9,999999999,79,0.2180,0,88,0.099,0.0,0.0 +2013,6,30,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,26.7,21.1,71,101077,648,1321,446,375,259,219,41491,17665,24365,8292,200,7.2,10,10,8047.0,6706,9,999999999,79,0.2180,0,88,0.099,0.0,0.0 +2013,6,30,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,20.0,74,101177,419,1321,423,277,307,137,30231,15700,15023,4701,200,5.1,9,9,8047.0,6706,9,999999999,71,0.2180,0,88,0.099,0.0,0.0 +2013,6,30,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.7,19.5,77,101268,185,1321,419,142,240,84,14840,4111,8821,2102,197,4.3,9,9,8047.0,6706,9,999999999,67,0.2180,0,88,0.099,0.0,0.0 +2013,6,30,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.2,19.6,80,101288,0,1098,410,0,0,0,0,0,0,0,195,4.1,8,8,8047.0,6706,9,999999999,68,0.2180,0,88,0.099,0.0,0.0 +2013,6,30,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.6,19.9,85,101321,0,0,410,0,0,0,0,0,0,0,195,3.8,9,9,8047.0,6706,9,999999999,70,0.2180,0,88,0.099,0.0,0.0 +2013,6,30,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.6,20.4,88,101321,0,0,422,0,0,0,0,0,0,0,192,3.7,10,10,8047.0,2438,9,999999999,74,0.2180,0,88,0.099,3.0,0.0 +2013,6,30,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.7,20.5,88,101121,0,0,422,0,0,0,0,0,0,0,192,3.7,10,10,8047.0,2438,0,919999999,75,0.2180,0,88,0.099,0.0,0.0 +2013,6,30,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,20.8,89,101112,0,0,417,0,0,0,0,0,0,0,195,3.7,10,10,8047.0,366,0,919999999,77,0.2180,0,88,0.099,0.0,0.0 +2008,7,1,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,23.1,20.9,88,101091,0,0,384,0,0,0,0,0,0,0,192,4.0,3,3,8047.0,77777,9,999999999,77,0.2180,0,88,0.103,0.0,0.0 +2008,7,1,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,23.0,20.6,86,100900,0,0,385,0,0,0,0,0,0,0,195,4.4,3,3,8000.0,77777,9,999999999,75,0.2180,0,88,0.103,0.0,0.0 +2008,7,1,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,23.0,20.6,86,100887,0,0,413,0,0,0,0,0,0,0,200,4.5,9,9,8047.0,701,9,999999999,75,0.2180,0,88,0.103,0.0,0.0 +2008,7,1,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,23.2,20.5,85,100693,0,0,413,0,0,0,0,0,0,0,202,4.8,9,9,6437.0,77777,9,999999999,74,0.2180,0,88,0.103,0.0,0.0 +2008,7,1,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,23.5,20.4,83,100500,54,342,422,4,0,4,381,0,384,157,207,4.8,10,10,8000.0,77777,0,919999999,73,0.2180,0,88,0.103,0.0,0.0 +2008,7,1,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,24.3,20.5,79,100691,283,1321,426,35,0,35,3404,0,3430,1426,212,5.2,10,10,8047.0,3658,0,919999999,74,0.2180,0,88,0.103,0.0,0.0 +2008,7,1,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,23.9,20.6,82,100507,517,1321,429,130,51,112,14777,2422,12782,4585,210,4.6,10,10,9656.0,3658,0,919999999,75,0.2180,0,88,0.103,0.0,0.0 +2008,7,1,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,23.9,20.6,82,100507,740,1321,417,305,225,190,34774,14161,21773,8159,210,4.6,9,9,9000.0,3658,0,919999999,75,0.2180,0,88,0.103,0.0,0.0 +2008,7,1,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,26.0,20.0,70,101282,936,1321,429,396,186,282,45271,13457,32434,12323,220,7.7,9,9,9656.0,732,0,919999999,71,0.2180,0,88,0.103,0.0,0.0 +2008,7,1,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,27.0,20.0,66,101282,1092,1321,434,489,185,346,56341,13929,40129,15247,230,7.2,9,9,9656.0,3658,0,919999999,70,0.2180,0,88,0.103,0.0,0.0 +2008,7,1,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,27.2,20.0,65,100588,1198,1321,435,526,134,407,60749,10489,47340,17521,200,4.1,9,9,9656.0,3658,0,919999999,70,0.2180,0,88,0.103,0.0,0.0 +2008,7,1,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,19.4,59,100588,1246,1321,441,684,326,384,79942,24618,45193,17066,270,3.6,9,9,9656.0,1433,0,919999999,66,0.2180,0,88,0.103,0.0,0.0 +2008,7,1,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.0,19.4,53,100528,1233,1321,426,766,598,208,93668,35705,25572,10526,230,5.7,5,5,9656.0,77777,0,919999999,66,0.2180,0,88,0.103,0.0,0.0 +2008,7,1,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.0,19.4,53,100528,1160,1321,426,732,595,202,88833,35780,24643,10174,230,5.7,5,5,9656.0,77777,0,919999999,66,0.2180,0,88,0.103,0.0,0.0 +2008,7,1,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.0,17.8,48,100478,1032,1321,424,515,395,170,62279,23778,20656,8598,260,6.2,5,5,9656.0,77777,0,919999999,56,0.2180,0,88,0.103,0.0,0.0 +2008,7,1,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.6,17.8,46,100468,857,1321,427,665,735,139,79510,42629,16689,6791,250,6.2,5,5,9656.0,77777,0,919999999,56,0.2180,0,88,0.103,0.0,0.0 +2008,7,1,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.6,17.8,46,100468,648,1321,427,508,674,120,59206,36926,14040,5351,250,6.2,5,5,9656.0,77777,0,919999999,56,0.2180,0,88,0.103,0.0,0.0 +2008,7,1,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,16.1,46,100498,419,1321,415,332,544,103,37242,25092,11599,3901,260,6.7,5,5,9656.0,77777,0,919999999,47,0.2180,0,88,0.103,0.0,0.0 +2008,7,1,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,18.9,65,100558,185,1321,404,162,333,71,17189,3363,7566,1987,200,4.6,5,5,9656.0,77777,0,919999999,63,0.2180,0,88,0.103,0.0,0.0 +2008,7,1,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,18.9,65,100558,0,1098,404,0,0,0,0,0,0,0,200,4.6,5,5,9656.0,77777,9,999999999,63,0.2180,0,88,0.103,0.0,0.0 +2008,7,1,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,18.3,74,100727,0,0,366,0,0,0,0,0,0,0,200,3.6,0,0,9656.0,77777,9,999999999,60,0.2180,0,88,0.103,0.0,0.0 +2008,7,1,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,18.3,76,100777,0,0,364,0,0,0,0,0,0,0,200,3.6,0,0,9656.0,77777,9,999999999,60,0.2180,0,88,0.103,0.0,0.0 +2008,7,1,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,18.3,76,100777,0,0,364,0,0,0,0,0,0,0,200,3.6,0,0,9656.0,77777,9,999999999,60,0.2180,0,88,0.103,0.0,0.0 +2008,7,1,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,18.3,76,100807,0,0,364,0,0,0,0,0,0,0,230,4.6,0,0,9656.0,77777,9,999999999,60,0.2180,0,88,0.103,0.0,0.0 +2008,7,2,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,18.3,79,100817,0,0,361,0,0,0,0,0,0,0,240,3.1,0,0,9656.0,77777,9,999999999,60,0.2190,0,88,0.103,0.0,0.0 +2008,7,2,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,18.3,79,100817,0,0,361,0,0,0,0,0,0,0,240,3.1,0,0,9656.0,77777,9,999999999,60,0.2190,0,88,0.103,0.0,0.0 +2008,7,2,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,18.3,84,100807,0,0,399,0,0,0,0,0,0,0,210,2.6,9,9,9656.0,6096,9,999999999,60,0.2190,0,88,0.103,0.0,0.0 +2008,7,2,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.0,17.8,87,100827,0,0,404,0,0,0,0,0,0,0,190,3.1,10,10,8047.0,4267,9,999999999,57,0.2190,0,88,0.103,0.0,0.0 +2008,7,2,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,20.0,17.8,87,100827,52,332,371,6,0,6,573,0,577,228,190,3.1,5,5,8000.0,4267,9,999999999,57,0.2190,0,88,0.103,0.0,0.0 +2008,7,2,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.7,18.9,84,100957,282,1321,381,82,179,47,9377,2216,5388,1826,170,1.5,5,5,8047.0,77777,9,999999999,64,0.2190,0,88,0.103,0.0,0.0 +2008,7,2,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,22.2,18.3,79,100997,516,1321,405,174,205,111,19834,10224,12702,4547,160,2.6,9,9,8047.0,2896,9,999999999,60,0.2190,0,88,0.103,0.0,0.0 +2008,7,2,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,22.2,18.3,79,100997,738,1321,382,311,281,184,35626,18178,21182,7960,160,2.6,5,5,8000.0,2896,9,999999999,60,0.2190,0,88,0.103,0.0,0.0 +2008,7,2,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,18.9,71,101037,935,1321,418,376,142,283,43014,10475,32570,12345,130,3.6,9,9,8000.0,2743,9,999999999,63,0.2190,0,88,0.103,0.0,0.0 +2008,7,2,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,19.4,67,101077,1091,1321,428,540,243,351,62176,18600,40684,15392,140,3.6,9,9,8000.0,2438,9,999999999,66,0.2190,0,88,0.103,0.0,0.0 +2008,7,2,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,26.1,19.4,67,101077,1197,1321,428,682,349,380,79236,26681,44454,16734,140,3.6,9,9,8000.0,2438,9,999999999,66,0.2190,0,88,0.103,0.0,0.0 +2008,7,2,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,18.9,55,101058,1245,1321,444,693,286,432,80281,23010,50409,18461,150,4.6,9,9,8000.0,2134,9,999999999,63,0.2190,0,88,0.103,0.0,0.0 +2008,7,2,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,18.3,53,101018,1232,1321,418,498,173,335,58782,12557,39802,15427,190,5.1,5,5,8000.0,77777,9,999999999,59,0.2190,0,88,0.103,0.0,0.0 +2008,7,2,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,18.3,53,101018,1160,1321,443,761,421,379,88059,33098,44157,16533,190,5.1,9,9,8000.0,77777,9,999999999,59,0.2190,0,88,0.103,0.0,0.0 +2008,7,2,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,29.4,18.3,51,100988,1032,1321,446,661,372,349,75544,29498,40149,14976,190,5.1,9,9,8000.0,7620,9,999999999,59,0.2190,0,88,0.103,0.0,0.0 +2008,7,2,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,17.8,55,101008,857,1321,436,538,330,298,60567,26057,33755,12119,200,5.1,9,9,8000.0,7620,9,999999999,56,0.2190,0,88,0.103,0.0,0.0 +2008,7,2,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,27.8,17.8,55,101008,648,1321,436,242,155,141,27847,9058,16295,6086,200,5.1,9,9,8000.0,7620,0,919999999,56,0.2190,0,88,0.103,0.0,0.0 +2008,7,2,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,16.7,56,101137,419,1321,401,264,274,153,28641,16153,16681,4993,240,3.1,5,5,8000.0,77777,0,919999999,51,0.2190,0,88,0.103,0.0,0.0 +2008,7,2,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,17.8,67,101187,185,1321,393,129,143,87,13462,2948,9123,2116,190,3.1,5,5,8000.0,77777,0,919999999,57,0.2190,0,88,0.103,0.0,0.0 +2008,7,2,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,17.8,67,101187,0,1096,393,0,0,0,0,0,0,0,190,3.1,5,5,8000.0,77777,9,999999999,57,0.2190,0,88,0.103,0.0,0.0 +2008,7,2,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,17.2,71,101287,0,0,378,0,0,0,0,0,0,0,190,3.6,3,3,8000.0,77777,9,999999999,54,0.2190,0,88,0.103,0.0,0.0 +2008,7,2,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,17.8,73,101297,0,0,363,0,0,0,0,0,0,0,210,4.1,0,0,8000.0,77777,9,999999999,57,0.2190,0,88,0.103,0.0,0.0 +2008,7,2,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,17.8,73,101297,0,0,379,0,0,0,0,0,0,0,210,4.1,3,3,8000.0,77777,9,999999999,57,0.2190,0,88,0.103,0.0,0.0 +2008,7,2,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,17.8,76,101317,0,0,360,0,0,0,0,0,0,0,250,3.6,0,0,8000.0,77777,9,999999999,57,0.2190,0,88,0.103,0.0,0.0 +2008,7,3,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,17.8,81,101327,0,0,355,0,0,0,0,0,0,0,260,2.6,0,0,8000.0,77777,9,999999999,57,0.2190,0,88,0.103,4.0,0.0 +2008,7,3,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,17.8,81,101327,0,0,355,0,0,0,0,0,0,0,260,2.6,0,0,8000.0,77777,9,999999999,57,0.2190,0,88,0.103,0.3,0.0 +2008,7,3,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,17.2,84,101296,0,0,349,0,0,0,0,0,0,0,220,3.6,0,0,8000.0,77777,9,999999999,54,0.2190,0,88,0.103,0.0,0.0 +2008,7,3,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,19.4,17.8,90,101326,0,0,389,0,0,0,0,0,0,0,220,2.6,9,9,6437.0,4267,9,999999999,57,0.2190,0,88,0.103,0.0,0.0 +2008,7,3,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,19.4,17.8,90,101326,51,320,389,6,0,6,573,0,577,227,220,2.6,9,9,6000.0,4267,9,999999999,57,0.2190,0,88,0.103,0.0,0.0 +2008,7,3,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.6,17.8,84,101386,280,1321,396,77,169,44,8856,2046,5072,1726,200,1.5,9,9,8047.0,7620,9,999999999,57,0.2190,0,88,0.103,0.0,0.0 +2008,7,3,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.7,18.3,81,101427,514,1321,402,173,198,112,19698,9909,12803,4572,170,3.1,9,9,9656.0,7620,9,999999999,60,0.2190,0,88,0.103,0.0,0.0 +2008,7,3,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,21.7,18.3,81,101427,737,1321,402,393,547,124,46428,30367,14707,5804,170,3.1,9,9,9000.0,7620,9,999999999,60,0.2190,0,88,0.103,0.0,0.0 +2008,7,3,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,18.3,69,101407,933,1321,417,524,513,203,61563,33225,23973,9617,140,3.1,9,9,9000.0,7620,9,999999999,60,0.2190,0,88,0.103,0.0,0.0 +2008,7,3,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,18.3,64,101377,1090,1321,424,593,358,320,68845,26697,37388,14431,120,2.1,9,9,9000.0,7620,9,999999999,60,0.2190,0,88,0.103,0.0,0.0 +2008,7,3,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.6,18.3,64,101377,1196,1321,424,701,416,340,82237,30744,40149,15472,120,2.1,9,9,9000.0,7620,9,999999999,60,0.2190,0,88,0.103,0.0,0.0 +2008,7,3,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,23.9,18.9,74,101407,1245,1321,415,381,198,208,46685,11902,25624,10541,194,2.1,9,9,9656.0,1829,9,999999999,64,0.2190,0,88,0.103,0.0,0.0 +2008,7,3,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,16.1,60,101347,1232,1321,414,580,240,355,68280,18384,42071,16093,10,4.6,9,9,9656.0,2134,9,999999999,48,0.2190,0,88,0.103,0.0,0.0 +2008,7,3,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,24.4,16.1,60,101347,1159,1321,426,682,290,417,78471,24505,48319,17586,10,4.6,10,10,9656.0,2134,0,019999999,48,0.2190,0,88,0.103,0.0,0.0 +2008,7,3,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.0,17.0,78,101282,1031,1321,408,216,82,141,26508,4741,17378,7306,80,3.1,10,10,4828.0,732,0,019999999,53,0.2190,0,88,0.103,0.0,0.0 +2008,7,3,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.0,17.0,88,101281,857,1321,365,364,292,174,42802,18516,20557,8187,110,3.1,5,5,4828.0,1676,0,019999999,53,0.2190,0,88,0.103,0.0,0.0 +2008,7,3,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,20.6,82,101187,648,1321,394,345,294,189,38659,18704,21288,7541,220,2.1,5,5,4828.0,77777,0,019999999,75,0.2190,0,88,0.103,0.0,0.0 +2008,7,3,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,16.1,66,101317,419,1321,405,308,448,122,34070,22940,13554,4377,300,2.1,9,9,4828.0,6096,0,019999999,48,0.2190,0,88,0.103,0.0,0.0 +2008,7,3,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.0,16.0,65,101282,184,1321,406,116,103,77,12255,1697,8171,2047,227,0.0,9,9,4828.0,732,0,019999999,48,0.2190,0,88,0.103,0.0,0.0 +2008,7,3,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,16.1,68,101287,0,1093,380,0,0,0,0,0,0,0,190,4.6,5,5,4828.0,732,9,999999999,48,0.2190,0,88,0.097,0.0,0.0 +2008,7,3,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,17.8,79,101367,0,0,358,0,0,0,0,0,0,0,210,4.1,0,0,4828.0,77777,9,999999999,57,0.2190,0,88,0.097,0.0,0.0 +2008,7,3,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,17.2,76,101337,0,0,357,0,0,0,0,0,0,0,230,5.7,0,0,4828.0,77777,9,999999999,54,0.2190,0,88,0.097,0.0,0.0 +2008,7,3,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,17.2,76,101337,0,0,357,0,0,0,0,0,0,0,230,5.7,0,0,4828.0,77777,9,999999999,54,0.2190,0,88,0.097,0.0,0.0 +2008,7,3,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,16.1,75,101366,0,0,351,0,0,0,0,0,0,0,240,5.1,0,0,4828.0,77777,9,999999999,48,0.2190,0,88,0.097,0.0,0.0 +2008,7,4,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,15.6,76,101356,0,0,347,0,0,0,0,0,0,0,240,4.6,0,0,4828.0,77777,9,999999999,46,0.2190,0,88,0.097,0.0,0.0 +2008,7,4,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,15.6,76,101356,0,0,347,0,0,0,0,0,0,0,240,4.6,0,0,4828.0,77777,9,999999999,46,0.2190,0,88,0.097,0.0,0.0 +2008,7,4,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,15.6,81,101356,0,0,342,0,0,0,0,0,0,0,230,4.6,0,0,4828.0,77777,9,999999999,46,0.2190,0,88,0.097,6.0,0.0 +2008,7,4,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,15.6,84,101346,0,0,354,0,0,0,0,0,0,0,230,4.1,3,3,4828.0,77777,9,999999999,46,0.2190,0,88,0.097,6.0,0.0 +2008,7,4,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,15.6,84,101346,49,308,354,7,18,6,830,0,711,226,230,4.1,3,3,4828.0,77777,9,999999999,46,0.2190,0,88,0.097,4.8,0.0 +2008,7,4,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,14.4,68,101366,278,1321,364,88,227,45,10125,3481,5190,1755,240,5.7,3,3,4828.0,77777,9,999999999,41,0.2190,0,88,0.097,0.0,0.0 +2008,7,4,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,14.4,61,101347,512,1321,372,232,444,84,27104,21079,9844,3625,220,6.2,3,3,4828.0,77777,9,999999999,41,0.2190,0,88,0.097,0.0,0.0 +2008,7,4,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,14.4,61,101347,736,1321,372,408,597,119,48494,34849,14198,5601,220,6.2,3,3,4828.0,77777,9,999999999,41,0.2190,0,88,0.097,0.0,0.0 +2008,7,4,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,15.6,54,101347,932,1321,391,583,703,136,70777,41673,16579,6871,220,8.2,3,3,4828.0,77777,9,999999999,46,0.2190,0,88,0.097,0.0,0.0 +2008,7,4,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,14.4,44,101267,1089,1321,407,736,772,146,91000,46445,18130,7612,230,8.8,5,5,4828.0,77777,9,999999999,40,0.2190,0,88,0.097,0.0,0.0 +2008,7,4,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,14.4,44,101267,1195,1321,407,797,631,261,95717,44220,31528,12637,230,8.7,5,5,4828.0,77777,9,999999999,40,0.2190,0,88,0.097,0.0,0.0 +2008,7,4,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.0,15.0,40,101168,1244,1321,445,894,754,201,110165,47706,24898,10236,230,9.3,9,9,4828.0,7620,9,999999999,42,0.2190,0,88,0.097,0.0,0.0 +2008,7,4,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.6,16.1,42,101058,1232,1321,425,903,742,211,110602,47030,25982,10654,200,10.3,5,5,4828.0,77777,9,999999999,47,0.2190,0,88,0.097,0.0,0.0 +2008,7,4,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.6,16.1,42,101058,1159,1321,425,862,720,212,104520,46444,25842,10596,200,10.3,5,5,4828.0,77777,9,999999999,47,0.2190,0,88,0.097,0.0,0.0 +2008,7,4,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.6,15.0,39,100988,1031,1321,423,772,678,210,92068,45561,25175,10260,230,9.8,5,5,4828.0,77777,9,999999999,42,0.2190,0,88,0.097,0.0,0.0 +2008,7,4,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.6,15.0,39,100988,857,1321,423,639,607,203,74355,41914,23741,9248,230,10.8,5,5,4828.0,77777,9,999999999,42,0.2190,0,88,0.097,0.0,0.0 +2008,7,4,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.6,15.0,39,100988,648,1321,423,483,535,175,54751,35830,19933,7148,230,10.8,5,5,4828.0,77777,9,999999999,42,0.2190,0,88,0.097,0.0,0.0 +2008,7,4,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,16.1,48,101128,418,1321,436,277,295,139,30308,16447,15280,4737,220,9.3,9,9,4828.0,2438,9,999999999,48,0.2190,0,88,0.097,0.0,0.0 +2008,7,4,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.0,16.0,48,101283,184,1321,435,118,110,73,12521,1550,7779,2004,300,10.8,9,9,4828.0,2438,0,019999999,47,0.2190,0,88,0.097,0.0,0.0 +2008,7,4,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,17.2,73,101267,0,1090,404,0,0,0,0,0,0,0,260,3.1,9,9,4828.0,2438,9,999999999,54,0.2190,0,88,0.097,0.0,0.0 +2008,7,4,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,17.2,69,101387,0,0,410,0,0,0,0,0,0,0,280,4.1,9,9,4828.0,3658,9,999999999,54,0.2190,0,88,0.097,0.0,0.0 +2008,7,4,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,17.2,71,101407,0,0,384,0,0,0,0,0,0,0,250,4.6,5,5,4828.0,77777,9,999999999,54,0.2190,0,88,0.097,0.0,0.0 +2008,7,4,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,17.2,71,101407,0,0,418,0,0,0,0,0,0,0,250,4.6,10,10,4828.0,77777,9,999999999,54,0.2190,0,88,0.097,0.0,0.0 +2008,7,4,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,16.7,71,101437,0,0,380,0,0,0,0,0,0,0,260,2.1,5,5,4828.0,77777,9,999999999,51,0.2190,0,88,0.097,0.0,0.0 +2008,7,5,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,16.7,71,101437,0,0,403,0,0,0,0,0,0,0,290,3.1,9,9,4828.0,2743,9,999999999,51,0.2190,0,88,0.097,0.0,0.0 +2008,7,5,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,16.7,71,101437,0,0,403,0,0,0,0,0,0,0,290,3.1,9,9,4828.0,2743,9,999999999,51,0.2190,0,88,0.097,0.0,0.0 +2008,7,5,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,17.8,79,101527,0,0,413,0,0,0,0,0,0,0,310,4.6,10,10,4828.0,1524,0,919999999,57,0.2190,0,88,0.097,0.0,0.0 +2008,7,5,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.6,18.3,87,101586,0,0,408,0,0,0,0,0,0,0,320,2.6,10,10,6437.0,1311,0,919999999,60,0.2190,0,88,0.097,4.0,0.0 +2008,7,5,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,20.6,18.3,87,101586,47,295,408,1,0,1,95,0,96,41,320,2.6,10,10,6000.0,1311,0,919999999,60,0.2190,0,88,0.097,4.0,0.0 +2008,7,5,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.0,17.0,88,101281,276,1321,397,16,0,16,1562,0,1574,695,10,5.7,10,10,6000.0,914,0,919999999,53,0.2190,0,88,0.097,0.1,0.0 +2008,7,5,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,15.0,87,101716,511,1321,385,71,0,71,7088,0,7147,3140,40,6.2,10,10,6000.0,1219,0,919999999,44,0.2190,0,88,0.097,0.0,0.0 +2008,7,5,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.2,15.0,87,101716,734,1321,385,167,24,155,19431,1522,18115,6953,40,6.2,10,10,6000.0,1219,0,919999999,44,0.2190,0,88,0.097,0.0,0.0 +2008,7,5,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,13.3,78,101826,931,1321,383,173,9,168,20697,585,20191,8228,10,3.1,10,10,6000.0,914,0,919999999,37,0.2190,0,88,0.097,0.0,0.0 +2008,7,5,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,13.9,81,101816,1088,1321,384,151,1,150,18636,61,18594,7796,360,3.1,10,10,6000.0,4267,0,919999999,39,0.2190,0,88,0.097,0.0,0.0 +2008,7,5,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.2,13.9,81,101816,1195,1321,384,329,26,305,39051,1941,36427,14268,360,3.1,10,10,6000.0,4267,0,919999999,39,0.2190,0,88,0.097,0.0,0.0 +2008,7,5,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,14.4,80,101776,1243,1321,387,258,13,246,31325,882,30039,12133,80,2.1,10,10,6000.0,914,0,919999999,41,0.2190,0,88,0.097,0.0,0.0 +2008,7,5,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,14.4,78,101746,1231,1321,390,420,38,385,49189,3072,45399,17034,90,1.5,10,10,6000.0,1097,0,919999999,41,0.2190,0,88,0.097,0.0,0.0 +2008,7,5,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.3,14.4,78,101746,1159,1321,379,675,335,376,78401,27463,43967,16441,90,1.5,9,9,6000.0,1097,0,919999999,41,0.2190,0,88,0.097,0.0,0.0 +2008,7,5,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,15.0,76,101676,1031,1321,386,581,256,365,66345,21556,41956,15408,130,3.1,9,9,6000.0,4267,0,919999999,43,0.2190,0,88,0.097,0.0,0.0 +2008,7,5,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,15.0,81,101666,857,1321,391,423,148,320,47456,12504,36126,12647,130,3.1,10,10,6000.0,2134,0,919999999,43,0.2190,0,88,0.097,0.0,0.0 +2008,7,5,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.3,15.0,81,101666,648,1321,391,328,148,242,36205,11639,26864,8779,130,3.1,10,10,6000.0,2134,0,919999999,43,0.2190,0,88,0.097,0.0,0.0 +2008,7,5,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,15.0,81,101646,418,1321,391,192,91,158,20800,5624,17202,5067,130,3.1,10,10,6000.0,7620,0,919999999,43,0.2190,0,88,0.097,0.0,0.0 +2008,7,5,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,14.4,80,101646,184,1321,387,105,84,83,11030,1789,8759,2084,120,2.6,10,10,6000.0,7620,0,919999999,41,0.2190,0,88,0.097,0.0,0.0 +2008,7,5,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,14.4,80,101646,0,1086,387,0,0,0,0,0,0,0,120,2.6,10,10,6000.0,7620,9,999999999,41,0.2190,0,88,0.097,0.0,0.0 +2008,7,5,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,15.0,84,101686,0,0,377,0,0,0,0,0,0,0,143,0.0,9,9,6000.0,6096,9,999999999,44,0.2190,0,88,0.097,0.0,0.0 +2008,7,5,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,15.0,84,101696,0,0,388,0,0,0,0,0,0,0,110,1.5,10,10,6000.0,3353,9,999999999,44,0.2190,0,88,0.097,0.0,0.0 +2008,7,5,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,15.0,84,101696,0,0,388,0,0,0,0,0,0,0,110,1.5,10,10,6000.0,3353,9,999999999,44,0.2190,0,88,0.097,0.0,0.0 +2008,7,5,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,16.7,15.0,90,101726,0,0,382,0,0,0,0,0,0,0,150,0.0,10,10,9656.0,6096,9,999999999,44,0.2190,0,88,0.097,0.0,0.0 +2008,7,6,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.2,15.0,87,101706,0,0,348,0,0,0,0,0,0,0,135,0.0,3,3,8047.0,77777,9,999999999,44,0.2190,0,88,0.097,0.0,0.0 +2008,7,6,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.2,15.0,87,101706,0,0,385,0,0,0,0,0,0,0,112,0.0,10,10,8000.0,77777,9,999999999,44,0.2190,0,88,0.097,0.0,0.0 +2008,7,6,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,15.6,90,101716,0,0,386,0,0,0,0,0,0,0,110,2.1,10,10,8000.0,2134,9,999999999,46,0.2190,0,88,0.097,0.0,0.0 +2008,7,6,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,15.6,87,101726,0,0,389,0,0,0,0,0,0,0,99,0.0,10,10,8000.0,2743,9,999999999,46,0.2190,0,88,0.097,0.0,0.0 +2008,7,6,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,15.6,87,101726,45,282,389,0,0,0,0,0,0,0,97,0.0,10,10,8000.0,2743,0,919999999,46,0.2190,0,88,0.097,0.0,0.0 +2008,7,6,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,18.3,16.1,87,101766,274,1321,392,21,0,21,2051,0,2067,895,90,1.5,10,10,8047.0,4267,0,919999999,49,0.2190,0,88,0.097,0.0,0.0 +2008,7,6,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,18.3,16.1,87,101786,509,1321,392,54,0,54,5384,0,5429,2464,70,1.5,10,10,9656.0,2743,0,919999999,49,0.2190,0,88,0.097,0.0,0.0 +2008,7,6,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,18.3,16.1,87,101786,732,1321,381,231,100,176,26578,6569,20346,7665,70,1.5,9,9,9000.0,2743,0,919999999,49,0.2190,0,88,0.097,0.0,0.0 +2008,7,6,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,16.7,84,101716,929,1321,366,335,106,261,38617,7790,30260,11623,80,4.1,5,5,9000.0,77777,0,919999999,51,0.2190,0,88,0.097,0.0,0.0 +2008,7,6,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.0,16.0,83,101281,1087,1321,396,308,52,268,36312,3718,31782,12641,90,3.6,10,10,9000.0,579,0,919999999,48,0.2190,0,88,0.097,0.0,0.0 +2008,7,6,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,19.4,15.6,79,101756,1194,1321,398,328,50,288,39052,3583,34498,13652,80,3.6,10,10,9000.0,579,0,919999999,46,0.2190,0,88,0.097,0.0,0.0 +2008,7,6,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,15.6,81,101786,1243,1321,395,241,11,231,29372,721,28310,11515,90,3.1,10,10,9000.0,975,0,919999999,46,0.2190,0,88,0.097,0.0,0.0 +2008,7,6,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.0,16.0,83,101281,1231,1321,396,423,53,373,49600,4154,44034,16662,70,3.1,10,10,9000.0,853,0,919999999,48,0.2190,0,88,0.097,0.0,0.0 +2008,7,6,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,19.4,16.1,81,101766,1158,1321,398,462,67,401,53316,5559,46598,17150,70,3.6,10,10,9000.0,853,0,919999999,48,0.2190,0,88,0.097,0.0,0.0 +2008,7,6,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,16.1,78,101716,1031,1321,401,400,52,355,45736,4272,40858,15136,80,3.1,10,10,9000.0,2438,0,919999999,48,0.2190,0,88,0.097,0.0,0.0 +2008,7,6,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,16.1,81,101686,856,1321,398,371,104,296,41847,8358,33591,12062,90,4.1,10,10,9000.0,4267,0,919999999,48,0.2190,0,88,0.097,0.0,0.0 +2008,7,6,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,19.4,16.1,81,101686,647,1321,387,399,308,228,44217,23175,25406,8485,90,4.1,9,9,9000.0,4267,0,919999999,48,0.2190,0,88,0.097,0.0,0.0 +2008,7,6,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,16.1,87,101696,417,1321,381,219,130,161,23662,8013,17483,5109,90,3.1,9,9,9000.0,4267,0,919999999,49,0.2190,0,88,0.097,0.0,0.0 +2008,7,6,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.8,16.1,90,101666,183,1321,358,124,145,85,12976,3040,8937,2089,80,2.6,5,5,8047.0,77777,0,919999999,49,0.2190,0,88,0.097,0.0,0.0 +2008,7,6,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.8,16.1,90,101666,0,1082,358,0,0,0,0,0,0,0,80,2.6,5,5,8000.0,77777,9,999999999,49,0.2190,0,88,0.097,0.0,0.0 +2008,7,6,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.0,16.0,94,101281,0,0,354,0,0,0,0,0,0,0,108,0.0,5,5,2816.0,77777,9,999999999,48,0.2190,0,88,0.097,0.0,0.0 +2008,7,6,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.0,16.0,94,101281,0,0,354,0,0,0,0,0,0,0,120,2.1,5,5,2012.0,91,0,999999999,48,0.2190,0,88,0.097,0.0,0.0 +2008,7,6,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,16.7,15.6,93,101706,0,0,346,0,0,0,0,0,0,0,164,0.0,3,3,800.0,77777,0,999999999,46,0.2190,0,88,0.097,0.0,0.0 +2008,7,6,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,16.0,16.0,100,101281,0,0,369,0,0,0,0,0,0,0,192,0.0,9,9,6437.0,549,0,999999999,48,0.2190,0,88,0.097,0.0,0.0 +2008,7,7,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,16.0,16.0,100,101281,0,0,329,0,0,0,0,0,0,0,110,1.5,0,0,8047.0,1372,0,999999999,48,0.2190,0,88,0.097,0.0,0.0 +2008,7,7,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,16.7,15.0,90,101726,0,0,331,0,0,0,0,0,0,0,110,1.5,0,0,8000.0,77777,0,999999999,44,0.2190,0,88,0.097,0.0,0.0 +2008,7,7,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.0,16.0,94,101281,0,0,375,0,0,0,0,0,0,0,261,0.0,9,9,4828.0,396,0,999999999,48,0.2190,0,88,0.097,0.0,0.0 +2008,7,7,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.0,16.0,94,101281,0,0,385,0,0,0,0,0,0,0,266,0.0,10,10,4828.0,244,0,999999999,48,0.2190,0,88,0.097,0.0,0.0 +2008,7,7,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,17.8,16.1,90,101796,42,268,390,1,0,1,96,0,96,41,259,0.0,10,10,6000.0,244,0,999999999,49,0.2190,0,88,0.097,0.0,0.0 +2008,7,7,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,18.0,17.0,94,101281,272,1321,360,26,0,26,2537,0,2556,1086,224,0.0,5,5,4023.0,1097,0,999999999,53,0.2190,0,88,0.097,0.0,0.0 +2008,7,7,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,19.0,17.0,88,101281,507,1321,386,131,90,96,15094,4283,11100,4027,140,2.1,9,9,4023.0,213,0,999999999,53,0.2190,0,88,0.097,0.0,0.0 +2008,7,7,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,19.4,17.8,90,101876,731,1321,400,238,104,184,27237,6790,21161,7915,160,2.1,10,10,3200.0,213,0,999999999,58,0.2190,0,88,0.097,0.0,0.0 +2008,7,7,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,22.0,18.0,78,101282,928,1321,415,438,276,257,50482,19801,29791,11484,250,2.6,10,10,4828.0,335,0,999999999,58,0.2190,0,88,0.097,0.0,0.0 +2008,7,7,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,22.8,18.9,79,101857,1086,1321,409,554,279,336,63989,21121,39063,14914,130,4.6,9,9,6437.0,1219,0,999999999,64,0.2190,0,88,0.097,0.0,0.0 +2008,7,7,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,22.8,18.9,79,101857,1193,1321,386,722,467,317,85072,33231,37591,14683,130,4.6,5,5,6000.0,1219,0,999999999,64,0.2190,0,88,0.097,0.0,0.0 +2008,7,7,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,22.2,18.3,79,101846,1242,1321,382,729,379,387,85196,29223,45542,17141,120,5.7,5,5,6437.0,77777,0,999999999,60,0.2190,0,88,0.097,0.0,0.0 +2008,7,7,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,22.8,18.3,76,101787,1230,1321,408,662,220,457,76232,18449,53015,19032,120,4.6,9,9,9656.0,3962,0,999999999,60,0.2190,0,88,0.097,0.0,0.0 +2008,7,7,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,22.8,18.3,76,101787,1158,1321,408,628,211,437,71832,17794,50348,18087,120,4.6,9,9,9000.0,3962,0,999999999,60,0.2190,0,88,0.097,0.0,0.0 +2008,7,7,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,23.3,18.3,74,101727,1030,1321,411,637,363,341,72922,28480,39292,14740,110,4.6,9,9,9656.0,4267,0,999999999,60,0.2190,0,88,0.097,0.0,0.0 +2008,7,7,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,23.9,18.9,74,101697,856,1321,415,468,225,308,52478,17806,34754,12356,120,4.1,9,9,6437.0,4267,0,999999999,64,0.2190,0,88,0.097,0.0,0.0 +2008,7,7,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,23.9,18.9,74,101697,647,1321,415,428,381,208,47661,26268,23286,8020,120,4.1,9,9,6000.0,4267,0,999999999,64,0.2190,0,88,0.097,0.0,0.0 +2008,7,7,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,18.3,62,101697,417,1321,439,271,274,160,29230,16218,17346,5088,190,4.6,10,10,6000.0,4572,0,999999999,60,0.2190,0,88,0.097,0.0,0.0 +2008,7,7,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,18.9,69,101687,182,1321,398,129,164,88,13415,3258,9197,2094,210,5.1,5,5,6000.0,77777,0,999999999,64,0.2190,0,88,0.097,0.0,0.0 +2008,7,7,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,18.9,69,101687,0,1076,398,0,0,0,0,0,0,0,210,5.1,5,5,6000.0,77777,9,999999999,64,0.2190,0,88,0.097,0.0,0.0 +2008,7,7,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,19.4,76,101717,0,0,371,0,0,0,0,0,0,0,220,4.1,0,0,6000.0,77777,9,999999999,67,0.2190,0,88,0.097,0.0,0.0 +2008,7,7,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,22.8,19.4,81,101727,0,0,365,0,0,0,0,0,0,0,230,3.1,0,0,9656.0,77777,9,999999999,67,0.2190,0,88,0.097,0.0,0.0 +2008,7,7,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,22.8,19.4,81,101727,0,0,365,0,0,0,0,0,0,0,230,3.1,0,0,9000.0,77777,9,999999999,67,0.2190,0,88,0.097,0.0,0.0 +2008,7,7,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.7,18.9,84,101756,0,0,359,0,0,0,0,0,0,0,230,4.1,0,0,9656.0,77777,9,999999999,64,0.2190,0,88,0.097,0.0,0.0 +2008,7,8,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.7,18.9,84,101746,0,0,359,0,0,0,0,0,0,0,240,4.1,0,0,8047.0,77777,9,999999999,64,0.2200,0,88,0.097,0.0,0.0 +2008,7,8,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.7,18.9,84,101746,0,0,359,0,0,0,0,0,0,0,240,4.1,0,0,8000.0,77777,9,999999999,64,0.2200,0,88,0.097,0.0,0.0 +2008,7,8,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.0,19.0,88,101282,0,0,371,0,0,0,0,0,0,0,230,4.1,3,3,6437.0,77777,9,999999999,64,0.2200,0,88,0.097,0.0,0.0 +2008,7,8,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.6,18.9,90,101736,0,0,369,0,0,0,0,0,0,0,220,2.6,3,3,6437.0,77777,9,999999999,64,0.2200,0,88,0.097,0.0,0.0 +2008,7,8,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.6,18.9,90,101736,40,254,369,2,0,2,191,0,192,80,220,2.6,3,3,6000.0,77777,9,999999999,64,0.2200,0,88,0.097,0.0,0.0 +2008,7,8,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.7,18.9,84,101796,270,1321,375,42,4,41,4836,33,4731,1610,230,4.6,3,3,6437.0,77777,9,999999999,64,0.2200,0,88,0.097,0.0,0.0 +2008,7,8,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,22.8,18.9,79,101807,505,1321,380,190,247,101,21755,11524,11607,4186,240,5.1,3,3,8047.0,77777,9,999999999,64,0.2200,0,88,0.097,0.0,0.0 +2008,7,8,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,22.8,18.9,79,101807,729,1321,380,364,428,150,42280,25194,17501,6753,240,5.1,3,3,8000.0,77777,9,999999999,64,0.2200,0,88,0.097,0.0,0.0 +2008,7,8,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,19.4,71,101797,927,1321,422,469,367,247,54138,25332,28674,11146,230,4.1,9,9,8000.0,7925,9,999999999,67,0.2200,0,88,0.097,0.0,0.0 +2008,7,8,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,19.4,64,101767,1084,1321,408,621,448,284,72635,31248,33420,13202,230,3.1,5,5,8000.0,77777,9,999999999,67,0.2200,0,88,0.097,0.0,0.0 +2008,7,8,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,19.4,64,101767,1192,1321,408,800,684,212,97151,41485,25884,10643,230,3.1,5,5,8000.0,77777,9,999999999,67,0.2200,0,88,0.097,0.0,0.0 +2008,7,8,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,19.4,59,101667,1241,1321,441,777,488,335,91725,34732,39808,15455,220,3.6,9,9,8000.0,4267,9,999999999,66,0.2200,0,88,0.097,0.0,0.0 +2008,7,8,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,29.4,19.4,55,101608,1230,1321,448,775,426,379,90467,32157,44548,16843,170,5.1,9,9,8000.0,4267,9,999999999,66,0.2200,0,88,0.097,0.0,0.0 +2008,7,8,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,29.4,19.4,55,101608,1157,1321,448,614,198,433,70200,16383,49865,17984,170,5.1,9,9,8000.0,4267,9,999999999,66,0.2200,0,88,0.097,0.0,0.0 +2008,7,8,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,29.4,18.9,53,101528,1030,1321,422,710,548,267,82816,38193,31327,12386,230,2.1,5,5,8000.0,77777,9,999999999,63,0.2200,0,88,0.097,0.0,0.0 +2008,7,8,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,20.6,61,101478,855,1321,459,541,387,249,61601,26842,28515,10743,170,4.6,10,10,8000.0,1311,9,999999999,75,0.2200,0,88,0.097,0.0,0.0 +2008,7,8,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,28.9,20.6,61,101478,646,1321,446,470,486,188,52670,30840,21176,7501,170,4.6,9,9,8000.0,1311,9,999999999,75,0.2200,0,88,0.097,0.0,0.0 +2008,7,8,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,21.1,67,101427,416,1321,416,302,361,149,32662,19105,16195,4905,200,5.7,5,5,8000.0,77777,9,999999999,79,0.2200,0,88,0.097,0.0,0.0 +2008,7,8,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,21.1,69,101457,181,1321,406,144,199,87,14944,3299,9074,2081,200,4.1,3,3,8000.0,77777,9,999999999,79,0.2200,0,88,0.097,0.0,0.0 +2008,7,8,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,21.1,69,101457,0,1070,406,0,0,0,0,0,0,0,200,4.1,3,3,8000.0,77777,9,999999999,79,0.2200,0,88,0.097,0.0,0.0 +2008,7,8,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,21.1,79,101487,0,0,394,0,0,0,0,0,0,0,210,3.6,3,3,8000.0,77777,9,999999999,79,0.2200,0,88,0.097,0.0,0.0 +2008,7,8,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,21.1,79,101487,0,0,394,0,0,0,0,0,0,0,230,5.1,3,3,8000.0,77777,9,999999999,79,0.2200,0,88,0.097,0.0,0.0 +2008,7,8,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,21.1,79,101487,0,0,394,0,0,0,0,0,0,0,230,5.1,3,3,8000.0,77777,9,999999999,79,0.2200,0,88,0.097,0.0,0.0 +2008,7,8,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,21.1,84,101467,0,0,389,0,0,0,0,0,0,0,230,4.1,3,3,8000.0,77777,9,999999999,79,0.2200,0,88,0.097,0.0,0.0 +2008,7,9,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,23.3,20.6,85,101437,0,0,391,0,0,0,0,0,0,0,240,5.1,5,5,9656.0,77777,9,999999999,75,0.2200,0,88,0.097,0.0,0.0 +2008,7,9,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,23.3,20.6,85,101437,0,0,426,0,0,0,0,0,0,0,240,5.1,10,10,9000.0,77777,9,999999999,75,0.2200,0,88,0.097,0.0,0.0 +2008,7,9,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,23.3,20.6,85,101417,0,0,426,0,0,0,0,0,0,0,240,4.6,10,10,8047.0,305,9,999999999,75,0.2200,0,88,0.097,0.0,0.0 +2008,7,9,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,23.0,21.0,89,101282,0,0,384,0,0,0,0,0,0,0,220,2.6,3,3,8047.0,77777,9,999999999,78,0.2200,0,88,0.097,0.0,0.0 +2008,7,9,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,22.8,20.0,84,101427,38,239,410,3,2,2,380,0,253,80,220,3.1,9,9,8000.0,77777,9,999999999,71,0.2200,0,88,0.097,0.0,0.0 +2008,7,9,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,23.0,21.0,89,101282,268,1321,384,67,85,51,7556,800,5768,1916,240,2.6,3,3,6437.0,77777,9,999999999,78,0.2200,0,88,0.097,0.0,0.0 +2008,7,9,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,25.0,20.6,77,101457,503,1321,394,195,223,120,21969,10888,13576,4765,230,3.6,3,3,8047.0,77777,9,999999999,75,0.2200,0,88,0.097,0.0,0.0 +2008,7,9,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,25.0,20.6,77,101457,727,1321,394,366,413,163,42144,24318,18857,7201,230,3.6,3,3,8000.0,77777,9,999999999,75,0.2200,0,88,0.097,0.0,0.0 +2008,7,9,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,27.8,20.6,65,101377,925,1321,409,534,542,191,62804,32940,22577,9122,250,5.1,3,3,9656.0,77777,9,999999999,75,0.2200,0,88,0.097,0.0,0.0 +2008,7,9,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,29.4,20.6,59,101338,1083,1321,418,682,624,207,81628,37628,24908,10270,250,5.7,3,3,9656.0,77777,9,999999999,75,0.2200,0,88,0.097,0.0,0.0 +2008,7,9,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,29.4,20.6,59,101338,1191,1321,424,802,701,199,97725,40653,24377,10085,250,5.7,5,5,9656.0,77777,9,999999999,75,0.2200,0,88,0.097,0.0,0.0 +2008,7,9,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.6,20.0,53,101238,1240,1321,430,874,739,197,107350,42788,24325,10056,250,6.2,5,5,9656.0,77777,9,999999999,70,0.2200,0,88,0.097,0.0,0.0 +2008,7,9,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.0,22.0,74,101282,1229,1321,437,755,567,228,91383,33072,27753,11369,215,0.0,9,9,9656.0,7500,9,999999999,86,0.2200,0,88,0.097,0.0,0.0 +2008,7,9,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,31.7,19.4,48,101168,1157,1321,435,720,552,230,86484,34729,27781,11334,230,6.2,5,5,9656.0,7500,9,999999999,66,0.2200,0,88,0.097,0.0,0.0 +2008,7,9,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,31.7,19.4,48,101038,1029,1321,435,772,697,196,92181,42756,23523,9688,240,6.2,5,5,9656.0,77777,9,999999999,66,0.2200,0,88,0.097,0.0,0.0 +2008,7,9,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,29.4,21.1,61,100988,855,1321,450,643,634,189,74789,38550,22094,8737,200,6.2,9,9,9656.0,1829,9,999999999,78,0.2200,0,88,0.097,0.0,0.0 +2008,7,9,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,29.4,21.1,61,100988,646,1321,425,479,513,182,53782,31692,20539,7332,200,6.2,5,5,9656.0,1829,9,999999999,78,0.2200,0,88,0.097,0.0,0.0 +2008,7,9,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,21.1,65,100938,415,1321,419,306,367,150,33068,19515,16291,4915,200,6.2,5,5,9656.0,77777,9,999999999,78,0.2200,0,88,0.097,0.0,0.0 +2008,7,9,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,28.3,21.1,65,100978,180,1321,412,144,190,88,14921,3252,9164,2073,210,6.7,3,3,9656.0,77777,9,999999999,78,0.2200,0,88,0.097,0.0,0.0 +2008,7,9,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,28.3,21.1,65,100978,0,1063,412,0,0,0,0,0,0,0,210,6.7,3,3,9000.0,77777,9,999999999,78,0.2200,0,88,0.097,0.0,0.0 +2008,7,9,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,20.0,71,101067,0,0,396,0,0,0,0,0,0,0,210,5.7,3,3,9000.0,77777,9,999999999,71,0.2200,0,88,0.097,0.0,0.0 +2008,7,9,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,20.0,71,101057,0,0,396,0,0,0,0,0,0,0,230,5.1,3,3,9000.0,77777,9,999999999,71,0.2200,0,88,0.097,0.0,0.0 +2008,7,9,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,20.0,71,101057,0,0,396,0,0,0,0,0,0,0,230,5.1,3,3,9000.0,77777,9,999999999,71,0.2200,0,88,0.097,0.0,0.0 +2008,7,9,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,20.0,79,100977,0,0,387,0,0,0,0,0,0,0,220,6.2,3,3,9000.0,77777,9,999999999,71,0.2200,0,88,0.097,0.0,0.0 +2008,7,10,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,23.9,20.0,79,100957,0,0,371,0,0,0,0,0,0,0,230,5.1,0,0,9656.0,77777,9,999999999,71,0.2200,0,88,0.097,0.0,0.0 +2008,7,10,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,23.9,20.0,79,100957,0,0,371,0,0,0,0,0,0,0,230,5.1,0,0,9000.0,77777,9,999999999,71,0.2200,0,88,0.097,0.0,0.0 +2008,7,10,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,23.3,20.0,82,100927,0,0,368,0,0,0,0,0,0,0,230,4.6,0,0,9656.0,77777,9,999999999,71,0.2200,0,88,0.097,0.0,0.0 +2008,7,10,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,22.8,20.0,84,100947,0,0,382,0,0,0,0,0,0,0,230,5.7,3,3,9656.0,77777,9,999999999,71,0.2200,0,88,0.097,0.0,0.0 +2008,7,10,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,22.8,20.0,84,100947,35,223,388,3,3,3,368,0,368,117,230,5.7,5,5,9000.0,77777,9,999999999,71,0.2200,0,88,0.097,0.0,0.0 +2008,7,10,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,23.9,20.6,82,100957,266,1322,372,71,116,50,8017,1063,5662,1881,230,5.1,0,0,8047.0,77777,9,999999999,75,0.2200,0,88,0.097,0.0,0.0 +2008,7,10,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,25.6,20.6,74,100927,501,1322,381,203,282,109,23037,13055,12419,4425,220,5.1,0,0,9656.0,77777,9,999999999,75,0.2200,0,88,0.097,0.0,0.0 +2008,7,10,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,25.6,20.6,74,100927,725,1322,381,359,356,190,40820,22461,21714,8071,220,5.1,0,0,9000.0,77777,9,999999999,75,0.2200,0,88,0.097,0.0,0.0 +2008,7,10,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,21.1,67,100838,923,1322,392,522,447,239,60271,29518,27751,10858,200,5.1,0,0,9000.0,77777,9,999999999,78,0.2200,0,88,0.097,0.0,0.0 +2008,7,10,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,29.4,21.1,61,100818,1082,1322,418,670,538,259,78757,35036,30625,12296,200,7.2,3,3,9000.0,77777,9,999999999,78,0.2200,0,88,0.097,0.0,0.0 +2008,7,10,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,29.4,21.1,61,100818,1190,1322,425,794,644,239,95351,39397,28867,11755,200,7.2,5,5,9000.0,77777,9,999999999,78,0.2200,0,88,0.097,0.0,0.0 +2008,7,10,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,31.1,21.1,55,100718,1240,1322,434,867,698,228,105194,41441,27820,11385,210,8.8,5,5,9000.0,77777,9,999999999,78,0.2200,0,88,0.097,0.0,0.0 +2008,7,10,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,31.1,21.1,55,100608,1228,1322,434,887,720,217,107860,42140,26534,10905,210,7.7,5,5,9000.0,77777,9,999999999,78,0.2200,0,88,0.097,0.0,0.0 +2008,7,10,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,31.1,21.1,55,100608,1156,1322,434,847,693,224,101753,41763,27060,11088,210,7.7,5,5,9000.0,77777,9,999999999,78,0.2200,0,88,0.097,0.0,0.0 +2008,7,10,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,31.7,19.4,48,100478,1029,1322,435,761,662,214,90247,41925,25514,10410,210,10.8,5,5,9000.0,77777,9,999999999,65,0.2200,0,88,0.097,0.0,0.0 +2008,7,10,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,31.7,19.4,48,100428,854,1322,429,633,610,197,73513,39007,22995,9022,220,10.3,3,3,9000.0,77777,9,999999999,65,0.2200,0,88,0.097,0.0,0.0 +2008,7,10,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,31.7,19.4,48,100428,645,1322,435,476,529,172,53785,32855,19530,7042,220,10.3,5,5,9000.0,77777,9,999999999,65,0.2200,0,88,0.097,0.0,0.0 +2008,7,10,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.0,19.0,52,101283,415,1322,451,294,373,134,32144,19154,14719,4611,270,8.8,9,9,9000.0,1676,0,019999999,63,0.2200,0,88,0.097,0.0,0.0 +2008,7,10,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.0,21.0,74,101282,179,1322,430,121,115,77,12680,1215,8107,2003,250,5.7,9,9,9000.0,3658,0,019999999,78,0.2200,0,88,0.097,0.0,0.0 +2008,7,10,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,27.2,21.1,69,100528,0,1056,437,0,0,0,0,0,0,0,240,3.1,9,9,9000.0,3658,9,999999999,78,0.2200,0,88,0.097,0.0,0.0 +2008,7,10,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,20.6,77,100567,0,0,424,0,0,0,0,0,0,0,200,4.1,9,9,9000.0,4267,9,999999999,75,0.2200,0,88,0.097,0.0,0.0 +2008,7,10,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,20.6,77,100577,0,0,436,0,0,0,0,0,0,0,220,6.2,10,10,9000.0,3658,9,999999999,75,0.2200,0,88,0.097,0.0,0.0 +2008,7,10,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.0,20.6,77,100577,0,0,436,0,0,0,0,0,0,0,220,6.2,10,10,9000.0,3658,9,999999999,75,0.2200,0,88,0.097,0.0,0.0 +2008,7,10,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,20.6,74,100617,0,0,439,0,0,0,0,0,0,0,260,6.2,10,10,9000.0,610,9,999999999,75,0.2200,0,88,0.097,0.0,0.0 +2008,7,11,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,24.0,21.0,83,101282,0,0,430,0,0,0,0,0,0,0,290,4.1,10,10,9656.0,1341,0,919999999,78,0.2200,0,88,0.097,1.0,0.0 +2008,7,11,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.9,21.7,88,100597,0,0,431,0,0,0,0,0,0,0,290,2.6,10,10,9656.0,1341,0,919999999,84,0.2200,0,88,0.097,0.3,0.0 +2008,7,11,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,20.6,79,100617,0,0,420,0,0,0,0,0,0,0,270,5.7,9,9,9656.0,3658,0,919999999,75,0.2200,0,88,0.097,0.0,0.0 +2008,7,11,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,20.0,79,100637,0,0,393,0,0,0,0,0,0,0,260,6.7,5,5,9656.0,77777,0,919999999,70,0.2200,0,88,0.097,0.0,0.0 +2008,7,11,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,20.0,79,100637,33,207,387,4,14,4,479,0,479,153,260,6.7,3,3,9656.0,77777,0,919999999,70,0.2200,0,88,0.097,0.0,0.0 +2008,7,11,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,16.7,66,100817,263,1322,364,83,260,37,9630,1979,4301,1467,290,6.2,0,0,9656.0,77777,0,919999999,51,0.2200,0,88,0.097,0.0,0.0 +2008,7,11,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,15.0,60,100897,499,1322,363,233,528,64,27704,22104,7629,2846,290,6.7,0,0,9656.0,77777,0,919999999,43,0.2200,0,88,0.097,0.0,0.0 +2008,7,11,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,15.0,60,100897,723,1322,363,423,728,79,51733,37550,9689,3886,290,6.7,0,0,9656.0,77777,0,919999999,43,0.2200,0,88,0.097,0.0,0.0 +2008,7,11,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,12.8,48,100927,922,1322,365,610,837,86,66093,86465,12097,2266,290,5.7,0,0,9656.0,77777,0,919999999,34,0.2200,0,88,0.097,0.0,0.0 +2008,7,11,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,12.2,45,100987,1080,1322,383,768,895,91,82914,92811,12377,3119,270,6.7,3,3,9656.0,77777,0,919999999,32,0.2200,0,88,0.097,0.0,0.0 +2008,7,11,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,12.2,45,100987,1189,1322,383,886,926,94,95505,96203,12484,4358,270,6.7,3,3,9656.0,77777,0,919999999,32,0.2200,0,88,0.097,0.0,0.0 +2008,7,11,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,12.2,39,101048,1239,1322,395,954,937,97,102703,97391,12723,5530,280,7.2,3,3,9656.0,77777,0,919999999,32,0.2200,0,88,0.097,0.0,0.0 +2008,7,11,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,12.8,38,101058,1227,1322,432,969,937,98,104464,97510,12880,5279,280,5.7,9,9,9656.0,7620,0,919999999,34,0.2200,0,88,0.097,0.0,0.0 +2008,7,11,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,28.3,12.8,38,101058,1156,1322,432,886,767,193,108382,50152,23728,9782,280,5.7,9,9,9656.0,7620,0,919999999,34,0.2200,0,88,0.097,0.0,0.0 +2008,7,11,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,13.3,40,101108,1028,1322,433,838,904,94,90675,93838,12898,2838,270,5.1,9,9,9656.0,7620,0,919999999,36,0.2200,0,88,0.097,0.0,0.0 +2008,7,11,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,12.2,37,101148,854,1322,431,704,865,88,76097,88856,12511,2074,310,6.7,9,9,9656.0,7620,0,919999999,32,0.2200,0,88,0.097,0.0,0.0 +2008,7,11,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,28.3,12.2,37,101148,644,1322,431,538,809,78,65038,42183,9456,3693,310,6.7,9,9,9656.0,7620,0,919999999,32,0.2200,0,88,0.097,0.0,0.0 +2008,7,11,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,12.2,41,101267,414,1322,398,355,708,66,41326,27558,7704,2743,280,7.2,5,5,9656.0,77777,0,919999999,32,0.2200,0,88,0.097,0.0,0.0 +2008,7,11,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,11.7,41,101317,178,1322,395,175,517,47,19277,562,5193,1549,300,5.7,5,5,9656.0,77777,0,919999999,31,0.2200,0,88,0.097,0.0,0.0 +2008,7,11,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,11.7,41,101317,0,1047,389,0,0,0,0,0,0,0,300,5.7,3,3,9656.0,77777,9,999999999,31,0.2200,0,88,0.101,0.0,0.0 +2008,7,11,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,12.8,50,101417,0,0,379,0,0,0,0,0,0,0,280,4.1,3,3,9656.0,77777,9,999999999,35,0.2200,0,88,0.101,0.0,0.0 +2008,7,11,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,12.2,51,101447,0,0,357,0,0,0,0,0,0,0,290,4.1,0,0,9656.0,77777,9,999999999,33,0.2200,0,88,0.101,0.0,0.0 +2008,7,11,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,12.2,51,101447,0,0,357,0,0,0,0,0,0,0,290,4.1,0,0,9656.0,77777,9,999999999,33,0.2200,0,88,0.101,0.0,0.0 +2008,7,11,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,12.8,57,101547,0,0,367,0,0,0,0,0,0,0,300,3.6,3,3,9656.0,77777,9,999999999,35,0.2200,0,88,0.101,0.0,0.0 +2008,7,12,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,12.8,59,101556,0,0,349,0,0,0,0,0,0,0,320,2.6,0,0,9656.0,77777,9,999999999,35,0.2200,0,88,0.101,0.0,0.0 +2008,7,12,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,12.8,59,101556,0,0,364,0,0,0,0,0,0,0,320,2.6,3,3,9656.0,77777,9,999999999,35,0.2200,0,88,0.101,0.0,0.0 +2008,7,12,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,12.8,63,101626,0,0,359,0,0,0,0,0,0,0,300,3.6,3,3,9656.0,77777,9,999999999,35,0.2200,0,88,0.101,0.0,0.0 +2008,7,12,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,12.8,66,101636,0,0,383,0,0,0,0,0,0,0,330,3.6,9,9,9656.0,7620,9,999999999,35,0.2200,0,88,0.101,0.0,0.0 +2008,7,12,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,19.4,12.8,66,101636,30,190,356,6,38,5,709,0,591,186,330,3.6,3,3,9656.0,7620,9,999999999,35,0.2200,0,88,0.101,0.0,0.0 +2008,7,12,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,12.8,61,101736,261,1322,368,59,122,43,6778,1583,4951,1657,350,3.6,5,5,9656.0,77777,9,999999999,35,0.2200,0,88,0.101,0.0,0.0 +2008,7,12,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,13.3,57,101756,497,1322,399,178,279,100,20451,14298,11531,4123,20,2.1,9,9,9656.0,7620,9,999999999,36,0.2200,0,88,0.101,0.0,0.0 +2008,7,12,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,13.3,57,101756,722,1322,376,398,624,91,48199,34185,11055,4405,20,2.1,5,5,9656.0,7620,9,999999999,36,0.2200,0,88,0.101,0.0,0.0 +2008,7,12,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,14.4,63,101826,920,1322,397,588,792,95,63820,82085,13301,2350,130,3.1,9,9,9656.0,7620,9,999999999,41,0.2200,0,88,0.101,0.0,0.0 +2008,7,12,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,13.9,59,101856,1079,1322,399,645,543,247,76554,38684,29481,11840,100,2.6,9,9,9656.0,7620,9,999999999,39,0.2200,0,88,0.101,0.0,0.0 +2008,7,12,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,13.9,59,101856,1187,1322,399,787,663,212,95939,43733,25980,10636,100,2.6,9,9,9656.0,7620,9,999999999,39,0.2200,0,88,0.101,0.0,0.0 +2008,7,12,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,13.9,54,101787,1238,1322,409,883,771,173,110007,47565,21657,8976,90,4.6,9,9,9656.0,7620,9,999999999,39,0.2200,0,88,0.101,0.0,0.0 +2008,7,12,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,15.0,57,101747,1227,1322,410,823,547,316,97767,40539,37777,14749,130,5.7,9,9,9656.0,7620,9,999999999,43,0.2200,0,88,0.101,0.0,0.0 +2008,7,12,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.9,15.0,57,101747,1155,1322,410,728,369,396,84122,30835,46074,16992,130,5.7,9,9,9656.0,7620,9,999999999,43,0.2200,0,88,0.101,0.0,0.0 +2008,7,12,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,14.4,55,101707,1027,1322,409,583,237,386,66264,20652,44170,15913,110,6.2,9,9,9656.0,4267,9,999999999,41,0.2200,0,88,0.101,0.0,0.0 +2008,7,12,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,14.4,57,101737,853,1322,406,531,337,293,59986,27478,33299,11950,110,5.1,9,9,9656.0,4267,9,999999999,41,0.2200,0,88,0.101,0.0,0.0 +2008,7,12,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.3,14.4,57,101737,643,1322,406,250,182,128,29040,10782,14928,5618,110,5.1,9,9,9656.0,4267,9,999999999,41,0.2200,0,88,0.101,0.0,0.0 +2008,7,12,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,15.6,62,101757,412,1322,408,209,134,147,22732,7798,16066,4838,110,3.1,9,9,9656.0,4267,9,999999999,46,0.2200,0,88,0.101,0.0,0.0 +2008,7,12,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,15.0,66,101796,177,1322,376,147,342,70,15607,4228,7464,1916,20,3.1,5,5,9656.0,77777,9,999999999,43,0.2200,0,88,0.101,0.0,0.0 +2008,7,12,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,15.0,66,101796,0,1038,398,0,0,0,0,0,0,0,20,3.1,9,9,9656.0,77777,9,999999999,43,0.2200,0,88,0.101,0.0,0.0 +2008,7,12,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,15.0,70,101896,0,0,392,0,0,0,0,0,0,0,100,1.5,9,9,9656.0,3048,9,999999999,43,0.2200,0,88,0.101,0.0,0.0 +2008,7,12,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,14.4,63,101906,0,0,369,0,0,0,0,0,0,0,200,3.1,3,3,9656.0,77777,9,999999999,41,0.2200,0,88,0.101,0.0,0.0 +2008,7,12,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,14.4,63,101906,0,0,354,0,0,0,0,0,0,0,200,3.1,0,0,9656.0,77777,9,999999999,41,0.2200,0,88,0.101,0.0,0.0 +2008,7,12,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,14.4,70,101926,0,0,367,0,0,0,0,0,0,0,200,2.1,5,5,9656.0,77777,9,999999999,41,0.2200,0,88,0.101,0.0,0.0 +2008,7,13,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,14.4,70,101956,0,0,388,0,0,0,0,0,0,0,200,2.1,9,9,9656.0,3353,9,999999999,41,0.2210,0,88,0.101,0.0,0.0 +2008,7,13,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,14.4,70,101956,0,0,388,0,0,0,0,0,0,0,200,2.1,9,9,9656.0,3353,9,999999999,41,0.2210,0,88,0.101,0.0,0.0 +2008,7,13,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,16.1,78,101936,0,0,390,0,0,0,0,0,0,0,300,0.0,9,9,9656.0,2438,9,999999999,49,0.2210,0,88,0.101,0.0,0.0 +2008,7,13,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,15.0,73,101966,0,0,389,0,0,0,0,0,0,0,230,3.1,9,9,9656.0,2134,9,999999999,43,0.2210,0,88,0.101,0.0,0.0 +2008,7,13,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,15.0,73,101966,28,173,389,4,13,4,479,0,479,151,230,3.1,9,9,9656.0,2134,9,999999999,43,0.2210,0,88,0.101,0.0,0.0 +2008,7,13,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,15.0,68,101996,258,1322,373,78,226,39,9008,2064,4514,1525,210,1.5,5,5,9656.0,77777,9,999999999,43,0.2210,0,88,0.101,0.0,0.0 +2008,7,13,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,15.6,68,102016,494,1322,371,218,446,76,25539,19547,8930,3289,33,0.0,3,3,9656.0,77777,9,999999999,46,0.2210,0,88,0.101,0.0,0.0 +2008,7,13,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,15.6,68,102016,720,1322,371,383,545,129,45067,32075,15240,5938,48,0.0,3,3,9656.0,77777,9,999999999,46,0.2210,0,88,0.101,0.0,0.0 +2008,7,13,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,16.7,78,101966,918,1322,394,326,181,234,37837,12747,27308,10657,90,3.6,9,9,9656.0,2438,9,999999999,51,0.2210,0,88,0.101,0.0,0.0 +2008,7,13,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,16.1,66,101947,1078,1322,383,651,550,220,77815,36617,26438,10785,70,3.6,5,5,9656.0,77777,9,999999999,48,0.2210,0,88,0.101,0.0,0.0 +2008,7,13,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,16.1,66,101947,1186,1322,405,808,685,223,97952,44642,27181,11095,70,3.6,9,9,9656.0,77777,9,999999999,48,0.2210,0,88,0.101,0.0,0.0 +2008,7,13,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,16.7,64,101907,1237,1322,412,652,358,332,77161,26433,39546,15337,100,4.6,9,9,9656.0,4267,9,999999999,51,0.2210,0,88,0.101,0.0,0.0 +2008,7,13,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,17.2,69,101887,1226,1322,410,572,222,366,67053,17036,43195,16420,80,3.1,9,9,9656.0,4267,9,999999999,54,0.2210,0,88,0.101,0.0,0.0 +2008,7,13,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.3,17.2,69,101887,1154,1322,410,553,152,417,63516,12714,48235,17552,80,3.1,9,9,9656.0,4267,9,999999999,54,0.2210,0,88,0.101,0.0,0.0 +2008,7,13,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,14.4,44,101797,1027,1322,431,414,73,354,47377,6106,40776,15074,200,6.7,9,9,9656.0,2438,9,999999999,40,0.2210,0,88,0.101,0.0,0.0 +2008,7,13,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,15.0,46,101757,852,1322,408,563,354,319,63123,29920,35991,12571,190,6.7,5,5,9656.0,77777,9,999999999,43,0.2210,0,88,0.101,0.0,0.0 +2008,7,13,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,15.0,46,101757,642,1322,402,466,427,225,51687,32358,25093,8370,190,6.7,3,3,9656.0,77777,9,999999999,43,0.2210,0,88,0.101,0.0,0.0 +2008,7,13,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,14.4,48,101697,411,1322,376,304,353,157,32902,21851,17077,4989,200,6.7,0,0,9656.0,77777,9,999999999,40,0.2210,0,88,0.101,0.0,0.0 +2008,7,13,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,13.3,48,101687,175,1322,385,145,211,88,15099,5192,9208,2015,210,6.7,3,3,9656.0,77777,9,999999999,36,0.2210,0,88,0.101,0.0,0.0 +2008,7,13,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,13.3,48,101687,0,1028,369,0,0,0,0,0,0,0,210,6.7,0,0,9656.0,77777,9,999999999,36,0.2210,0,88,0.101,0.0,0.0 +2008,7,13,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,17.8,76,101726,0,0,376,0,0,0,0,0,0,0,200,5.7,3,3,9656.0,77777,9,999999999,57,0.2210,0,88,0.101,0.0,0.0 +2008,7,13,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,18.3,81,101716,0,0,380,0,0,0,0,0,0,0,200,5.7,5,5,9656.0,77777,9,999999999,60,0.2210,0,88,0.101,0.0,0.0 +2008,7,13,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,18.3,81,101716,0,0,380,0,0,0,0,0,0,0,200,5.7,5,5,9656.0,77777,9,999999999,60,0.2210,0,88,0.101,0.0,0.0 +2008,7,13,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,18.3,84,101646,0,0,377,0,0,0,0,0,0,0,210,4.6,5,5,9656.0,77777,9,999999999,60,0.2210,0,88,0.101,0.0,0.0 +2008,7,14,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,18.3,84,101626,0,0,356,0,0,0,0,0,0,0,200,4.6,0,0,9656.0,77777,9,999999999,60,0.2210,0,88,0.101,0.0,0.0 +2008,7,14,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,18.3,84,101626,0,0,371,0,0,0,0,0,0,0,200,4.6,3,3,9656.0,77777,9,999999999,60,0.2210,0,88,0.101,0.0,0.0 +2008,7,14,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,18.3,87,101556,0,0,374,0,0,0,0,0,0,0,200,3.6,5,5,9656.0,77777,9,999999999,60,0.2210,0,88,0.101,0.0,0.0 +2008,7,14,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,18.3,87,101516,0,0,368,0,0,0,0,0,0,0,200,5.7,3,3,9656.0,77777,9,999999999,60,0.2210,0,88,0.101,0.0,0.0 +2008,7,14,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,18.3,87,101516,25,156,396,0,0,0,0,0,0,0,200,5.7,9,9,9656.0,77777,9,999999999,60,0.2210,0,88,0.101,0.0,0.0 +2008,7,14,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.0,18.0,83,101282,256,1322,398,54,64,42,6178,459,4817,1616,200,4.1,9,9,9656.0,305,9,999999999,58,0.2210,0,88,0.101,0.0,0.0 +2008,7,14,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,18.3,76,101477,492,1322,385,140,106,107,15916,5107,12211,4326,200,5.1,5,5,9656.0,77777,9,999999999,60,0.2210,0,88,0.101,0.0,0.0 +2008,7,14,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,18.3,76,101477,718,1322,385,382,563,104,45583,29442,12454,4941,200,5.1,5,5,9656.0,77777,9,999999999,60,0.2210,0,88,0.101,0.0,0.0 +2008,7,14,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,16.7,58,101377,917,1322,398,571,738,112,70108,40893,13802,5754,200,8.2,5,5,9656.0,77777,9,999999999,51,0.2210,0,88,0.101,0.0,0.0 +2008,7,14,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,16.7,54,101327,1076,1322,404,723,795,124,90157,44480,15524,6566,200,9.8,5,5,9656.0,77777,9,999999999,51,0.2210,0,88,0.101,0.0,0.0 +2008,7,14,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,16.7,54,101327,1185,1322,398,839,832,129,90864,87296,16856,5293,200,9.8,3,3,9656.0,77777,9,999999999,51,0.2210,0,88,0.101,0.0,0.0 +2008,7,14,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,16.1,48,101218,1236,1322,406,908,850,133,98006,89065,17154,6844,210,10.3,3,3,9656.0,77777,9,999999999,48,0.2210,0,88,0.101,0.0,0.0 +2008,7,14,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,15.6,46,101128,1225,1322,405,924,853,134,99550,89228,17311,6497,200,10.3,3,3,9656.0,77777,9,999999999,45,0.2210,0,88,0.101,0.0,0.0 +2008,7,14,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,15.6,46,101128,1153,1322,405,887,840,134,95610,87763,17575,4773,200,10.3,3,3,9656.0,77777,9,999999999,45,0.2210,0,88,0.101,0.0,0.0 +2008,7,14,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,15.6,46,101028,1026,1322,405,800,816,129,98850,47200,16004,6741,210,9.3,3,3,9656.0,77777,9,999999999,45,0.2210,0,88,0.101,0.0,0.0 +2008,7,14,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,16.1,49,100968,851,1322,403,670,773,121,80989,44282,14682,6007,200,7.7,3,3,9656.0,77777,9,999999999,48,0.2210,0,88,0.101,0.0,0.0 +2008,7,14,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,16.1,49,100968,641,1322,409,509,709,107,59857,38329,12628,4843,200,7.7,5,5,9656.0,77777,9,999999999,48,0.2210,0,88,0.101,0.0,0.0 +2008,7,14,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,17.2,62,100897,410,1322,396,330,585,90,37299,24007,10209,3497,190,7.7,5,5,9656.0,77777,9,999999999,53,0.2210,0,88,0.101,0.0,0.0 +2008,7,14,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,17.2,66,100937,174,1322,390,158,361,63,16867,2050,6753,1811,200,7.7,5,5,9656.0,77777,9,999999999,53,0.2210,0,88,0.101,0.0,0.0 +2008,7,14,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,17.2,66,100937,0,1018,390,0,0,0,0,0,0,0,200,7.7,5,5,9656.0,77777,9,999999999,53,0.2210,0,88,0.101,0.0,0.0 +2008,7,14,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,18.3,79,100977,0,0,382,0,0,0,0,0,0,0,170,3.6,5,5,9656.0,77777,9,999999999,60,0.2210,0,88,0.101,0.0,0.0 +2008,7,14,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.0,18.0,78,101282,0,0,415,0,0,0,0,0,0,0,190,4.1,10,10,9656.0,610,9,999999999,58,0.2210,0,88,0.101,0.0,0.0 +2008,7,14,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.8,18.9,79,100927,0,0,421,0,0,0,0,0,0,0,200,3.6,10,10,9656.0,610,9,999999999,63,0.2210,0,88,0.101,0.0,0.0 +2008,7,14,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,17.8,84,100837,0,0,407,0,0,0,0,0,0,0,100,1.5,10,10,9656.0,335,9,999999999,57,0.2210,0,88,0.101,0.0,0.0 +2008,7,15,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,18.3,84,100757,0,0,410,0,0,0,0,0,0,0,172,0.0,10,10,9656.0,335,9,999999999,60,0.2210,0,88,0.101,0.0,0.0 +2008,7,15,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,18.3,84,100757,0,0,410,0,0,0,0,0,0,0,173,0.0,10,10,9656.0,335,9,999999999,60,0.2210,0,88,0.101,0.0,0.0 +2008,7,15,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.0,19.0,83,101282,0,0,416,0,0,0,0,0,0,0,172,0.0,10,10,9656.0,305,9,999999999,64,0.2210,0,88,0.101,0.0,0.0 +2008,7,15,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.0,21.0,89,101282,0,0,390,0,0,0,0,0,0,0,210,3.1,5,5,9656.0,77777,9,999999999,78,0.2210,0,88,0.101,0.0,0.0 +2008,7,15,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,20.6,91,100677,22,138,385,0,0,0,0,0,0,0,200,2.1,5,5,9656.0,77777,9,999999999,75,0.2210,0,88,0.101,0.0,0.0 +2008,7,15,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,20.0,79,100687,253,1322,393,69,145,44,7841,776,5013,1673,210,3.6,5,5,9656.0,77777,9,999999999,71,0.2210,0,88,0.101,0.0,0.0 +2008,7,15,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.0,19.0,74,101282,490,1322,416,198,306,99,22622,13920,11353,4065,230,5.7,9,9,9656.0,579,9,999999999,64,0.2210,0,88,0.101,0.0,0.0 +2008,7,15,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,24.4,19.4,74,100737,715,1322,419,255,176,185,29039,11237,21173,7855,230,4.6,9,9,9656.0,579,9,999999999,66,0.2210,0,88,0.101,0.0,0.0 +2008,7,15,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,24.0,18.0,69,101282,915,1322,426,332,183,227,38559,12505,26507,10395,270,4.6,10,10,4023.0,2134,0,919999999,58,0.2210,0,88,0.101,0.0,0.0 +2008,7,15,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,24.0,19.0,74,101282,1075,1322,416,531,328,296,61838,23517,34684,13576,250,3.1,9,9,9656.0,77777,0,919999999,64,0.2210,0,88,0.101,0.0,0.0 +2008,7,15,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,26.1,17.8,60,100877,1184,1322,402,651,380,334,76371,28188,39438,15226,280,4.1,5,5,9656.0,77777,0,919999999,56,0.2210,0,88,0.101,0.0,0.0 +2008,7,15,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,16.7,54,100887,1235,1322,428,647,229,436,74930,19104,50859,18507,260,4.6,9,9,9656.0,7500,0,919999999,51,0.2210,0,88,0.101,0.0,0.0 +2008,7,15,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,16.7,53,100868,1224,1322,431,519,170,361,60914,13059,42654,16253,220,3.1,9,9,9656.0,4267,0,919999999,50,0.2210,0,88,0.101,0.0,0.0 +2008,7,15,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,27.2,16.7,53,100868,1152,1322,431,594,224,390,68599,18265,45350,16809,220,3.1,9,9,9656.0,4267,0,919999999,50,0.2210,0,88,0.101,0.0,0.0 +2008,7,15,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,14.4,43,100888,1025,1322,434,640,348,353,73233,29091,40657,15032,260,4.1,9,9,9656.0,4267,0,919999999,40,0.2210,0,88,0.101,0.0,0.0 +2008,7,15,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,15.6,49,100918,850,1322,429,359,73,303,40385,5982,34295,12170,250,4.6,9,9,9656.0,4267,0,919999999,45,0.2210,0,88,0.101,0.0,0.0 +2008,7,15,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,27.2,15.6,49,100918,640,1322,429,349,231,228,38629,17518,25376,8411,250,4.6,9,9,9656.0,4267,0,919999999,45,0.2210,0,88,0.101,0.0,0.0 +2008,7,15,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,12.8,41,101018,408,1322,426,246,224,153,26692,13882,16682,4901,250,4.6,9,9,9656.0,4267,0,919999999,34,0.2210,0,88,0.101,0.0,0.0 +2008,7,15,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,15.6,54,101097,172,1322,420,119,153,81,12436,2783,8505,1958,270,4.6,9,9,9656.0,4267,0,919999999,45,0.2210,0,88,0.101,0.0,0.0 +2008,7,15,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.6,15.6,54,101097,0,1006,397,0,0,0,0,0,0,0,270,4.6,5,5,9656.0,4267,9,999999999,45,0.2210,0,88,0.101,0.0,0.0 +2008,7,15,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,13.9,52,101217,0,0,388,0,0,0,0,0,0,0,280,3.6,5,5,9656.0,77777,9,999999999,38,0.2210,0,88,0.101,0.0,0.0 +2008,7,15,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,14.4,54,101267,0,0,383,0,0,0,0,0,0,0,288,2.6,3,3,9656.0,77777,9,999999999,40,0.2210,0,88,0.101,0.0,0.0 +2008,7,15,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,14.4,54,101267,0,0,383,0,0,0,0,0,0,0,285,2.3,3,3,9656.0,77777,9,999999999,40,0.2210,0,88,0.101,0.0,0.0 +2008,7,15,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,14.4,59,101297,0,0,375,0,0,0,0,0,0,0,290,2.1,3,3,9656.0,77777,9,999999999,41,0.2210,0,88,0.101,0.0,0.0 +2008,7,16,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,13.9,57,101347,0,0,374,0,0,0,0,0,0,0,290,3.6,3,3,9656.0,77777,9,999999999,39,0.2210,0,88,0.101,0.0,0.0 +2008,7,16,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,13.9,57,101347,0,0,359,0,0,0,0,0,0,0,290,3.6,0,0,9656.0,77777,9,999999999,39,0.2210,0,88,0.101,0.0,0.0 +2008,7,16,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,15.0,68,101406,0,0,352,0,0,0,0,0,0,0,290,1.5,0,0,9656.0,77777,9,999999999,43,0.2210,0,88,0.101,1.8,0.0 +2008,7,16,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,15.0,73,101476,0,0,347,0,0,0,0,0,0,0,291,0.0,0,0,9656.0,77777,9,999999999,43,0.2210,0,88,0.101,0.0,0.0 +2008,7,16,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,15.0,73,101476,19,119,367,0,0,0,0,0,0,0,291,0.0,5,5,9656.0,77777,9,999999999,43,0.2210,0,88,0.101,0.0,0.0 +2008,7,16,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,16.1,75,101606,250,1322,372,79,274,33,9210,1137,3854,1313,286,0.0,5,5,9656.0,77777,9,999999999,48,0.2210,0,88,0.101,0.0,0.0 +2008,7,16,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,16.7,64,101627,487,1322,389,222,515,63,26323,20318,7489,2786,230,1.5,5,5,9656.0,77777,9,999999999,51,0.2210,0,88,0.101,0.0,0.0 +2008,7,16,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,16.7,64,101627,713,1322,389,404,691,83,49073,34924,10112,4042,230,1.5,5,5,9656.0,77777,9,999999999,51,0.2210,0,88,0.101,0.0,0.0 +2008,7,16,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,13.3,42,101677,913,1322,396,581,785,97,62818,81081,13576,2337,245,1.5,3,3,9656.0,77777,9,999999999,36,0.2210,0,88,0.101,0.0,0.0 +2008,7,16,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,13.3,40,101707,1073,1322,408,737,839,107,79433,87118,14444,3349,220,5.7,5,5,9656.0,77777,9,999999999,36,0.2210,0,88,0.101,0.0,0.0 +2008,7,16,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,13.3,40,101707,1182,1322,408,853,864,119,91595,89844,15609,4986,220,5.7,5,5,9656.0,77777,9,999999999,36,0.2210,0,88,0.101,0.0,0.0 +2008,7,16,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,15.0,47,101687,1233,1322,398,922,876,125,99335,91538,16184,6476,150,3.1,3,3,9656.0,77777,9,999999999,43,0.2210,0,88,0.101,0.0,0.0 +2008,7,16,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.6,13.3,35,101648,1223,1322,415,939,880,125,100656,91529,16207,6138,190,5.7,3,3,9656.0,77777,9,999999999,36,0.2210,0,88,0.101,0.0,0.0 +2008,7,16,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.6,13.3,35,101648,1151,1322,421,812,680,206,98749,45125,25182,10331,190,5.7,5,5,9656.0,77777,9,999999999,36,0.2210,0,88,0.101,0.0,0.0 +2008,7,16,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,29.4,12.8,36,101608,1024,1322,414,636,467,270,74405,35344,31770,12458,260,5.7,5,5,9656.0,77777,9,999999999,34,0.2210,0,88,0.101,0.0,0.0 +2008,7,16,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.0,13.9,37,101628,849,1322,419,591,605,185,69227,40944,21775,8559,270,5.1,5,5,9656.0,77777,9,999999999,38,0.2210,0,88,0.101,0.0,0.0 +2008,7,16,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.0,13.9,37,101628,638,1322,419,516,730,104,60882,40404,12314,4721,270,5.1,5,5,9656.0,77777,9,999999999,38,0.2210,0,88,0.101,0.0,0.0 +2008,7,16,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,29.4,11.7,34,101678,407,1322,412,335,615,86,38127,27204,9821,3367,280,4.6,5,5,9656.0,77777,9,999999999,31,0.2210,0,88,0.101,0.0,0.0 +2008,7,16,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,12.2,37,101737,170,1322,401,161,409,57,17371,2281,6173,1702,310,4.1,3,3,9656.0,77777,9,999999999,32,0.2210,0,88,0.101,0.0,0.0 +2008,7,16,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,12.2,37,101737,0,994,401,0,0,0,0,0,0,0,310,4.1,3,3,9656.0,77777,9,999999999,32,0.2210,0,88,0.101,0.0,0.0 +2008,7,16,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,15.6,58,101887,0,0,385,0,0,0,0,0,0,0,220,4.6,3,3,9656.0,77777,9,999999999,46,0.2210,0,88,0.101,0.0,0.0 +2008,7,16,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,16.1,64,101917,0,0,380,0,0,0,0,0,0,0,210,2.6,3,3,9656.0,77777,9,999999999,48,0.2210,0,88,0.101,0.0,0.0 +2008,7,16,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,16.1,64,101917,0,0,380,0,0,0,0,0,0,0,210,2.6,3,3,9656.0,77777,9,999999999,48,0.2210,0,88,0.101,0.0,0.0 +2008,7,16,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,16.1,66,101966,0,0,377,0,0,0,0,0,0,0,270,2.1,3,3,9656.0,77777,9,999999999,48,0.2210,0,88,0.101,0.0,0.0 +2008,7,17,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,14.4,59,101956,0,0,375,0,0,0,0,0,0,0,310,1.5,3,3,9656.0,77777,9,999999999,41,0.2210,0,88,0.101,0.0,0.0 +2008,7,17,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,14.4,59,101956,0,0,375,0,0,0,0,0,0,0,310,1.5,3,3,9656.0,77777,9,999999999,41,0.2210,0,88,0.101,0.0,0.0 +2008,7,17,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,13.3,59,101956,0,0,353,0,0,0,0,0,0,0,310,2.6,0,0,9656.0,77777,9,999999999,37,0.2210,0,88,0.101,0.0,0.0 +2008,7,17,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,13.3,61,102016,0,0,350,0,0,0,0,0,0,0,320,2.6,0,0,9656.0,77777,9,999999999,37,0.2210,0,88,0.101,0.0,0.0 +2008,7,17,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,13.3,61,102016,16,100,350,0,0,0,0,0,0,0,320,2.6,0,0,9656.0,77777,9,999999999,37,0.2210,0,88,0.101,0.0,0.0 +2008,7,17,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,13.9,59,102086,248,1322,356,81,316,30,9519,1313,3531,1206,334,0.0,0,0,9656.0,77777,9,999999999,39,0.2210,0,88,0.101,0.0,0.0 +2008,7,17,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,15.0,66,102106,485,1322,355,228,571,54,27377,22122,6498,2428,140,1.5,0,0,9656.0,77777,9,999999999,43,0.2210,0,88,0.101,0.0,0.0 +2008,7,17,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,15.0,66,102106,711,1322,355,410,730,75,50227,37058,9213,3686,140,1.5,0,0,9656.0,77777,9,999999999,43,0.2210,0,88,0.101,0.0,0.0 +2008,7,17,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,12.2,43,102087,911,1322,371,590,816,88,63781,84113,12384,2251,285,1.5,0,0,9656.0,77777,9,999999999,33,0.2210,0,88,0.101,0.0,0.0 +2008,7,17,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,13.3,47,102077,1072,1322,372,746,870,96,80659,90405,13046,3148,80,3.6,0,0,9656.0,77777,9,999999999,36,0.2210,0,88,0.101,0.0,0.0 +2008,7,17,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,13.3,47,102077,1181,1322,394,865,901,101,93332,93800,13384,4452,80,3.6,5,5,9656.0,77777,9,999999999,36,0.2210,0,88,0.101,0.0,0.0 +2008,7,17,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,13.3,47,102037,1232,1322,388,936,916,104,100869,95411,13610,5632,90,5.1,3,3,9656.0,77777,9,999999999,36,0.2210,0,88,0.101,0.0,0.0 +2008,7,17,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,13.3,45,101997,1222,1322,391,952,918,105,102573,95600,13764,5398,110,6.7,3,3,9656.0,77777,9,999999999,36,0.2210,0,88,0.101,0.0,0.0 +2008,7,17,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,13.3,45,101997,1150,1322,391,914,907,103,98581,94363,13720,4064,110,6.7,3,3,9656.0,77777,9,999999999,36,0.2210,0,88,0.101,0.0,0.0 +2008,7,17,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,14.4,45,101917,1023,1322,398,824,884,100,89290,91966,13694,2890,120,5.7,3,3,9656.0,77777,9,999999999,40,0.2210,0,88,0.101,0.0,0.0 +2008,7,17,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,13.9,42,101877,848,1322,400,690,845,94,74793,87082,13339,2090,110,5.1,3,3,9656.0,77777,9,999999999,38,0.2210,0,88,0.101,0.0,0.0 +2008,7,17,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,13.9,42,101877,637,1322,400,525,788,82,63068,40522,9880,3844,110,5.1,3,3,9656.0,77777,9,999999999,38,0.2210,0,88,0.101,0.0,0.0 +2008,7,17,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,17.2,64,101807,405,1322,387,342,680,69,39436,23742,7980,2824,110,6.2,3,3,9656.0,77777,9,999999999,54,0.2210,0,88,0.101,0.0,0.0 +2008,7,17,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,16.7,73,101856,168,1322,372,164,469,48,17872,0,5248,1532,120,1.5,3,3,9656.0,77777,9,999999999,51,0.2210,0,88,0.101,0.0,0.0 +2008,7,17,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,16.7,73,101856,0,981,372,0,0,0,0,0,0,0,120,1.5,3,3,9656.0,77777,9,999999999,51,0.2210,0,88,0.101,0.0,0.0 +2008,7,17,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,16.7,68,101867,0,0,378,0,0,0,0,0,0,0,170,5.1,3,3,9656.0,77777,9,999999999,51,0.2210,0,88,0.101,0.0,0.0 +2008,7,17,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,16.7,68,101907,0,0,378,0,0,0,0,0,0,0,210,4.1,3,3,9656.0,77777,9,999999999,51,0.2210,0,88,0.101,0.0,0.0 +2008,7,17,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,16.7,68,101907,0,0,362,0,0,0,0,0,0,0,210,4.1,0,0,9656.0,77777,9,999999999,51,0.2210,0,88,0.101,0.0,0.0 +2008,7,17,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,18.3,79,101876,0,0,361,0,0,0,0,0,0,0,220,3.1,0,0,9656.0,77777,9,999999999,60,0.2210,0,88,0.101,0.0,0.0 +2008,7,18,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,17.2,73,101866,0,0,360,0,0,0,0,0,0,0,230,3.6,0,0,9656.0,77777,9,999999999,54,0.2210,0,88,0.101,0.0,0.0 +2008,7,18,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,17.2,73,101866,0,0,360,0,0,0,0,0,0,0,230,3.6,0,0,9656.0,77777,9,999999999,54,0.2210,0,88,0.101,0.0,0.0 +2008,7,18,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,15.6,68,101796,0,0,355,0,0,0,0,0,0,0,210,2.6,0,0,9656.0,77777,9,999999999,46,0.2210,0,88,0.101,0.0,0.0 +2008,7,18,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,15.6,68,101816,0,0,371,0,0,0,0,0,0,0,230,2.6,3,3,9656.0,77777,9,999999999,46,0.2210,0,88,0.101,0.0,0.0 +2008,7,18,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,15.6,68,101816,13,81,371,0,0,0,0,0,0,0,230,2.6,3,3,9656.0,77777,9,999999999,46,0.2210,0,88,0.101,0.0,0.0 +2008,7,18,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,15.6,62,101867,245,1322,385,72,217,36,8322,1062,4169,1405,280,3.6,5,5,9656.0,77777,9,999999999,46,0.2210,0,88,0.101,0.0,0.0 +2008,7,18,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,15.6,58,101907,482,1322,391,209,440,72,24519,18595,8471,3114,310,3.6,5,5,9656.0,77777,9,999999999,46,0.2210,0,88,0.101,0.0,0.0 +2008,7,18,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,15.6,58,101907,709,1322,391,380,587,111,45148,32841,13236,5200,310,3.6,5,5,9656.0,77777,9,999999999,46,0.2210,0,88,0.101,0.0,0.0 +2008,7,18,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,16.1,48,101897,909,1322,412,553,675,137,66829,39893,16625,6853,10,4.6,5,5,9656.0,77777,9,999999999,48,0.2210,0,88,0.101,0.0,0.0 +2008,7,18,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,16.7,48,101887,1070,1322,441,668,613,216,79825,40291,25949,10605,360,2.6,9,9,9656.0,7620,9,999999999,51,0.2210,0,88,0.101,0.0,0.0 +2008,7,18,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,28.9,16.7,48,101887,1180,1322,441,766,616,251,91896,41523,30285,12212,360,2.6,9,9,9656.0,7620,9,999999999,51,0.2210,0,88,0.101,0.0,0.0 +2008,7,18,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,16.1,51,101827,1231,1322,430,899,826,150,96698,86453,19225,7180,80,4.6,9,9,9656.0,7620,9,999999999,48,0.2210,0,88,0.101,0.0,0.0 +2008,7,18,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,16.7,49,101817,1221,1322,437,879,725,211,107438,45670,25928,10638,100,5.1,9,9,9656.0,7620,9,999999999,51,0.2210,0,88,0.101,0.0,0.0 +2008,7,18,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,28.3,16.7,49,101817,1149,1322,437,844,722,204,102430,45718,24887,10243,100,5.1,9,9,9656.0,7620,9,999999999,51,0.2210,0,88,0.101,0.0,0.0 +2008,7,18,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,16.1,49,101757,1021,1322,434,789,786,146,96493,46619,17933,7513,120,3.6,9,9,9656.0,8230,9,999999999,48,0.2210,0,88,0.101,0.0,0.0 +2008,7,18,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,15.6,47,101717,846,1322,433,606,554,207,70239,38358,24116,9325,120,4.1,9,9,9656.0,8534,9,999999999,45,0.2210,0,88,0.101,0.0,0.0 +2008,7,18,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,27.8,15.6,47,101717,635,1322,433,467,562,159,53183,35774,18190,6597,120,4.1,9,9,9656.0,8534,9,999999999,45,0.2210,0,88,0.101,0.0,0.0 +2008,7,18,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,17.2,69,101697,403,1322,410,310,513,109,34430,23542,12156,3979,120,3.1,9,9,9656.0,8230,9,999999999,54,0.2210,0,88,0.101,0.0,0.0 +2008,7,18,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,17.2,71,101727,166,1322,384,152,364,61,16204,1235,6529,1735,90,2.1,5,5,9656.0,77777,9,999999999,54,0.2210,0,88,0.101,0.0,0.0 +2008,7,18,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,17.2,71,101727,0,968,363,0,0,0,0,0,0,0,90,2.1,0,0,9656.0,77777,9,999999999,54,0.2210,0,88,0.101,0.0,0.0 +2008,7,18,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,16.1,60,101727,0,0,385,0,0,0,0,0,0,0,106,0.0,3,3,9656.0,77777,9,999999999,48,0.2210,0,88,0.101,0.0,0.0 +2008,7,18,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,16.1,66,101717,0,0,377,0,0,0,0,0,0,0,160,1.5,3,3,9656.0,77777,9,999999999,48,0.2210,0,88,0.101,0.0,0.0 +2008,7,18,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,16.1,66,101717,0,0,361,0,0,0,0,0,0,0,160,1.5,0,0,9656.0,77777,9,999999999,48,0.2210,0,88,0.101,0.0,0.0 +2008,7,18,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,16.1,62,101697,0,0,367,0,0,0,0,0,0,0,201,0.0,0,0,9656.0,77777,9,999999999,48,0.2210,0,88,0.101,0.0,0.0 +2008,7,19,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,16.7,71,101637,0,0,375,0,0,0,0,0,0,0,170,1.5,3,3,9656.0,77777,9,999999999,51,0.2210,0,88,0.101,0.0,0.0 +2008,7,19,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,16.7,71,101637,0,0,375,0,0,0,0,0,0,0,170,1.5,3,3,9656.0,77777,9,999999999,51,0.2210,0,88,0.101,0.0,0.0 +2008,7,19,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,17.2,71,101597,0,0,378,0,0,0,0,0,0,0,230,2.1,3,3,9656.0,77777,9,999999999,54,0.2210,0,88,0.101,0.0,0.0 +2008,7,19,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,17.8,76,101587,0,0,382,0,0,0,0,0,0,0,170,1.5,5,5,9656.0,77777,9,999999999,57,0.2210,0,88,0.101,0.0,0.0 +2008,7,19,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,17.8,76,101587,10,61,382,0,0,0,0,0,0,0,170,1.5,5,5,9656.0,77777,9,999999999,57,0.2210,0,88,0.101,0.0,0.0 +2008,7,19,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,22.2,18.3,79,101577,242,1323,382,59,137,37,6781,301,4262,1433,190,2.6,5,5,9656.0,77777,9,999999999,60,0.2210,0,88,0.101,0.0,0.0 +2008,7,19,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,17.8,64,101637,480,1323,390,161,213,97,18402,9774,11127,3965,261,0.0,3,3,9656.0,77777,9,999999999,57,0.2210,0,88,0.101,0.0,0.0 +2008,7,19,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,17.8,64,101637,707,1323,420,321,365,156,37052,22275,18088,6861,243,0.0,9,9,9656.0,77777,9,999999999,57,0.2210,0,88,0.101,0.0,0.0 +2008,7,19,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,17.2,49,101578,908,1323,417,536,639,139,64625,37267,16829,6934,250,0.0,5,5,9656.0,77777,9,999999999,53,0.2210,0,88,0.101,0.0,0.0 +2008,7,19,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,18.9,57,101547,1068,1323,416,690,719,154,84410,40929,18925,7953,150,3.6,5,5,9656.0,77777,9,999999999,63,0.2210,0,88,0.101,0.0,0.0 +2008,7,19,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,18.9,57,101547,1178,1323,416,795,716,190,97196,42467,23348,9677,150,3.6,5,5,9656.0,77777,9,999999999,63,0.2210,0,88,0.101,0.0,0.0 +2008,7,19,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,18.3,53,101468,1230,1323,443,785,501,334,92629,36366,39670,15380,110,2.6,9,9,9656.0,1829,9,999999999,59,0.2210,0,88,0.101,0.0,0.0 +2008,7,19,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,32.8,17.2,39,101398,1220,1323,465,811,541,313,96138,38952,37340,14620,250,5.1,9,9,9656.0,1676,9,999999999,53,0.2210,0,88,0.101,0.0,0.0 +2008,7,19,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,32.8,17.2,39,101398,1148,1323,465,706,357,390,81440,28989,45299,16784,250,5.1,9,9,9656.0,1676,9,999999999,53,0.2210,0,88,0.101,0.0,0.0 +2008,7,19,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,32.8,17.8,41,101298,1020,1323,466,615,303,369,69870,24974,42204,15416,250,5.1,9,9,9656.0,1829,9,999999999,56,0.2210,0,88,0.101,0.0,0.0 +2008,7,19,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,32.8,17.8,41,101278,845,1323,466,539,357,290,60676,27946,32844,11792,260,4.6,9,9,9656.0,4877,9,999999999,56,0.2210,0,88,0.101,0.0,0.0 +2008,7,19,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,32.8,17.8,41,101278,634,1323,466,432,437,194,48299,29626,21802,7565,260,4.6,9,9,9656.0,4877,9,999999999,56,0.2210,0,88,0.101,0.0,0.0 +2008,7,19,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,31.7,18.9,47,101268,401,1323,435,273,314,141,29610,16627,15367,4642,240,6.2,5,5,9656.0,77777,9,999999999,63,0.2210,0,88,0.101,0.0,0.0 +2008,7,19,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.6,18.9,50,101348,164,1323,454,119,107,85,12287,1819,8820,1878,250,4.1,9,9,9656.0,8230,9,999999999,63,0.2210,0,88,0.101,0.0,0.0 +2008,7,19,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,30.6,18.9,50,101348,0,953,454,0,0,0,0,0,0,0,250,4.1,9,9,9656.0,8230,9,999999999,63,0.2210,0,88,0.105,0.0,0.0 +2008,7,19,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,22.0,19.0,83,101282,0,0,382,0,0,0,0,0,0,0,161,1.5,5,5,4023.0,1829,0,019999999,64,0.2210,0,88,0.105,3.0,0.0 +2008,7,19,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,17.2,87,101556,0,0,367,0,0,0,0,0,0,0,90,3.1,5,5,4023.0,77777,0,019999999,54,0.2210,0,88,0.105,0.3,0.0 +2008,7,19,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,17.2,87,101556,0,0,361,0,0,0,0,0,0,0,90,3.1,3,3,4023.0,77777,0,019999999,54,0.2210,0,88,0.105,0.0,0.0 +2008,7,19,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,17.8,87,101476,0,0,350,0,0,0,0,0,0,0,180,4.6,0,0,4023.0,77777,0,019999999,57,0.2210,0,88,0.105,0.0,0.0 +2008,7,20,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,17.8,84,101436,0,0,353,0,0,0,0,0,0,0,190,3.6,0,0,4023.0,77777,0,019999999,57,0.2200,0,88,0.105,0.0,0.0 +2008,7,20,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,17.8,84,101436,0,0,368,0,0,0,0,0,0,0,190,3.6,3,3,4023.0,77777,0,019999999,57,0.2200,0,88,0.105,0.0,0.0 +2008,7,20,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,18.3,81,101367,0,0,358,0,0,0,0,0,0,0,217,0.0,0,0,4023.0,77777,0,019999999,60,0.2200,0,88,0.105,0.0,0.0 +2008,7,20,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,18.3,87,101326,0,0,353,0,0,0,0,0,0,0,200,2.6,0,0,4023.0,77777,0,019999999,60,0.2200,0,88,0.105,0.0,0.0 +2008,7,20,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,18.3,87,101326,7,41,396,0,0,0,0,0,0,0,200,2.6,9,9,4023.0,77777,0,019999999,60,0.2200,0,88,0.105,0.0,0.0 +2008,7,20,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,19.4,81,101347,239,1323,365,46,29,41,5232,66,4675,1553,250,2.6,0,0,4023.0,77777,0,019999999,67,0.2200,0,88,0.105,0.0,0.0 +2008,7,20,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,19.4,74,101347,477,1323,373,153,152,102,17378,6872,11629,4112,240,3.6,0,0,4023.0,77777,0,019999999,67,0.2200,0,88,0.105,0.0,0.0 +2008,7,20,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,19.4,74,101347,705,1323,419,302,269,172,34519,16640,19755,7380,240,3.6,9,9,4023.0,77777,0,019999999,67,0.2200,0,88,0.105,0.0,0.0 +2008,7,20,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,18.9,55,101318,906,1323,444,487,426,219,56580,28351,25580,10061,260,3.6,9,9,4023.0,4267,0,019999999,63,0.2200,0,88,0.105,0.0,0.0 +2008,7,20,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.6,18.9,50,101318,1067,1323,405,566,337,319,65447,25092,37122,14287,250,5.1,0,0,4023.0,77777,0,019999999,63,0.2200,0,88,0.105,0.0,0.0 +2008,7,20,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.6,18.9,50,101318,1177,1323,405,686,397,349,80031,29630,40987,15685,250,5.1,0,0,4023.0,77777,0,019999999,63,0.2200,0,88,0.105,0.0,0.0 +2008,7,20,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,32.8,17.2,39,101248,1229,1323,439,756,427,370,88568,32907,43642,16553,260,3.6,5,5,4023.0,77777,0,019999999,53,0.2200,0,88,0.105,0.0,0.0 +2008,7,20,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,33.3,17.8,40,101218,1218,1323,442,843,597,293,100370,41532,35102,13895,250,7.2,5,5,4023.0,77777,0,019999999,56,0.2200,0,88,0.105,0.0,0.0 +2008,7,20,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,33.3,17.8,40,101218,1147,1323,442,831,638,263,98787,43447,31449,12602,250,7.2,5,5,4023.0,77777,0,019999999,56,0.2200,0,88,0.105,0.0,0.0 +2008,7,20,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,34.4,15.6,33,101128,1019,1323,446,743,588,263,86858,42798,30923,12189,250,7.2,5,5,4023.0,77777,0,019999999,45,0.2200,0,88,0.105,0.0,0.0 +2008,7,20,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,33.9,15.6,33,101078,843,1323,443,613,513,250,69952,38503,28690,10677,290,7.2,5,5,4023.0,77777,0,019999999,45,0.2200,0,88,0.105,0.0,0.0 +2008,7,20,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,33.9,15.6,33,101078,632,1323,469,450,385,230,49688,29389,25537,8374,290,7.2,9,9,4023.0,77777,0,019999999,45,0.2200,0,88,0.105,0.0,0.0 +2008,7,20,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,32.2,17.8,42,101138,399,1323,462,279,251,173,29753,15826,18548,5067,240,5.7,9,9,4023.0,77777,0,019999999,56,0.2200,0,88,0.105,0.0,0.0 +2008,7,20,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,31.1,18.9,48,101208,161,1323,457,86,64,61,9129,65,6502,1706,280,8.8,9,9,9656.0,4200,0,019999999,63,0.2200,0,88,0.105,0.0,0.0 +2008,7,20,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,31.1,18.9,48,101208,0,938,457,0,0,0,0,0,0,0,280,8.7,9,9,9000.0,4200,9,999999999,63,0.2200,0,88,0.105,0.0,0.0 +2008,7,20,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,17.8,79,101327,0,0,402,0,0,0,0,0,0,0,160,1.5,9,9,9000.0,7620,9,999999999,57,0.2200,0,88,0.105,0.0,0.0 +2008,7,20,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,22.2,18.3,79,101297,0,0,382,0,0,0,0,0,0,0,160,2.1,5,5,9656.0,77777,9,999999999,60,0.2200,0,88,0.105,0.0,0.0 +2008,7,20,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,22.2,18.3,79,101297,0,0,382,0,0,0,0,0,0,0,160,2.1,5,5,9000.0,77777,9,999999999,60,0.2200,0,88,0.105,0.0,0.0 +2008,7,20,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,18.9,74,101287,0,0,370,0,0,0,0,0,0,0,230,1.5,0,0,9000.0,77777,9,999999999,63,0.2200,0,88,0.105,0.0,0.0 +2008,7,21,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,20.0,71,101267,0,0,380,0,0,0,0,0,0,0,240,2.6,0,0,9000.0,77777,9,999999999,71,0.2200,0,88,0.105,0.0,0.0 +2008,7,21,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,20.0,71,101267,0,0,396,0,0,0,0,0,0,0,240,2.6,3,3,9000.0,77777,9,999999999,71,0.2200,0,88,0.105,0.0,0.0 +2008,7,21,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,20.0,71,101247,0,0,380,0,0,0,0,0,0,0,270,2.6,0,0,9000.0,77777,9,999999999,71,0.2200,0,88,0.105,0.0,0.0 +2008,7,21,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,20.0,76,101267,0,0,374,0,0,0,0,0,0,0,220,3.1,0,0,9000.0,77777,9,999999999,71,0.2200,0,88,0.105,0.0,0.0 +2008,7,21,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,20.0,76,101267,3,20,419,0,0,0,0,0,0,0,220,3.1,9,9,9000.0,77777,9,999999999,71,0.2200,0,88,0.105,0.0,0.0 +2008,7,21,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,23.9,20.6,82,101307,236,1323,417,44,45,36,5044,0,4136,1391,200,2.6,9,9,9656.0,4572,9,999999999,75,0.2200,0,88,0.105,0.0,0.0 +2008,7,21,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,20.6,79,101337,475,1323,420,75,1,74,8722,37,8632,3168,200,2.1,9,9,9656.0,4572,9,999999999,75,0.2200,0,88,0.105,0.0,0.0 +2008,7,21,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,24.4,20.6,79,101337,702,1323,420,130,4,128,15185,213,15013,5836,200,2.1,9,9,9656.0,4572,9,999999999,75,0.2200,0,88,0.105,0.0,0.0 +2008,7,21,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,26.7,21.1,71,101307,904,1323,434,336,121,256,38451,8299,29467,11284,150,3.1,9,9,9656.0,5486,9,999999999,79,0.2200,0,88,0.105,0.0,0.0 +2008,7,21,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,21.1,67,101277,1065,1323,453,316,62,273,36894,4153,32066,12740,80,2.6,10,10,9656.0,4572,9,999999999,79,0.2200,0,88,0.105,0.0,0.0 +2008,7,21,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,27.8,21.1,67,101277,1175,1323,453,284,17,269,33724,1094,32136,12895,80,2.6,10,10,9656.0,4572,9,999999999,79,0.2200,0,88,0.105,0.0,0.0 +2008,7,21,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,24.4,20.6,79,101247,1227,1323,420,214,9,206,26130,524,25289,10431,70,2.6,9,9,9656.0,4572,9,999999999,75,0.2200,0,88,0.105,0.0,0.0 +2008,7,21,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,26.7,21.1,71,101197,1217,1323,434,498,110,396,57711,8291,46216,17291,80,4.1,9,9,9656.0,4572,9,999999999,79,0.2200,0,88,0.105,0.0,0.0 +2008,7,21,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,26.7,21.1,71,101197,1145,1323,446,432,101,340,50158,7265,39738,15276,80,4.1,10,10,9000.0,4572,9,999999999,79,0.2200,0,88,0.105,0.0,0.0 +2008,7,21,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,24.0,22.0,89,101282,1017,1323,420,300,92,220,35332,5605,26053,10601,40,5.1,9,9,3219.0,1676,0,019999999,87,0.2200,0,88,0.105,0.0,0.0 +2008,7,21,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,23.0,22.0,94,101282,842,1323,414,143,36,113,17249,1784,13682,5633,40,5.1,9,9,2414.0,671,0,019999999,87,0.2200,0,88,0.105,0.0,0.0 +2008,7,21,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,20.0,87,101087,630,1323,407,181,112,128,20864,5998,14816,5564,130,3.1,9,9,2414.0,671,0,019999999,71,0.2200,0,88,0.105,0.0,0.0 +2008,7,21,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.7,19.4,87,101007,397,1323,404,117,77,94,13102,3002,10566,3559,90,3.6,9,9,8047.0,77777,0,019999999,67,0.2200,0,88,0.105,0.0,0.0 +2008,7,21,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,19.4,87,100957,159,1323,381,71,48,63,7501,70,6684,1711,50,3.1,5,5,8047.0,77777,0,019999999,67,0.2200,0,88,0.105,0.0,0.0 +2008,7,21,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,19.4,87,100957,0,923,404,0,0,0,0,0,0,0,50,3.1,9,9,8047.0,77777,9,999999999,67,0.2200,0,88,0.105,5.0,0.0 +2008,7,21,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,20.6,77,100907,0,0,424,0,0,0,0,0,0,0,200,5.1,9,9,8047.0,6706,9,999999999,75,0.2200,0,88,0.105,0.0,0.0 +2008,7,21,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,20.0,76,100877,0,0,419,0,0,0,0,0,0,0,210,3.6,9,9,8047.0,6706,9,999999999,71,0.2200,0,88,0.105,0.0,0.0 +2008,7,21,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,24.4,20.0,76,100877,0,0,431,0,0,0,0,0,0,0,210,3.6,10,10,8047.0,6706,0,019999999,71,0.2200,0,88,0.105,0.0,0.0 +2008,7,21,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,22.0,21.0,94,101282,0,0,419,0,0,0,0,0,0,0,300,6.2,10,10,2816.0,701,0,019999999,79,0.2200,0,88,0.105,5.0,0.0 +2008,7,22,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,23.0,21.0,89,101282,0,0,425,0,0,0,0,0,0,0,260,2.6,10,10,9656.0,1402,0,019999999,78,0.2200,0,88,0.105,5.0,0.0 +2008,7,22,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,22.8,21.1,90,100887,0,0,424,0,0,0,0,0,0,0,220,2.6,10,10,4000.0,1402,0,019999999,79,0.2200,0,88,0.105,5.0,0.0 +2008,7,22,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,22.2,20.6,91,100777,0,0,385,0,0,0,0,0,0,0,200,2.1,5,5,8047.0,77777,0,019999999,75,0.2200,0,88,0.105,5.0,0.0 +2008,7,22,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.7,20.6,93,100787,0,0,383,0,0,0,0,0,0,0,222,0.0,5,5,8047.0,77777,0,019999999,75,0.2200,0,88,0.105,5.0,0.0 +2008,7,22,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.7,20.6,93,100787,0,0,405,0,0,0,0,0,0,0,227,0.0,9,9,8000.0,77777,0,019999999,75,0.2200,0,88,0.105,2.5,0.0 +2008,7,22,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,24.0,22.0,89,101282,233,1323,420,48,47,40,5441,0,4545,1510,250,4.6,9,9,9656.0,853,0,019999999,87,0.2200,0,88,0.105,0.0,0.0 +2008,7,22,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,21.7,85,100857,472,1323,398,165,174,109,18567,7618,12315,4301,230,5.7,5,5,9656.0,77777,0,019999999,84,0.2200,0,88,0.105,0.0,0.0 +2008,7,22,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,21.7,85,100857,700,1323,422,221,139,167,25232,8091,19158,7192,230,5.7,9,9,9656.0,77777,0,019999999,84,0.2200,0,88,0.105,0.0,0.0 +2008,7,22,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.0,21.0,74,101282,902,1323,430,317,125,252,36314,8532,29035,11143,250,4.6,9,9,9656.0,2286,0,019999999,78,0.2200,0,88,0.105,0.0,0.0 +2008,7,22,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.0,21.0,74,101282,1063,1323,430,394,94,320,45419,6783,37126,14299,250,3.6,9,9,9656.0,853,0,019999999,78,0.2200,0,88,0.105,0.0,0.0 +2008,7,22,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,26.7,21.1,71,100877,1174,1323,434,680,469,271,80682,30276,32349,12966,240,1.5,9,9,9656.0,853,0,019999999,78,0.2200,0,88,0.105,0.0,0.0 +2008,7,22,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,23.3,19.4,79,100887,1226,1323,413,404,164,263,48475,10646,31745,12773,60,6.7,9,9,4828.0,1494,0,019999999,67,0.2200,0,88,0.105,0.0,0.0 +2008,7,22,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,23.3,18.9,76,100917,1216,1323,389,704,389,346,82628,28550,40880,15731,70,6.7,5,5,9656.0,77777,0,019999999,63,0.2200,0,88,0.105,0.0,0.0 +2008,7,22,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,23.3,18.9,76,100917,1144,1323,389,776,513,324,90632,37461,38085,14752,70,6.7,5,5,9000.0,77777,0,019999999,63,0.2200,0,88,0.105,0.0,0.0 +2008,7,22,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.0,19.0,78,101282,1016,1323,387,720,521,295,83119,38056,34266,13243,70,6.2,5,5,9000.0,579,0,019999999,64,0.2200,0,88,0.105,0.0,0.0 +2008,7,22,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.0,19.0,78,101282,840,1323,422,531,331,289,59667,25490,32673,11718,30,6.7,10,10,9000.0,518,0,019999999,64,0.2200,0,88,0.105,0.0,0.0 +2008,7,22,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,23.3,20.0,82,100947,628,1323,390,383,254,237,41969,18575,26120,8472,360,4.1,5,5,8000.0,518,0,019999999,71,0.2200,0,88,0.105,0.0,0.0 +2008,7,22,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,18.9,82,100947,395,1323,383,217,138,169,23131,8377,18111,4974,40,2.1,5,5,8000.0,77777,0,019999999,63,0.2200,0,88,0.105,0.0,0.0 +2008,7,22,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,18.9,82,100947,156,1323,417,90,74,67,9448,329,7065,1729,360,3.1,10,10,8000.0,914,0,019999999,63,0.2200,0,88,0.105,0.0,0.0 +2008,7,22,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,18.9,82,100947,0,906,417,0,0,0,0,0,0,0,360,3.1,10,10,8000.0,914,9,999999999,63,0.2200,0,88,0.105,0.0,0.0 +2008,7,22,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.0,18.0,83,101282,0,0,409,0,0,0,0,0,0,0,10,3.1,10,10,8000.0,4267,9,999999999,58,0.2200,0,88,0.105,0.0,0.0 +2008,7,22,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,17.2,81,101077,0,0,406,0,0,0,0,0,0,0,10,2.6,10,10,8000.0,4267,9,999999999,54,0.2200,0,88,0.105,0.0,0.0 +2008,7,22,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.6,17.2,81,101077,0,0,367,0,0,0,0,0,0,0,10,2.6,3,3,8000.0,4267,9,999999999,54,0.2200,0,88,0.105,0.0,0.0 +2008,7,22,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,17.2,84,101056,0,0,364,0,0,0,0,0,0,0,350,2.6,3,3,8000.0,77777,9,999999999,54,0.2200,0,88,0.105,0.0,0.0 +2008,7,23,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,17.2,84,101066,0,0,364,0,0,0,0,0,0,0,350,2.6,3,3,8000.0,77777,9,999999999,54,0.2190,0,88,0.105,0.0,0.0 +2008,7,23,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,17.2,84,101066,0,0,364,0,0,0,0,0,0,0,350,2.6,3,3,8000.0,77777,9,999999999,54,0.2190,0,88,0.105,0.0,0.0 +2008,7,23,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,17.8,90,101086,0,0,362,0,0,0,0,0,0,0,10,3.1,3,3,8000.0,77777,9,999999999,57,0.2190,0,88,0.105,0.0,0.0 +2008,7,23,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,17.2,87,101086,0,0,346,0,0,0,0,0,0,0,360,1.5,0,0,8000.0,77777,9,999999999,54,0.2190,0,88,0.105,0.0,0.0 +2008,7,23,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,17.2,87,101086,0,0,400,0,0,0,0,0,0,0,360,1.5,10,10,8000.0,77777,9,999999999,54,0.2190,0,88,0.105,0.0,0.0 +2008,7,23,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,17.0,83,101281,230,1304,403,65,213,33,7512,0,3821,1284,20,3.6,10,10,8000.0,335,9,999999999,53,0.2190,0,88,0.105,0.0,0.0 +2008,7,23,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,17.2,84,101296,469,1323,403,79,50,74,9206,2024,8649,3154,40,4.1,10,10,8000.0,396,9,999999999,54,0.2190,0,88,0.105,0.0,0.0 +2008,7,23,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,17.2,84,101296,698,1323,403,144,31,132,16820,1791,15482,5967,40,4.1,10,10,8000.0,396,9,999999999,54,0.2190,0,88,0.105,0.0,0.0 +2008,7,23,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.0,17.0,78,101282,900,1323,408,222,32,206,25935,2144,24190,9563,50,2.6,10,10,8000.0,488,9,999999999,53,0.2190,0,88,0.105,0.0,0.0 +2008,7,23,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.0,17.0,78,101282,1061,1323,375,437,153,318,50588,11701,37045,14226,70,3.1,5,5,8000.0,427,9,999999999,53,0.2190,0,88,0.105,0.0,0.0 +2008,7,23,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,17.8,79,101417,1172,1323,379,756,640,205,91908,39694,25054,10316,70,3.6,5,5,8000.0,77777,9,999999999,57,0.2190,0,88,0.105,0.0,0.0 +2008,7,23,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,17.2,71,101487,1224,1323,384,875,786,167,108817,45902,20868,8688,110,5.1,5,5,8000.0,77777,9,999999999,54,0.2190,0,88,0.105,0.0,0.0 +2008,7,23,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,17.2,76,101467,1214,1323,378,891,785,171,110468,46220,21304,8863,90,5.7,5,5,8000.0,77777,9,999999999,54,0.2190,0,88,0.105,0.0,0.0 +2008,7,23,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,17.2,76,101467,1143,1323,378,847,744,188,103280,45649,23039,9547,90,5.7,5,5,8000.0,77777,9,999999999,54,0.2190,0,88,0.105,0.0,0.0 +2008,7,23,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,16.7,76,101436,1014,1323,375,755,693,192,90291,44324,23076,9475,130,3.6,5,5,8000.0,77777,9,999999999,51,0.2190,0,88,0.105,0.0,0.0 +2008,7,23,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,16.7,73,101407,838,1323,378,622,618,188,72471,40664,22012,8613,90,4.1,5,5,8000.0,77777,9,999999999,51,0.2190,0,88,0.105,0.0,0.0 +2008,7,23,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,16.7,73,101407,626,1323,400,346,232,195,38641,16037,21890,7529,90,4.1,9,9,8000.0,77777,9,999999999,51,0.2190,0,88,0.105,0.0,0.0 +2008,7,23,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,16.7,81,101486,392,1323,402,169,66,133,18411,3475,14557,4428,100,3.6,10,10,8000.0,2743,9,999999999,51,0.2190,0,88,0.105,0.0,0.0 +2008,7,23,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,16.7,81,101546,153,1323,402,70,9,67,7353,58,7069,1706,120,4.1,10,10,8000.0,2134,9,999999999,51,0.2190,0,88,0.105,0.0,0.0 +2008,7,23,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,16.7,81,101546,0,889,402,0,0,0,0,0,0,0,120,4.1,10,10,8000.0,2134,9,999999999,51,0.2190,0,88,0.105,6.0,0.0 +2008,7,23,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,19.4,17.2,87,101546,0,0,400,0,0,0,0,0,0,0,110,3.1,10,10,9656.0,2438,0,919999999,54,0.2190,0,88,0.105,0.4,0.0 +2008,7,23,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,18.9,17.2,90,101496,0,0,397,0,0,0,0,0,0,0,130,2.1,10,10,6437.0,1829,0,919999999,54,0.2190,0,88,0.105,0.0,0.0 +2008,7,23,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,18.9,17.2,90,101496,0,0,397,0,0,0,0,0,0,0,130,2.1,10,10,6000.0,1829,0,919999999,54,0.2190,0,88,0.105,0.0,0.0 +2008,7,23,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,17.8,90,101536,0,0,362,0,0,0,0,0,0,0,120,2.6,3,3,6000.0,77777,0,919999999,57,0.2190,0,88,0.105,0.0,0.0 +2008,7,24,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,17.8,90,101556,0,0,368,0,0,0,0,0,0,0,70,3.6,5,5,6000.0,77777,0,919999999,57,0.2190,0,88,0.105,0.0,0.0 +2008,7,24,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,17.8,90,101556,0,0,389,0,0,0,0,0,0,0,70,3.6,9,9,6000.0,77777,0,919999999,57,0.2190,0,88,0.105,0.0,0.0 +2008,7,24,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.0,18.0,94,101281,0,0,387,0,0,0,0,0,0,0,60,3.1,9,9,6000.0,457,0,919999999,58,0.2190,0,88,0.105,0.0,0.0 +2008,7,24,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,17.2,87,101586,0,0,389,0,0,0,0,0,0,0,50,3.6,9,9,6000.0,518,0,919999999,54,0.2190,0,88,0.105,0.0,0.0 +2008,7,24,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,19.4,17.2,87,101586,0,0,367,0,0,0,0,0,0,0,50,3.6,5,5,6000.0,518,0,919999999,54,0.2190,0,88,0.105,0.0,0.0 +2008,7,24,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.0,18.0,94,101281,227,1284,398,58,127,39,6599,76,4448,1468,60,4.1,10,10,6000.0,305,0,919999999,58,0.2190,0,88,0.105,0.0,0.0 +2008,7,24,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.0,18.0,94,101281,466,1324,398,46,22,44,5572,710,5339,1996,60,5.1,10,10,6000.0,244,0,919999999,58,0.2190,0,88,0.105,0.0,0.0 +2008,7,24,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,17.8,87,101726,695,1324,404,90,3,90,10818,151,10852,4302,70,3.1,10,10,6000.0,244,0,919999999,57,0.2190,0,88,0.105,0.0,0.0 +2008,7,24,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,17.8,84,101846,897,1324,407,206,17,195,24143,1102,22969,9147,50,3.1,10,10,6000.0,335,0,919999999,57,0.2190,0,88,0.105,0.0,0.0 +2008,7,24,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,17.8,79,101746,1060,1324,413,342,57,299,39744,4201,34961,13603,70,6.2,10,10,6000.0,335,0,919999999,57,0.2190,0,88,0.105,0.0,0.0 +2008,7,24,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,17.8,79,101746,1171,1324,413,356,50,316,41857,3640,37391,14571,70,6.2,10,10,6000.0,335,0,919999999,57,0.2190,0,88,0.105,0.0,0.0 +2008,7,24,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,18.3,84,101746,1223,1324,410,324,19,306,38449,1333,36543,14377,70,5.7,10,10,6000.0,213,0,919999999,60,0.2190,0,88,0.105,0.0,0.0 +2008,7,24,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.0,18.0,88,101281,1213,1324,404,276,15,263,33100,1000,31728,12745,70,4.1,10,10,3219.0,152,0,919999999,58,0.2190,0,88,0.105,0.0,0.0 +2008,7,24,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,20.0,18.3,90,101766,1141,1324,404,159,3,157,19627,172,19470,8160,60,4.1,10,10,2400.0,152,0,919999999,60,0.2190,0,88,0.105,0.0,0.0 +2008,7,24,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.0,18.3,90,101726,1013,1324,404,145,8,138,17750,451,16965,7132,40,4.6,10,10,1609.0,152,0,919999999,60,0.2190,0,88,0.105,0.0,0.0 +2008,7,24,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,19.0,18.0,94,101281,836,1324,398,109,7,102,13291,370,12481,5131,50,4.6,10,10,1609.0,152,0,019999999,58,0.2190,0,88,0.105,0.0,0.0 +2008,7,24,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,20.0,18.3,90,101806,624,1324,393,52,0,52,5225,0,5271,2529,340,3.6,9,9,1600.0,152,0,019999999,60,0.2190,0,88,0.105,0.0,0.0 +2008,7,24,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,18.3,90,101606,390,1324,371,94,6,91,10544,233,10245,3446,60,4.6,5,5,1600.0,77777,0,019999999,60,0.2190,0,88,0.105,0.0,0.0 +2008,7,24,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,18.0,88,101281,151,1324,393,62,5,60,6556,0,6371,1621,60,5.1,9,9,1600.0,1524,0,019999999,58,0.2190,0,88,0.105,0.0,0.0 +2008,7,24,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,18.3,90,101626,0,871,393,0,0,0,0,0,0,0,60,5.1,9,9,1600.0,1524,9,999999999,60,0.2190,0,88,0.105,5.0,0.0 +2008,7,24,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.0,19.0,94,101281,0,0,405,0,0,0,0,0,0,0,60,3.6,10,10,4828.0,914,0,019999999,65,0.2190,0,88,0.105,5.0,0.0 +2008,7,24,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.0,19.0,94,101281,0,0,405,0,0,0,0,0,0,0,50,2.1,10,10,4023.0,122,0,019999999,65,0.2190,0,88,0.105,5.0,0.0 +2008,7,24,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,20.0,18.9,93,101576,0,0,405,0,0,0,0,0,0,0,60,2.6,10,10,2800.0,122,0,019999999,64,0.2190,0,88,0.105,5.0,0.0 +2008,7,24,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.0,19.0,88,101282,0,0,411,0,0,0,0,0,0,0,149,0.0,10,10,4828.0,305,0,019999999,64,0.2190,0,88,0.105,5.0,0.0 +2008,7,25,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.6,19.4,93,101466,0,0,409,0,0,0,0,0,0,0,140,3.1,10,10,4828.0,640,0,019999999,67,0.2180,0,88,0.105,5.0,0.0 +2008,7,25,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,20.6,19.4,93,101466,0,0,409,0,0,0,0,0,0,0,140,3.1,10,10,4800.0,640,0,019999999,67,0.2180,0,88,0.105,0.0,0.0 +2008,7,25,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,23.3,21.7,91,101487,0,0,427,0,0,0,0,0,0,0,180,3.6,10,10,4828.0,671,0,019999999,84,0.2180,0,88,0.105,0.0,0.0 +2008,7,25,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,23.3,20.6,85,101557,0,0,426,0,0,0,0,0,0,0,150,1.5,10,10,4828.0,518,0,019999999,75,0.2180,0,88,0.105,0.0,0.0 +2008,7,25,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,23.3,20.6,85,101557,0,0,426,0,0,0,0,0,0,0,149,2.0,10,10,4800.0,518,0,019999999,75,0.2180,0,88,0.105,0.0,0.0 +2008,7,25,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,23.0,21.0,89,101282,224,1265,425,58,130,38,6584,0,4324,1431,250,2.6,10,10,3219.0,701,0,019999999,78,0.2180,0,88,0.105,0.0,0.0 +2008,7,25,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,22.0,21.0,94,101282,464,1324,419,96,104,72,11153,3679,8390,3069,130,1.5,10,10,8047.0,518,0,019999999,79,0.2180,0,88,0.105,0.0,0.0 +2008,7,25,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.0,22.2,84,101587,693,1324,426,265,221,176,30065,13045,20067,7436,170,6.7,9,9,8047.0,518,0,019999999,88,0.2180,0,88,0.105,0.0,0.0 +2008,7,25,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.0,21.0,70,101282,895,1324,436,317,109,257,36216,7526,29533,11255,180,9.8,9,9,8047.0,4572,0,019999999,78,0.2180,0,88,0.105,0.0,0.0 +2008,7,25,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,21.1,69,101577,1058,1324,437,447,143,337,51264,10583,38903,14785,180,9.3,9,9,8047.0,4572,0,019999999,79,0.2180,0,88,0.105,0.0,0.0 +2008,7,25,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,27.2,21.1,69,101577,1169,1324,437,556,191,394,64013,14629,45682,16996,180,9.3,9,9,8047.0,4572,0,019999999,79,0.2180,0,88,0.105,0.0,0.0 +2008,7,25,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.0,20.0,66,101282,1221,1324,447,291,93,212,35445,5540,25963,10680,180,10.3,10,10,8047.0,914,0,019999999,70,0.2180,0,88,0.105,0.0,0.0 +2008,7,25,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,22.0,19.0,83,101282,1211,1324,416,227,10,217,27591,613,26520,10878,200,7.7,10,10,3219.0,549,0,019999999,64,0.2180,0,88,0.105,0.0,0.0 +2008,7,25,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.8,20.6,87,101657,1140,1324,423,233,10,225,27923,613,27114,11097,180,6.2,10,10,3219.0,549,0,019999999,76,0.2180,0,88,0.105,0.0,0.0 +2008,7,25,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,20.6,82,101587,1011,1324,429,300,22,282,34668,1536,32787,12788,190,8.2,10,10,3219.0,5486,0,019999999,75,0.2180,0,88,0.105,0.0,0.0 +2008,7,25,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,20.6,85,101657,834,1324,426,156,9,149,18427,507,17678,7118,180,5.7,10,10,3219.0,5486,0,019999999,75,0.2180,0,88,0.105,0.0,0.0 +2008,7,25,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.3,20.6,85,101657,622,1324,426,44,0,44,4408,0,4447,2163,180,5.7,10,10,3219.0,5486,0,019999999,75,0.2180,0,88,0.105,0.0,0.0 +2008,7,25,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.0,19.0,88,101282,387,1324,411,79,5,77,8969,169,8771,3028,190,5.1,10,10,3219.0,914,0,019999999,64,0.2180,0,88,0.105,0.0,0.0 +2008,7,25,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.6,19.4,93,101686,148,1324,409,25,0,25,2405,0,2423,912,160,3.6,10,10,8047.0,914,0,019999999,67,0.2180,0,88,0.105,0.0,0.0 +2008,7,25,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,20.6,19.4,93,101686,0,853,409,0,0,0,0,0,0,0,160,3.6,10,10,8000.0,914,0,919999999,67,0.2180,0,88,0.105,5.0,0.0 +2008,7,25,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,18.0,88,101281,0,0,404,0,0,0,0,0,0,0,160,5.7,10,10,8000.0,396,0,919999999,58,0.2180,0,88,0.105,5.0,0.0 +2008,7,25,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,18.9,90,101796,0,0,408,0,0,0,0,0,0,0,170,4.1,10,10,8000.0,305,0,919999999,64,0.2180,0,88,0.105,5.0,0.0 +2008,7,25,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.6,18.9,90,101796,0,0,408,0,0,0,0,0,0,0,170,4.1,10,10,8000.0,305,0,919999999,64,0.2180,0,88,0.105,5.0,0.0 +2008,7,25,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.0,19.0,88,101282,0,0,399,0,0,0,0,0,0,0,190,3.6,9,9,8000.0,1524,0,919999999,64,0.2180,0,88,0.105,5.0,0.0 +2008,7,26,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.0,19.0,88,101282,0,0,377,0,0,0,0,0,0,0,190,3.6,5,5,8000.0,335,0,919999999,64,0.2180,0,88,0.105,5.0,0.0 +2008,7,26,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,18.9,90,101756,0,0,369,0,0,0,0,0,0,0,190,4.1,3,3,8000.0,77777,0,919999999,64,0.2180,0,88,0.105,5.0,0.0 +2008,7,26,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,17.8,87,101766,0,0,371,0,0,0,0,0,0,0,200,3.1,5,5,8000.0,77777,0,919999999,57,0.2180,0,88,0.105,5.0,0.0 +2008,7,26,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,19.0,18.0,94,101281,0,0,387,0,0,0,0,0,0,0,170,5.1,9,9,8047.0,77777,0,919999999,58,0.2180,0,88,0.105,1.7,0.0 +2008,7,26,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,19.4,18.3,93,101816,0,0,401,0,0,0,0,0,0,0,180,5.1,10,10,8000.0,77777,0,919999999,60,0.2180,0,88,0.105,0.0,0.0 +2008,7,26,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.0,19.0,94,101281,221,1245,405,59,156,36,6732,0,4117,1364,220,2.1,10,10,3219.0,152,0,919999999,65,0.2180,0,88,0.105,0.0,0.0 +2008,7,26,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.0,18.0,83,101282,461,1324,409,117,114,84,13460,4743,9696,3476,230,3.1,10,10,3219.0,335,0,919999999,58,0.2180,0,88,0.105,0.0,0.0 +2008,7,26,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,18.3,84,101906,690,1324,371,346,543,80,41904,26105,9717,3865,260,2.6,3,3,3219.0,335,0,919999999,60,0.2180,0,88,0.105,0.0,0.0 +2008,7,26,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,17.2,66,101847,893,1324,390,566,784,96,69995,41522,11911,4964,268,0.0,5,5,3219.0,77777,0,919999999,54,0.2180,0,88,0.105,0.0,0.0 +2008,7,26,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,18.3,71,101837,1056,1324,391,726,850,102,79695,89571,13895,3125,150,3.6,5,5,3219.0,77777,0,919999999,60,0.2180,0,88,0.105,0.0,0.0 +2008,7,26,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,18.3,71,101837,1167,1324,391,844,875,114,92302,92355,15086,4556,150,3.6,5,5,3219.0,77777,0,919999999,60,0.2180,0,88,0.105,0.0,0.0 +2008,7,26,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,18.9,74,101807,1220,1324,392,916,892,117,100309,94409,15295,5724,110,5.1,5,5,3219.0,77777,0,919999999,64,0.2180,0,88,0.105,0.0,0.0 +2008,7,26,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,18.3,76,101797,1210,1324,385,731,420,348,85725,31249,41082,15771,110,6.2,5,5,3219.0,77777,0,919999999,60,0.2180,0,88,0.105,0.0,0.0 +2008,7,26,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,18.3,76,101797,1138,1324,385,859,774,181,104863,46132,22205,9234,110,6.2,5,5,3219.0,77777,0,919999999,60,0.2180,0,88,0.105,0.0,0.0 +2008,7,26,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,18.3,71,101737,1009,1324,391,767,722,178,92051,43939,21466,8877,110,4.1,5,5,3219.0,77777,0,919999999,60,0.2180,0,88,0.105,0.0,0.0 +2008,7,26,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,18.9,76,101707,832,1324,412,609,599,185,70826,37862,21622,8474,120,4.6,9,9,3219.0,7620,0,919999999,64,0.2180,0,88,0.105,0.0,0.0 +2008,7,26,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.3,18.9,76,101707,619,1324,389,485,688,119,56164,36499,13835,5206,120,4.6,5,5,3219.0,7620,0,919999999,64,0.2180,0,88,0.105,0.0,0.0 +2008,7,26,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,17.2,69,101667,385,1324,387,325,655,72,37133,22312,8252,2864,120,4.1,5,5,3219.0,77777,0,919999999,54,0.2180,0,88,0.105,0.0,0.0 +2008,7,26,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,18.3,74,101667,144,1324,388,148,435,47,15917,0,5073,1410,140,4.6,5,5,3219.0,77777,0,919999999,60,0.2180,0,88,0.105,0.0,0.0 +2008,7,26,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,18.3,74,101667,0,833,388,0,0,0,0,0,0,0,140,4.6,5,5,3219.0,77777,9,999999999,60,0.2180,0,88,0.105,0.0,0.0 +2008,7,26,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,18.3,76,101757,0,0,385,0,0,0,0,0,0,0,190,2.6,5,5,3219.0,77777,9,999999999,60,0.2180,0,88,0.105,0.0,0.0 +2008,7,26,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,17.8,73,101737,0,0,385,0,0,0,0,0,0,0,230,2.6,5,5,3219.0,77777,9,999999999,57,0.2180,0,88,0.105,0.0,0.0 +2008,7,26,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,17.8,73,101737,0,0,385,0,0,0,0,0,0,0,230,2.6,5,5,3219.0,77777,9,999999999,57,0.2180,0,88,0.105,0.0,0.0 +2008,7,26,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,16.1,68,101717,0,0,358,0,0,0,0,0,0,0,260,2.6,0,0,3219.0,77777,9,999999999,48,0.2180,0,88,0.105,0.0,0.0 +2008,7,27,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,16.1,73,101716,0,0,368,0,0,0,0,0,0,0,220,3.1,3,3,3219.0,77777,9,999999999,48,0.2170,0,88,0.105,0.0,0.0 +2008,7,27,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,16.1,73,101716,0,0,353,0,0,0,0,0,0,0,220,3.1,0,0,3219.0,77777,9,999999999,48,0.2170,0,88,0.105,0.0,0.0 +2008,7,27,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,16.1,78,101646,0,0,348,0,0,0,0,0,0,0,230,2.1,0,0,3219.0,77777,9,999999999,48,0.2170,0,88,0.105,0.0,0.0 +2008,7,27,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,15.6,76,101636,0,0,347,0,0,0,0,0,0,0,257,0.0,0,0,3219.0,77777,9,999999999,46,0.2170,0,88,0.105,0.0,0.0 +2008,7,27,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,15.6,76,101636,0,0,347,0,0,0,0,0,0,0,257,0.0,0,0,3219.0,77777,9,999999999,46,0.2170,0,88,0.105,0.0,0.0 +2008,7,27,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,16.7,73,101666,217,1225,372,61,218,30,7067,0,3482,1167,257,0.0,3,3,3219.0,77777,9,999999999,51,0.2170,0,88,0.105,0.0,0.0 +2008,7,27,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,16.7,73,101676,458,1324,372,196,459,61,23133,17021,7218,2653,180,3.1,3,3,3219.0,77777,9,999999999,51,0.2170,0,88,0.105,0.0,0.0 +2008,7,27,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,16.7,73,101676,688,1324,357,375,651,86,45208,32959,10400,4116,180,3.1,0,0,3219.0,77777,9,999999999,51,0.2170,0,88,0.105,0.0,0.0 +2008,7,27,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,17.8,67,101557,891,1324,371,554,757,101,68193,40116,12475,5193,140,3.1,0,0,3219.0,77777,9,999999999,57,0.2170,0,88,0.105,0.0,0.0 +2008,7,27,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,17.2,58,101497,1054,1324,395,710,816,112,77403,85602,15170,3245,140,3.6,3,3,3219.0,77777,9,999999999,53,0.2170,0,88,0.105,0.0,0.0 +2008,7,27,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,17.2,58,101497,1166,1324,395,493,418,163,60938,24514,20243,8454,140,3.6,3,3,3219.0,77777,9,999999999,53,0.2170,0,88,0.105,0.0,0.0 +2008,7,27,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,16.7,54,101387,1218,1324,398,776,644,201,95135,40009,24771,10201,130,4.1,3,3,3219.0,77777,9,999999999,51,0.2170,0,88,0.105,0.0,0.0 +2008,7,27,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,16.7,54,101337,1208,1324,404,613,277,359,71795,21355,42328,16118,120,3.1,5,5,3219.0,77777,9,999999999,51,0.2170,0,88,0.105,0.0,0.0 +2008,7,27,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,16.7,54,101337,1136,1324,404,858,779,173,105210,47081,21316,8878,120,3.1,5,5,3219.0,77777,9,999999999,51,0.2170,0,88,0.105,0.0,0.0 +2008,7,27,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,16.7,49,101178,1007,1324,413,762,714,187,91204,45344,22493,9246,150,2.6,5,5,3219.0,77777,9,999999999,51,0.2170,0,88,0.105,0.0,0.0 +2008,7,27,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,29.4,14.4,40,101098,830,1324,409,574,519,214,66217,37096,24816,9458,230,6.2,3,3,3219.0,77777,9,999999999,40,0.2170,0,88,0.105,0.0,0.0 +2008,7,27,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,29.4,14.4,40,101098,617,1324,409,412,430,193,46042,30470,21678,7404,230,6.2,3,3,3219.0,77777,9,999999999,40,0.2170,0,88,0.105,0.0,0.0 +2008,7,27,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,17.2,56,101047,382,1324,382,291,424,123,31793,20696,13499,4158,200,6.7,0,0,3219.0,77777,9,999999999,53,0.2170,0,88,0.105,0.0,0.0 +2008,7,27,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,17.2,62,101077,141,1324,373,127,225,69,13200,1435,7205,1604,200,6.2,0,0,3219.0,77777,9,999999999,53,0.2170,0,88,0.105,0.0,0.0 +2008,7,27,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,17.2,62,101077,0,813,373,0,0,0,0,0,0,0,200,6.2,0,0,3219.0,77777,9,999999999,53,0.2170,0,88,0.105,0.0,0.0 +2008,7,27,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,16.1,64,101127,0,0,364,0,0,0,0,0,0,0,210,4.1,0,0,3219.0,77777,9,999999999,48,0.2170,0,88,0.105,0.0,0.0 +2008,7,27,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,15.0,60,101057,0,0,378,0,0,0,0,0,0,0,210,4.6,3,3,3219.0,77777,9,999999999,43,0.2170,0,88,0.105,0.0,0.0 +2008,7,27,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,15.0,60,101057,0,0,384,0,0,0,0,0,0,0,210,4.6,5,5,3219.0,77777,9,999999999,43,0.2170,0,88,0.105,0.0,0.0 +2008,7,27,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,15.0,64,101007,0,0,373,0,0,0,0,0,0,0,230,5.1,3,3,3219.0,77777,9,999999999,43,0.2170,0,88,0.105,0.0,0.0 +2008,7,28,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,16.1,70,101017,0,0,356,0,0,0,0,0,0,0,240,5.7,0,0,3219.0,77777,9,999999999,48,0.2170,0,88,0.105,0.0,0.0 +2008,7,28,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,16.1,70,101017,0,0,377,0,0,0,0,0,0,0,240,5.7,5,5,3219.0,77777,9,999999999,48,0.2170,0,88,0.105,0.0,0.0 +2008,7,28,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,15.6,66,101047,0,0,413,0,0,0,0,0,0,0,310,4.1,10,10,3219.0,2134,9,999999999,46,0.2170,0,88,0.105,0.0,0.0 +2008,7,28,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,15.6,66,101067,0,0,413,0,0,0,0,0,0,0,270,6.2,10,10,3219.0,1372,0,919999999,46,0.2170,0,88,0.105,0.0,0.0 +2008,7,28,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,15.6,66,101067,0,0,413,0,0,0,0,0,0,0,270,6.2,10,10,3219.0,1372,0,019999999,46,0.2170,0,88,0.105,0.0,0.0 +2008,7,28,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,19.4,17.2,87,101036,214,1205,400,12,0,12,1164,0,1173,508,210,5.7,10,10,9656.0,1676,0,019999999,54,0.2170,0,88,0.105,2.0,0.0 +2008,7,28,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,16.7,81,101046,455,1325,391,98,56,79,11326,2315,9159,3290,230,4.6,9,9,9656.0,3658,0,019999999,51,0.2170,0,88,0.105,0.0,0.0 +2008,7,28,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,16.7,81,101046,685,1325,391,267,246,148,30844,14963,17172,6481,230,4.6,9,9,9656.0,3658,0,019999999,51,0.2170,0,88,0.105,0.0,0.0 +2008,7,28,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,17.8,69,100987,889,1325,414,437,345,234,50408,24135,27141,10470,220,5.7,9,9,9656.0,7620,0,019999999,57,0.2170,0,88,0.105,0.0,0.0 +2008,7,28,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,17.8,64,101007,1052,1325,420,518,292,313,59902,22022,36424,14012,240,5.1,9,9,9656.0,6706,0,019999999,57,0.2170,0,88,0.105,0.0,0.0 +2008,7,28,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.0,17.8,64,101007,1164,1325,396,642,328,376,74378,25855,43858,16448,240,5.1,5,5,9656.0,6706,0,019999999,57,0.2170,0,88,0.105,0.0,0.0 +2008,7,28,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,18.3,62,100947,1216,1325,403,660,259,430,76185,21212,49995,18231,200,6.7,5,5,9656.0,77777,0,019999999,59,0.2170,0,88,0.105,0.0,0.0 +2008,7,28,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,18.3,62,100907,1206,1325,427,621,223,419,71730,18102,48743,17879,210,7.2,9,9,9656.0,5486,0,019999999,59,0.2170,0,88,0.105,0.0,0.0 +2008,7,28,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,26.1,18.3,62,100907,1134,1325,439,372,114,268,44049,7792,31923,12755,210,7.2,10,10,9656.0,5486,0,019999999,59,0.2170,0,88,0.105,0.0,0.0 +2008,7,28,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,18.3,69,100857,1005,1325,429,182,7,176,21847,425,21229,8781,190,5.7,10,10,9656.0,4267,0,019999999,60,0.2170,0,88,0.105,0.0,0.0 +2008,7,28,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,18.3,74,100877,828,1325,423,120,3,118,14447,164,14260,5812,220,4.6,10,10,9656.0,4267,0,019999999,60,0.2170,0,88,0.105,0.0,0.0 +2008,7,28,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.3,18.3,74,100877,614,1325,423,92,0,92,9236,0,9316,4188,220,4.6,10,10,9656.0,4267,0,019999999,60,0.2170,0,88,0.105,0.0,0.0 +2008,7,28,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.0,16.0,78,101281,379,1325,401,44,0,44,4338,0,4372,1882,280,6.7,10,10,8047.0,1524,0,019999999,48,0.2170,0,88,0.105,0.0,0.0 +2008,7,28,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,16.7,87,100966,138,1325,396,16,0,16,1543,0,1554,616,180,6.7,10,10,8047.0,3353,0,019999999,51,0.2170,0,88,0.105,0.0,0.0 +2008,7,28,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.9,16.7,87,100966,0,793,396,0,0,0,0,0,0,0,180,6.7,10,10,8047.0,3353,9,999999999,51,0.2170,0,88,0.105,3.0,0.0 +2008,7,28,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,16.1,84,100996,0,0,395,0,0,0,0,0,0,0,210,3.1,10,10,8047.0,5486,9,999999999,48,0.2170,0,88,0.105,0.0,0.0 +2008,7,28,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,16.1,84,100966,0,0,395,0,0,0,0,0,0,0,210,2.6,10,10,8047.0,5486,9,999999999,48,0.2170,0,88,0.105,0.0,0.0 +2008,7,28,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.9,16.1,84,100966,0,0,395,0,0,0,0,0,0,0,210,2.6,10,10,8047.0,5486,9,999999999,48,0.2170,0,88,0.105,0.0,0.0 +2008,7,28,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.0,16.0,88,101281,0,0,390,0,0,0,0,0,0,0,240,4.1,10,10,8047.0,77777,9,999999999,48,0.2170,0,88,0.105,0.0,0.0 +2008,7,29,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.0,16.0,88,101281,0,0,390,0,0,0,0,0,0,0,230,4.1,10,10,8047.0,6096,9,999999999,48,0.2160,0,88,0.105,0.0,0.0 +2008,7,29,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.3,16.1,87,100956,0,0,381,0,0,0,0,0,0,0,240,4.6,9,9,8047.0,6096,9,999999999,48,0.2160,0,88,0.105,0.0,0.0 +2008,7,29,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,16.1,87,100866,0,0,392,0,0,0,0,0,0,0,250,4.1,10,10,8047.0,213,9,999999999,48,0.2160,0,88,0.105,0.0,0.0 +2008,7,29,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.0,16.0,88,101281,0,0,358,0,0,0,0,0,0,0,240,4.1,5,5,8047.0,77777,9,999999999,48,0.2160,0,88,0.105,0.0,0.0 +2008,7,29,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,16.1,87,100886,0,0,360,0,0,0,0,0,0,0,240,4.1,5,5,8047.0,77777,9,999999999,48,0.2160,0,88,0.105,0.0,0.0 +2008,7,29,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,16.7,87,100966,211,1184,358,52,137,33,5962,0,3791,1254,220,2.6,3,3,8047.0,77777,9,999999999,51,0.2160,0,88,0.105,0.0,0.0 +2008,7,29,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,16.7,81,100996,452,1325,364,178,324,82,20495,13576,9472,3382,210,3.1,3,3,8047.0,77777,9,999999999,51,0.2160,0,88,0.105,0.0,0.0 +2008,7,29,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,16.7,81,100996,682,1325,349,353,527,118,41490,29432,13922,5387,210,3.1,0,0,8047.0,77777,9,999999999,51,0.2160,0,88,0.105,0.0,0.0 +2008,7,29,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,17.2,69,100997,886,1325,365,527,642,144,63141,37941,17327,7081,220,3.6,0,0,8047.0,77777,9,999999999,53,0.2160,0,88,0.105,0.0,0.0 +2008,7,29,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,17.2,64,101017,1050,1325,370,677,700,166,82238,42139,20259,8455,200,3.6,0,0,8047.0,77777,9,999999999,53,0.2160,0,88,0.105,0.0,0.0 +2008,7,29,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,17.2,64,101017,1162,1325,370,791,734,182,96919,44440,22411,9304,200,3.6,0,0,8047.0,77777,9,999999999,53,0.2160,0,88,0.105,0.0,0.0 +2008,7,29,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,15.6,47,100948,1215,1325,386,861,755,188,106116,46788,23287,9626,240,4.1,0,0,8047.0,77777,9,999999999,45,0.2160,0,88,0.105,0.0,0.0 +2008,7,29,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,15.6,46,100898,1205,1325,405,879,761,188,108191,47253,23256,9615,270,4.6,3,3,8047.0,77777,9,999999999,45,0.2160,0,88,0.105,0.0,0.0 +2008,7,29,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,15.6,46,100898,1132,1325,405,835,720,204,101157,46511,24842,10216,270,4.6,3,3,8047.0,77777,9,999999999,45,0.2160,0,88,0.105,0.0,0.0 +2008,7,29,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,29.4,15.0,42,100828,1003,1325,417,746,683,199,88921,45384,23840,9719,240,7.2,5,5,8047.0,77777,9,999999999,42,0.2160,0,88,0.105,0.0,0.0 +2008,7,29,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,14.4,43,100828,825,1325,410,617,644,174,72285,42547,20481,8038,280,7.2,5,5,8047.0,77777,9,999999999,40,0.2160,0,88,0.105,0.0,0.0 +2008,7,29,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,14.4,43,100828,611,1325,410,459,566,150,52293,35628,17165,6187,280,7.2,5,5,8047.0,77777,9,999999999,40,0.2160,0,88,0.105,0.0,0.0 +2008,7,29,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,15.6,47,100858,376,1325,409,286,443,114,31432,20965,12582,3934,240,6.2,5,5,8047.0,77777,9,999999999,45,0.2160,0,88,0.105,0.0,0.0 +2008,7,29,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,16.1,52,100887,134,1325,403,123,245,62,12861,383,6512,1509,250,4.6,5,5,8047.0,77777,9,999999999,48,0.2160,0,88,0.105,0.0,0.0 +2008,7,29,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,16.1,52,100887,0,772,403,0,0,0,0,0,0,0,250,4.6,5,5,8047.0,77777,9,999999999,48,0.2160,0,88,0.105,0.0,0.0 +2008,7,29,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,17.2,64,100987,0,0,370,0,0,0,0,0,0,0,230,5.1,0,0,8047.0,77777,9,999999999,53,0.2160,0,88,0.105,0.0,0.0 +2008,7,29,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,16.7,64,101017,0,0,383,0,0,0,0,0,0,0,240,6.7,3,3,8047.0,77777,9,999999999,51,0.2160,0,88,0.105,0.0,0.0 +2008,7,29,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,16.7,64,101017,0,0,383,0,0,0,0,0,0,0,240,6.7,3,3,8047.0,77777,9,999999999,51,0.2160,0,88,0.105,0.0,0.0 +2008,7,29,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,17.2,71,100967,0,0,407,0,0,0,0,0,0,0,250,4.1,9,9,8047.0,3658,9,999999999,54,0.2160,0,88,0.105,0.0,0.0 +2008,7,30,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,17.2,71,100947,0,0,378,0,0,0,0,0,0,0,250,4.1,3,3,8047.0,77777,9,999999999,54,0.2160,0,88,0.105,0.0,0.0 +2008,7,30,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,17.2,71,100947,0,0,363,0,0,0,0,0,0,0,250,4.1,0,0,8047.0,77777,9,999999999,54,0.2160,0,88,0.105,0.0,0.0 +2008,7,30,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,22.2,17.2,73,100927,0,0,381,0,0,0,0,0,0,0,260,3.6,5,5,9656.0,77777,9,999999999,54,0.2160,0,88,0.105,0.0,0.0 +2008,7,30,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,16.1,64,100937,0,0,364,0,0,0,0,0,0,0,270,4.6,0,0,9656.0,77777,9,999999999,48,0.2160,0,88,0.105,0.0,0.0 +2008,7,30,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,16.1,64,100937,0,0,380,0,0,0,0,0,0,0,270,4.6,3,3,9656.0,77777,9,999999999,48,0.2160,0,88,0.105,0.0,0.0 +2008,7,30,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,16.1,66,100967,207,1163,361,52,160,31,5986,0,3575,1185,270,4.1,0,0,9656.0,77777,9,999999999,48,0.2160,0,88,0.105,0.0,0.0 +2008,7,30,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,16.1,62,100977,449,1325,367,182,389,68,21262,15080,7966,2891,300,5.1,0,0,9656.0,77777,9,999999999,48,0.2160,0,88,0.105,0.0,0.0 +2008,7,30,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,16.1,62,100977,680,1325,367,358,593,97,42719,31361,11613,4553,300,5.1,0,0,9656.0,77777,9,999999999,48,0.2160,0,88,0.105,0.0,0.0 +2008,7,30,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,16.7,56,101007,884,1325,395,538,718,111,65743,39753,13614,5636,290,4.6,3,3,9656.0,77777,9,999999999,51,0.2160,0,88,0.105,0.0,0.0 +2008,7,30,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,16.7,53,100988,1048,1325,401,696,794,118,86729,44076,14761,6246,300,4.6,3,3,9656.0,77777,9,999999999,51,0.2160,0,88,0.105,0.0,0.0 +2008,7,30,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,16.7,53,100988,1160,1325,401,817,843,118,88727,88470,15595,4516,300,4.6,3,3,9656.0,77777,9,999999999,51,0.2160,0,88,0.105,0.0,0.0 +2008,7,30,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,16.1,48,100948,1213,1325,436,659,345,361,77229,26820,42589,16196,280,4.6,9,9,9656.0,1829,9,999999999,47,0.2160,0,88,0.105,0.0,0.0 +2008,7,30,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,29.4,15.6,43,100908,1203,1325,394,754,528,276,90128,37184,33188,13217,280,5.1,0,0,9656.0,77777,9,999999999,45,0.2160,0,88,0.105,0.0,0.0 +2008,7,30,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,29.4,15.6,43,100908,1130,1325,417,810,689,213,97777,45153,25848,10588,280,5.1,5,5,9656.0,77777,9,999999999,45,0.2160,0,88,0.105,0.0,0.0 +2008,7,30,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,29.4,14.4,40,100848,1001,1325,440,775,801,134,95191,47749,16526,6924,280,5.1,9,9,9656.0,2743,9,999999999,40,0.2160,0,88,0.105,0.0,0.0 +2008,7,30,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.0,14.4,39,100828,823,1325,419,394,393,100,48138,21968,12259,5011,290,5.1,5,5,9656.0,77777,9,999999999,40,0.2160,0,88,0.105,0.0,0.0 +2008,7,30,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.0,14.4,39,100828,608,1325,419,431,484,157,48893,31087,17891,6379,290,5.1,5,5,9656.0,77777,9,999999999,40,0.2160,0,88,0.105,0.0,0.0 +2008,7,30,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,15.0,46,100908,372,1325,408,229,304,119,25065,14949,13082,4015,300,6.2,5,5,9656.0,77777,9,999999999,43,0.2160,0,88,0.105,0.0,0.0 +2008,7,30,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,13.3,42,100938,131,1325,402,79,158,61,8271,440,6415,1472,300,4.6,5,5,9656.0,77777,9,999999999,36,0.2160,0,88,0.105,0.0,0.0 +2008,7,30,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,13.3,42,100938,0,750,402,0,0,0,0,0,0,0,300,4.6,5,5,9656.0,77777,9,999999999,36,0.2160,0,88,0.105,0.0,0.0 +2008,7,30,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,15.0,52,100987,0,0,396,0,0,0,0,0,0,0,290,3.6,5,5,9656.0,77777,9,999999999,43,0.2160,0,88,0.105,0.0,0.0 +2008,7,30,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,15.6,54,100987,0,0,420,0,0,0,0,0,0,0,300,3.1,9,9,9656.0,2896,9,999999999,45,0.2160,0,88,0.105,0.0,0.0 +2008,7,30,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.6,15.6,54,100987,0,0,391,0,0,0,0,0,0,0,300,3.1,3,3,9656.0,2896,9,999999999,45,0.2160,0,88,0.105,0.0,0.0 +2008,7,30,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,16.1,62,101047,0,0,389,0,0,0,0,0,0,0,300,3.1,5,5,9656.0,77777,9,999999999,48,0.2160,0,88,0.105,0.0,0.0 +2008,7,31,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,16.1,66,101037,0,0,377,0,0,0,0,0,0,0,320,3.1,3,3,9656.0,77777,9,999999999,48,0.2150,0,88,0.105,0.0,0.0 +2008,7,31,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,16.1,66,101037,0,0,377,0,0,0,0,0,0,0,320,3.1,3,3,9656.0,77777,9,999999999,48,0.2150,0,88,0.105,0.0,0.0 +2008,7,31,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,15.6,71,101037,0,0,368,0,0,0,0,0,0,0,300,2.6,3,3,9656.0,77777,9,999999999,46,0.2150,0,88,0.105,0.0,0.0 +2008,7,31,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,15.6,71,101047,0,0,368,0,0,0,0,0,0,0,270,2.1,3,3,9656.0,77777,9,999999999,46,0.2150,0,88,0.105,0.0,0.0 +2008,7,31,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,15.6,71,101047,0,0,353,0,0,0,0,0,0,0,270,2.1,0,0,9656.0,77777,9,999999999,46,0.2150,0,88,0.105,0.0,0.0 +2008,7,31,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,14.4,66,101067,204,1142,372,57,232,26,6652,0,3039,1017,350,2.6,5,5,9656.0,77777,9,999999999,41,0.2150,0,88,0.105,0.0,0.0 +2008,7,31,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,14.4,59,101077,446,1326,375,191,490,53,22761,17752,6330,2326,340,2.6,3,3,9656.0,77777,9,999999999,40,0.2150,0,88,0.105,0.0,0.0 +2008,7,31,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,14.4,59,101077,677,1326,381,374,701,69,45828,34787,8476,3360,340,2.6,5,5,9656.0,77777,9,999999999,40,0.2150,0,88,0.105,0.0,0.0 +2008,7,31,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,15.0,57,101027,882,1326,387,554,799,82,60496,82850,11666,2091,140,2.1,5,5,9656.0,77777,9,999999999,43,0.2150,0,88,0.105,0.0,0.0 +2008,7,31,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,15.6,58,100977,1046,1326,391,709,850,94,77256,88822,12876,2922,130,3.6,5,5,9656.0,77777,9,999999999,45,0.2150,0,88,0.105,0.0,0.0 +2008,7,31,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,15.6,58,100977,1158,1326,391,826,874,104,89694,91499,13847,4150,130,3.6,5,5,9656.0,77777,9,999999999,45,0.2150,0,88,0.105,0.0,0.0 +2008,7,31,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,15.0,54,100867,1211,1326,393,895,884,110,96806,92428,14433,5241,120,3.6,5,5,9656.0,77777,9,999999999,43,0.2150,0,88,0.105,0.0,0.0 +2008,7,31,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,15.6,54,100817,1201,1326,375,910,878,116,98475,91910,15208,5208,130,4.6,0,0,9656.0,77777,9,999999999,45,0.2150,0,88,0.105,0.0,0.0 +2008,7,31,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,15.6,54,100817,1128,1326,397,745,488,314,87253,36956,37006,14357,130,4.6,5,5,9656.0,77777,9,999999999,45,0.2150,0,88,0.105,0.0,0.0 +2008,7,31,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,16.1,54,100698,999,1326,400,629,356,347,71652,29325,39786,14638,120,6.2,5,5,9656.0,77777,9,999999999,48,0.2150,0,88,0.105,0.0,0.0 +2008,7,31,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,14.4,54,100687,820,1326,389,515,334,285,57952,27209,32262,11418,80,4.6,5,5,9656.0,77777,9,999999999,40,0.2150,0,88,0.105,0.0,0.0 +2008,7,31,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,14.4,54,100687,605,1326,412,313,164,216,34569,12339,23985,7822,80,4.6,9,9,9656.0,77777,9,999999999,40,0.2150,0,88,0.105,0.0,0.0 +2008,7,31,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,15.6,68,100627,369,1326,399,184,140,134,19909,7427,14567,4257,80,3.1,9,9,9656.0,4267,9,999999999,46,0.2150,0,88,0.105,0.0,0.0 +2008,7,31,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.4,16.5,69,100612,127,1326,377,64,91,31,7065,0,3432,1028,127,2.8,5,5,9656.0,77777,9,999999999,50,0.2150,0,88,0.105,0.0,0.0 +2008,7,31,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.9,17.0,69,100605,0,727,377,0,0,0,0,0,0,0,150,3.2,5,5,9656.0,77777,9,999999999,52,0.2150,0,88,0.105,0.0,0.0 +2008,7,31,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.0,17.2,70,100590,0,0,380,0,0,0,0,0,0,0,170,3.1,5,5,9656.0,77777,9,999999999,53,0.2150,0,88,0.105,0.0,0.0 +2008,7,31,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.9,16.8,68,100642,0,0,414,0,0,0,0,0,0,0,193,2.6,9,9,9656.0,3962,9,999999999,51,0.2150,0,88,0.105,0.0,0.0 +2008,7,31,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.4,16.0,67,100695,0,0,414,0,0,0,0,0,0,0,206,1.5,9,9,9656.0,3962,9,999999999,47,0.2150,0,88,0.105,0.0,0.0 +2008,7,31,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.8,14.7,64,100725,0,0,415,0,0,0,0,0,0,0,219,1.3,10,10,9656.0,4267,9,999999999,42,0.2150,0,88,0.105,0.0,0.0 +2015,8,1,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.4,14.0,63,100760,0,0,354,0,0,0,0,0,0,0,226,1.3,0,0,2816.0,77777,9,999999999,39,0.2140,0,88,0.100,0.0,0.0 +2015,8,1,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,14.0,64,100735,0,0,369,0,0,0,0,0,0,0,216,1.8,3,3,2816.0,77777,9,999999999,39,0.2140,0,88,0.100,0.0,0.0 +2015,8,1,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.5,13.9,62,100702,0,0,352,0,0,0,0,0,0,0,215,3.1,0,0,2816.0,77777,9,999999999,38,0.2140,0,88,0.100,0.0,0.0 +2015,8,1,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.4,14.3,60,100692,0,0,370,0,0,0,0,0,0,0,215,4.0,5,5,2816.0,77777,9,999999999,40,0.2140,0,88,0.100,0.0,0.0 +2015,8,1,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.5,14.3,56,100685,0,0,391,0,0,0,0,0,0,0,222,5.1,9,9,2816.0,77777,9,999999999,40,0.2140,0,88,0.100,0.0,0.0 +2015,8,1,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,14.4,50,100677,197,1100,361,52,185,27,6034,0,3138,1041,242,5.7,0,0,2816.0,77777,9,999999999,40,0.2140,0,88,0.100,0.0,0.0 +2015,8,1,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,14.4,52,100677,440,1326,370,181,420,61,21302,15872,7197,2616,230,6.7,0,0,2816.0,77777,9,999999999,40,0.2140,0,88,0.100,0.0,0.0 +2015,8,1,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.0,14.4,52,100677,672,1326,370,356,614,90,42710,32568,10832,4246,230,6.7,0,0,2816.0,77777,9,999999999,40,0.2140,0,88,0.100,0.0,0.0 +2015,8,1,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,15.0,43,100678,877,1326,438,533,721,109,65225,40840,13386,5529,280,4.1,9,9,2816.0,5486,9,999999999,42,0.2140,0,88,0.100,0.0,0.0 +2015,8,1,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,14.4,41,100688,1042,1326,438,497,331,273,58154,24650,32131,12629,270,4.6,9,9,2816.0,5486,9,999999999,40,0.2140,0,88,0.100,0.0,0.0 +2015,8,1,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,28.9,14.4,41,100688,1154,1326,438,699,607,180,85794,38218,22201,9206,270,4.6,9,9,2816.0,5486,9,999999999,40,0.2140,0,88,0.100,0.0,0.0 +2015,8,1,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.6,15.0,39,100618,1207,1326,448,725,481,306,86055,35450,36548,14325,240,7.2,9,9,2816.0,5486,9,999999999,42,0.2140,0,88,0.100,0.0,0.0 +2015,8,1,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,31.1,14.4,36,100568,1197,1326,425,844,681,231,102256,45830,28141,11434,250,8.2,5,5,2816.0,77777,9,999999999,40,0.2140,0,88,0.100,0.0,0.0 +2015,8,1,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,31.1,14.4,36,100568,1124,1326,425,802,644,245,95769,45009,29420,11856,250,8.2,5,5,2816.0,77777,9,999999999,40,0.2140,0,88,0.100,0.0,0.0 +2015,8,1,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,15.0,46,100578,994,1326,432,572,377,256,66755,27563,30046,11806,300,11.3,9,9,2816.0,2134,0,919999999,42,0.2140,0,88,0.100,0.0,0.0 +2015,8,1,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,13.9,47,100618,815,1326,421,249,171,112,30131,9908,13602,5519,270,5.1,9,9,2816.0,3658,0,919999999,38,0.2140,0,88,0.100,0.0,0.0 +2015,8,1,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,26.1,13.9,47,100618,599,1326,421,168,17,160,18997,1108,18176,6409,270,5.1,9,9,2816.0,3658,0,919999999,38,0.2140,0,88,0.100,0.0,0.0 +2015,8,1,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,15.6,51,100618,362,1326,403,163,200,108,17919,8942,11923,3723,260,5.1,5,5,2816.0,77777,0,919999999,45,0.2140,0,88,0.100,0.0,0.0 +2015,8,1,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,15.0,50,100698,119,1326,393,67,154,46,7123,0,4909,1260,250,4.6,3,3,2816.0,77777,0,919999999,43,0.2140,0,88,0.100,0.0,0.0 +2015,8,1,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,26.1,15.0,50,100698,0,680,399,0,0,0,0,0,0,0,250,4.6,5,5,2816.0,77777,9,999999999,43,0.2140,0,88,0.100,0.0,0.0 +2015,8,1,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,15.6,54,100847,0,0,391,0,0,0,0,0,0,0,260,4.1,3,3,2816.0,77777,9,999999999,45,0.2140,0,88,0.100,0.0,0.0 +2015,8,1,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,16.1,60,100877,0,0,385,0,0,0,0,0,0,0,290,3.6,3,3,2816.0,77777,9,999999999,48,0.2140,0,88,0.100,0.0,0.0 +2015,8,1,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,24.4,16.1,60,100877,0,0,385,0,0,0,0,0,0,0,290,3.6,3,3,2816.0,77777,9,999999999,48,0.2140,0,88,0.100,0.0,0.0 +2015,8,1,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,13.3,53,100927,0,0,376,0,0,0,0,0,0,0,280,3.1,3,3,2816.0,77777,9,999999999,36,0.2140,0,88,0.100,0.0,0.0 +2015,8,2,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,12.8,53,100947,0,0,373,0,0,0,0,0,0,0,270,4.6,3,3,2816.0,77777,9,999999999,34,0.2140,0,88,0.100,0.0,0.0 +2015,8,2,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.8,12.8,53,100947,0,0,379,0,0,0,0,0,0,0,270,4.6,5,5,2816.0,77777,9,999999999,34,0.2140,0,88,0.100,0.0,0.0 +2015,8,2,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,11.1,51,100947,0,0,350,0,0,0,0,0,0,0,280,3.6,0,0,2816.0,77777,9,999999999,29,0.2140,0,88,0.100,0.0,0.0 +2015,8,2,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,11.7,57,100977,0,0,361,0,0,0,0,0,0,0,290,4.6,3,3,2816.0,77777,9,999999999,31,0.2140,0,88,0.100,0.0,0.0 +2015,8,2,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.6,11.7,57,100977,0,0,361,0,0,0,0,0,0,0,290,4.6,3,3,2816.0,77777,9,999999999,31,0.2140,0,88,0.100,0.0,0.0 +2015,8,2,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,11.7,57,101077,193,1078,346,54,230,25,6303,0,2922,971,280,4.6,0,0,2816.0,77777,9,999999999,31,0.2140,0,88,0.100,0.0,0.0 +2015,8,2,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,11.7,51,101137,437,1327,353,188,487,53,22389,18252,6325,2310,280,3.6,0,0,2816.0,77777,9,999999999,31,0.2140,0,88,0.100,0.0,0.0 +2015,8,2,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,11.7,51,101137,669,1327,353,369,684,75,44938,35872,9158,3607,280,3.6,0,0,2816.0,77777,9,999999999,31,0.2140,0,88,0.100,0.0,0.0 +2015,8,2,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,11.7,41,101177,875,1327,372,549,785,90,59230,80623,12738,2141,240,2.1,0,0,2816.0,77777,9,999999999,31,0.2140,0,88,0.100,0.0,0.0 +2015,8,2,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,11.1,37,101187,1039,1327,377,707,842,100,75919,86935,13642,2969,259,3.1,0,0,2816.0,77777,9,999999999,29,0.2140,0,88,0.100,0.0,0.0 +2015,8,2,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,27.2,11.1,37,101187,1152,1327,393,826,875,107,88476,90541,14215,4131,249,3.1,3,3,2816.0,77777,9,999999999,29,0.2140,0,88,0.100,0.0,0.0 +2015,8,2,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,29.4,12.2,35,101168,1205,1327,407,898,890,111,96321,92377,14559,5124,240,4.6,3,3,2816.0,77777,9,999999999,32,0.2140,0,88,0.100,0.0,0.0 +2015,8,2,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.0,12.2,33,101128,1195,1327,416,916,893,113,98207,92662,14838,4974,270,6.2,5,5,2816.0,77777,9,999999999,32,0.2140,0,88,0.100,0.0,0.0 +2015,8,2,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,30.0,12.2,33,101128,1122,1327,416,878,881,113,94175,91294,15062,3885,270,6.2,5,5,2816.0,77777,9,999999999,32,0.2140,0,88,0.100,0.0,0.0 +2015,8,2,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.0,11.1,31,101088,991,1327,415,788,854,111,84368,87952,15190,2795,260,6.2,5,5,2816.0,77777,9,999999999,29,0.2140,0,88,0.100,0.0,0.0 +2015,8,2,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.0,10.6,30,101078,812,1327,414,651,803,107,79162,47813,13056,5294,260,8.2,5,5,2816.0,77777,9,999999999,27,0.2140,0,88,0.100,0.0,0.0 +2015,8,2,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,30.0,10.6,30,101078,596,1327,414,482,720,98,56743,40078,11576,4364,260,8.2,5,5,2816.0,77777,9,999999999,27,0.2140,0,88,0.100,0.0,0.0 +2015,8,2,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,12.2,36,101038,358,1327,404,298,585,80,33624,22446,9057,3015,240,7.7,3,3,2816.0,77777,9,999999999,32,0.2140,0,88,0.100,0.0,0.0 +2015,8,2,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,12.8,40,101058,115,1327,399,126,343,48,13330,0,5098,1255,220,6.7,3,3,2816.0,77777,9,999999999,34,0.2140,0,88,0.100,0.0,0.0 +2015,8,2,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,27.8,12.8,40,101058,0,655,399,0,0,0,0,0,0,0,220,6.7,3,3,2816.0,77777,9,999999999,34,0.2140,0,88,0.100,0.0,0.0 +2015,8,2,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,15.0,57,101187,0,0,381,0,0,0,0,0,0,0,200,5.1,3,3,2816.0,77777,9,999999999,43,0.2140,0,88,0.100,0.0,0.0 +2015,8,2,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,15.0,64,101097,0,0,373,0,0,0,0,0,0,0,200,5.1,3,3,2816.0,77777,9,999999999,43,0.2140,0,88,0.100,0.0,0.0 +2015,8,2,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,15.0,64,101097,0,0,373,0,0,0,0,0,0,0,200,5.1,3,3,2816.0,77777,9,999999999,43,0.2140,0,88,0.100,0.0,0.0 +2015,8,2,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,18.3,81,101087,0,0,358,0,0,0,0,0,0,0,210,4.6,0,0,2816.0,77777,9,999999999,60,0.2140,0,88,0.100,0.0,0.0 +2015,8,3,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,18.9,87,101057,0,0,356,0,0,0,0,0,0,0,200,3.6,0,0,2816.0,77777,9,999999999,64,0.2140,0,88,0.100,0.0,0.0 +2015,8,3,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,18.9,90,101037,0,0,369,0,0,0,0,0,0,0,200,3.1,3,3,2816.0,77777,9,999999999,64,0.2140,0,88,0.100,0.0,0.0 +2015,8,3,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,18.9,90,101027,0,0,354,0,0,0,0,0,0,0,190,2.1,0,0,2816.0,77777,9,999999999,64,0.2140,0,88,0.100,0.0,0.0 +2015,8,3,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,18.9,93,100996,0,0,366,0,0,0,0,0,0,0,190,2.6,3,3,2816.0,77777,9,999999999,64,0.2140,0,88,0.100,0.0,0.0 +2015,8,3,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,18.9,93,100996,0,0,372,0,0,0,0,0,0,0,190,2.6,5,5,2816.0,77777,9,999999999,64,0.2140,0,88,0.100,0.0,0.0 +2015,8,3,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,20.0,90,101057,190,1057,382,48,160,28,5506,0,3218,1064,200,3.6,5,5,2816.0,77777,9,999999999,71,0.2140,0,88,0.100,0.0,0.0 +2015,8,3,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,20.0,82,101047,433,1327,390,174,390,63,20294,12588,7368,2676,200,4.1,5,5,2816.0,77777,9,999999999,71,0.2140,0,88,0.100,0.0,0.0 +2015,8,3,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.3,20.0,82,101047,666,1327,368,348,591,94,41366,28411,11211,4395,200,4.1,0,0,2816.0,77777,9,999999999,71,0.2140,0,88,0.100,0.0,0.0 +2015,8,3,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,16.7,49,100988,872,1327,390,525,706,112,63979,39193,13699,5652,210,5.7,0,0,2816.0,77777,9,999999999,50,0.2140,0,88,0.100,0.0,0.0 +2015,8,3,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.0,15.0,40,100958,1037,1327,414,683,776,124,84760,44826,15449,6516,220,7.2,3,3,2816.0,77777,9,999999999,42,0.2140,0,88,0.100,0.0,0.0 +2015,8,3,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,30.0,15.0,40,100958,1150,1327,414,804,821,130,86575,85639,17106,4566,220,7.2,3,3,2816.0,77777,9,999999999,42,0.2140,0,88,0.100,0.0,0.0 +2015,8,3,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,31.1,15.6,39,100868,1203,1327,420,876,839,136,94356,87716,17655,5765,200,8.8,3,3,2816.0,77777,9,999999999,45,0.2140,0,88,0.100,0.0,0.0 +2015,8,3,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,31.1,16.1,40,100828,1193,1327,421,893,838,141,96256,87699,18309,5619,190,6.7,3,3,2816.0,77777,9,999999999,47,0.2140,0,88,0.100,0.0,0.0 +2015,8,3,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,31.1,16.1,40,100828,1119,1327,421,859,834,136,107001,47920,17012,7163,190,6.7,3,3,2816.0,77777,9,999999999,47,0.2140,0,88,0.100,0.0,0.0 +2015,8,3,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,31.1,16.1,40,100728,989,1327,421,771,810,130,94609,46808,16017,6715,180,8.8,3,3,2816.0,77777,9,999999999,47,0.2140,0,88,0.100,0.0,0.0 +2015,8,3,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.0,17.8,48,100708,809,1327,417,638,764,121,76438,42548,14553,5885,190,8.2,3,3,2816.0,77777,9,999999999,56,0.2140,0,88,0.100,0.0,0.0 +2015,8,3,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,30.0,17.8,48,100708,593,1327,424,461,646,115,53279,34249,13342,4963,190,8.2,5,5,2816.0,77777,9,999999999,56,0.2140,0,88,0.100,0.0,0.0 +2015,8,3,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,16.7,53,100718,354,1327,407,202,301,65,23073,8914,7446,2559,190,6.7,5,5,2816.0,77777,9,999999999,50,0.2140,0,88,0.100,0.0,0.0 +2015,8,3,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,16.7,56,100767,111,1327,425,117,284,52,12215,0,5453,1253,200,6.2,9,9,2816.0,7620,9,999999999,51,0.2140,0,88,0.100,0.0,0.0 +2015,8,3,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,26.1,16.7,56,100767,0,630,425,0,0,0,0,0,0,0,200,6.2,9,9,2816.0,7620,9,999999999,51,0.2140,0,88,0.100,0.0,0.0 +2015,8,3,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,18.0,65,101282,0,0,397,0,0,0,0,0,0,0,200,5.7,5,5,2816.0,77777,9,999999999,58,0.2140,0,88,0.100,0.0,0.0 +2015,8,3,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,19.4,74,100887,0,0,389,0,0,0,0,0,0,0,210,6.2,3,3,2816.0,77777,9,999999999,66,0.2140,0,88,0.100,0.0,0.0 +2015,8,3,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,24.4,19.4,74,100887,0,0,389,0,0,0,0,0,0,0,210,6.2,3,3,2816.0,77777,9,999999999,66,0.2140,0,88,0.100,0.0,0.0 +2015,8,3,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,20.6,85,100887,0,0,369,0,0,0,0,0,0,0,210,4.6,0,0,2816.0,77777,9,999999999,75,0.2140,0,88,0.100,0.0,0.0 +2015,8,4,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,21.1,87,100897,0,0,385,0,0,0,0,0,0,0,210,4.6,3,3,2816.0,77777,9,999999999,79,0.2130,0,88,0.100,0.0,0.0 +2015,8,4,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.3,21.1,87,100897,0,0,370,0,0,0,0,0,0,0,210,4.6,0,0,2816.0,77777,9,999999999,79,0.2130,0,88,0.100,0.0,0.0 +2015,8,4,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,21.1,87,100937,0,0,385,0,0,0,0,0,0,0,240,3.6,3,3,2816.0,77777,9,999999999,79,0.2130,0,88,0.100,0.0,0.0 +2015,8,4,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,21.1,90,100937,0,0,389,0,0,0,0,0,0,0,200,4.1,5,5,2816.0,77777,9,999999999,79,0.2130,0,88,0.100,0.0,0.0 +2015,8,4,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.8,21.1,90,100937,0,0,412,0,0,0,0,0,0,0,200,4.1,9,9,2816.0,77777,0,919999999,79,0.2130,0,88,0.100,0.0,0.0 +2015,8,4,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,22.0,22.0,100,101282,186,1035,420,13,0,13,1251,0,1260,536,190,2.6,10,10,6437.0,2743,0,019999999,87,0.2130,0,88,0.100,0.0,0.0 +2015,8,4,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.0,19.0,88,101282,430,1327,399,29,0,29,2862,0,2886,1330,150,3.6,9,9,6437.0,2743,0,019999999,64,0.2130,0,88,0.100,0.0,0.0 +2015,8,4,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,18.9,93,101026,663,1327,394,66,0,66,6649,0,6708,3204,160,5.1,9,9,6437.0,2743,0,019999999,64,0.2130,0,88,0.100,0.0,0.0 +2015,8,4,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,20.0,71,100987,870,1327,426,366,258,207,42390,16614,24101,9432,200,4.1,9,9,6437.0,4877,0,019999999,70,0.2130,0,88,0.100,0.0,0.0 +2015,8,4,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,20.6,72,100987,1035,1327,406,628,565,220,74232,35333,26147,10649,190,5.7,5,5,6437.0,77777,0,019999999,75,0.2130,0,88,0.100,0.0,0.0 +2015,8,4,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,26.1,20.6,72,100987,1148,1327,406,773,737,161,95071,40448,19895,8345,190,5.7,5,5,6437.0,77777,0,019999999,75,0.2130,0,88,0.100,0.0,0.0 +2015,8,4,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,18.3,53,100888,1201,1327,418,560,416,203,68327,25364,24899,10263,180,6.2,5,5,6437.0,77777,0,019999999,59,0.2130,0,88,0.100,0.0,0.0 +2015,8,4,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.6,18.3,48,100828,1190,1327,428,751,502,300,88816,35329,35701,14061,190,5.7,5,5,6437.0,77777,0,019999999,59,0.2130,0,88,0.100,0.0,0.0 +2015,8,4,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,30.6,18.3,48,100828,1117,1327,428,643,408,282,75626,28629,33368,13212,190,5.7,5,5,6437.0,77777,0,019999999,59,0.2130,0,88,0.100,0.0,0.0 +2015,8,4,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.0,17.0,51,101283,986,1327,436,494,322,224,58086,21830,26481,10612,300,5.7,9,9,6437.0,77777,0,019999999,52,0.2130,0,88,0.100,0.0,0.0 +2015,8,4,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.0,17.0,54,101282,806,1327,406,404,299,197,46606,20092,22841,8742,330,3.6,5,5,6437.0,77777,0,019994999,52,0.2130,0,88,0.100,0.0,0.0 +2015,8,4,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,22.2,18.9,82,100887,589,1327,406,201,100,155,22638,5946,17539,6205,290,3.6,9,9,9000.0,77777,0,019994999,63,0.2130,0,88,0.100,0.0,0.0 +2015,8,4,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,18.9,82,100987,350,1327,406,221,258,136,23666,12820,14636,4123,190,3.6,9,9,9000.0,1981,0,019994999,63,0.2130,0,88,0.100,0.0,0.0 +2015,8,4,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.0,18.0,78,101282,106,1327,404,101,160,57,10412,0,5904,1227,230,2.6,9,9,9000.0,3353,0,019994999,58,0.2130,0,88,0.100,0.0,0.0 +2015,8,4,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,17.8,79,101007,0,605,402,0,0,0,0,0,0,0,220,3.6,9,9,9000.0,3353,0,019999999,57,0.2130,0,88,0.103,0.2,0.0 +2015,8,4,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,18.3,79,101117,0,0,382,0,0,0,0,0,0,0,230,4.1,5,5,9000.0,77777,0,019999999,60,0.2130,0,88,0.103,0.0,0.0 +2015,8,4,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,18.3,84,101137,0,0,377,0,0,0,0,0,0,0,170,3.1,5,5,9000.0,77777,0,019999999,60,0.2130,0,88,0.103,6.0,0.0 +2015,8,4,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,18.3,84,101137,0,0,356,0,0,0,0,0,0,0,170,3.1,0,0,9000.0,77777,0,019999999,60,0.2130,0,88,0.103,6.0,0.0 +2015,8,4,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,18.3,79,101137,0,0,361,0,0,0,0,0,0,0,260,3.1,0,0,9000.0,77777,0,019999999,60,0.2130,0,88,0.103,0.0,0.0 +2015,8,5,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,16.7,73,101127,0,0,372,0,0,0,0,0,0,0,260,3.1,3,3,9000.0,77777,0,019999999,51,0.2130,0,88,0.103,0.0,0.0 +2015,8,5,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,16.7,73,101127,0,0,378,0,0,0,0,0,0,0,260,3.1,5,5,9000.0,77777,0,019999999,51,0.2130,0,88,0.103,0.0,0.0 +2015,8,5,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,16.1,78,101156,0,0,348,0,0,0,0,0,0,0,210,2.1,0,0,9000.0,77777,0,019999999,48,0.2130,0,88,0.103,0.0,0.0 +2015,8,5,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,14.4,68,101117,0,0,391,0,0,0,0,0,0,0,270,3.1,9,9,9000.0,3353,0,019999999,41,0.2130,0,88,0.103,0.0,0.0 +2015,8,5,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.6,14.4,68,101117,0,0,391,0,0,0,0,0,0,0,270,3.1,9,9,9000.0,3353,0,019999999,41,0.2130,0,88,0.103,0.0,0.0 +2015,8,5,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,15.0,66,101107,182,1013,376,47,162,27,5413,0,3115,1022,265,0.0,5,5,9000.0,77777,0,019999999,43,0.2130,0,88,0.103,0.0,0.0 +2015,8,5,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,16.7,76,101127,427,1328,375,171,405,57,20129,13658,6726,2444,190,3.1,5,5,9000.0,77777,0,019999999,51,0.2130,0,88,0.103,0.0,0.0 +2015,8,5,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,16.7,76,101127,661,1328,397,349,602,93,41599,30902,11121,4340,190,3.1,9,9,9000.0,77777,0,019999999,51,0.2130,0,88,0.103,0.0,0.0 +2015,8,5,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,14.4,48,101077,867,1328,422,497,612,148,59348,38102,17749,7180,250,4.6,9,9,9000.0,7620,0,019999999,40,0.2130,0,88,0.103,0.0,0.0 +2015,8,5,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,14.4,47,101067,1033,1328,425,622,569,221,73872,39247,26387,10679,250,5.1,9,9,9000.0,7620,0,019999999,40,0.2130,0,88,0.103,0.0,0.0 +2015,8,5,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,26.7,14.4,47,101067,1146,1328,401,693,482,303,81638,36290,35915,14033,250,5.1,5,5,9000.0,7620,0,019999999,40,0.2130,0,88,0.103,0.0,0.0 +2015,8,5,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,13.3,41,100948,1199,1328,406,826,676,228,100252,45877,27823,11312,240,7.2,5,5,9000.0,77777,0,019999999,36,0.2130,0,88,0.103,0.0,0.0 +2015,8,5,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,13.3,41,100888,1188,1328,406,765,484,332,90082,37745,39345,15155,260,4.6,5,5,9000.0,77777,0,019999999,36,0.2130,0,88,0.103,0.0,0.0 +2015,8,5,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,27.8,13.3,41,100888,1115,1328,406,680,404,327,79338,32042,38394,14725,260,4.6,5,5,9000.0,77777,0,019999999,36,0.2130,0,88,0.103,0.0,0.0 +2015,8,5,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,29.4,13.3,37,100848,983,1328,414,639,508,255,74550,37897,29918,11708,300,7.7,5,5,9000.0,77777,0,019999999,36,0.2130,0,88,0.103,0.0,0.0 +2015,8,5,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,11.7,35,100828,803,1328,410,593,634,179,69152,43745,20972,8104,270,8.8,5,5,9000.0,77777,0,019999999,31,0.2130,0,88,0.103,0.0,0.0 +2015,8,5,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,28.9,11.7,35,100828,585,1328,410,459,650,117,53134,37935,13595,5003,270,8.8,5,5,9000.0,77777,0,019999999,31,0.2130,0,88,0.103,0.0,0.0 +2015,8,5,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,11.1,37,100888,346,1328,423,238,316,109,26099,14996,12003,3647,260,6.7,9,9,9000.0,3658,0,019999999,29,0.2130,0,88,0.103,0.0,0.0 +2015,8,5,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,10.6,39,100927,102,1328,414,84,111,61,8629,388,6297,1168,280,7.7,9,9,9000.0,7620,0,019999999,28,0.2130,0,88,0.103,0.0,0.0 +2015,8,5,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.6,10.6,39,100927,0,578,391,0,0,0,0,0,0,0,280,7.7,5,5,9000.0,7620,9,999999999,28,0.2130,0,88,0.103,0.0,0.0 +2015,8,5,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,12.2,50,101077,0,0,375,0,0,0,0,0,0,0,300,4.1,3,3,9000.0,77777,9,999999999,32,0.2130,0,88,0.103,0.0,0.0 +2015,8,5,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,12.2,51,101117,0,0,357,0,0,0,0,0,0,0,270,3.6,0,0,9000.0,77777,9,999999999,32,0.2130,0,88,0.103,0.0,0.0 +2015,8,5,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.8,12.2,51,101117,0,0,357,0,0,0,0,0,0,0,270,3.6,0,0,9000.0,77777,9,999999999,32,0.2130,0,88,0.103,0.0,0.0 +2015,8,5,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,12.2,57,101157,0,0,349,0,0,0,0,0,0,0,290,4.1,0,0,9000.0,77777,9,999999999,33,0.2130,0,88,0.103,0.0,0.0 +2015,8,6,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,11.7,59,101156,0,0,343,0,0,0,0,0,0,0,280,4.6,0,0,9000.0,77777,9,999999999,31,0.2120,0,88,0.103,0.0,0.0 +2015,8,6,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,11.7,59,101156,0,0,343,0,0,0,0,0,0,0,280,4.6,0,0,9000.0,77777,9,999999999,31,0.2120,0,88,0.103,0.0,0.0 +2015,8,6,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,11.7,63,101166,0,0,338,0,0,0,0,0,0,0,280,4.1,0,0,9000.0,77777,9,999999999,31,0.2120,0,88,0.103,0.0,0.0 +2015,8,6,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,11.1,63,101146,0,0,334,0,0,0,0,0,0,0,280,4.1,0,0,9000.0,77777,9,999999999,29,0.2120,0,88,0.103,0.0,0.0 +2015,8,6,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.3,11.1,63,101146,0,0,334,0,0,0,0,0,0,0,280,4.1,0,0,9000.0,77777,9,999999999,29,0.2120,0,88,0.103,0.0,0.0 +2015,8,6,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,11.7,65,101216,179,991,350,48,208,23,5601,0,2688,888,290,4.6,3,3,9000.0,77777,9,999999999,31,0.2120,0,88,0.103,0.0,0.0 +2015,8,6,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,11.7,57,101226,424,1328,361,180,475,50,21461,16910,5974,2175,270,4.1,3,3,9000.0,77777,9,999999999,31,0.2120,0,88,0.103,0.0,0.0 +2015,8,6,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.6,11.7,57,101226,658,1328,361,361,689,71,44047,35480,8685,3413,270,4.1,3,3,9000.0,77777,9,999999999,31,0.2120,0,88,0.103,0.0,0.0 +2015,8,6,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,11.7,48,101267,864,1328,374,544,798,84,58807,81943,11959,2059,280,3.6,3,3,9000.0,77777,9,999999999,31,0.2120,0,88,0.103,0.0,0.0 +2015,8,6,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,11.7,45,101257,1030,1328,386,703,854,95,75719,88295,13028,2833,260,4.6,5,5,9000.0,77777,9,999999999,31,0.2120,0,88,0.103,0.0,0.0 +2015,8,6,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,24.4,11.7,45,101257,1143,1328,386,822,876,108,88161,90741,14373,4024,260,4.6,5,5,9000.0,77777,9,999999999,31,0.2120,0,88,0.103,0.0,0.0 +2015,8,6,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,11.1,38,101197,1196,1328,420,774,538,309,91874,41500,36905,14395,270,5.7,9,9,9000.0,7620,9,999999999,29,0.2120,0,88,0.103,0.0,0.0 +2015,8,6,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,10.6,38,101187,1186,1328,416,696,322,409,80729,28106,47768,17478,290,3.6,9,9,9000.0,7620,9,999999999,28,0.2120,0,88,0.103,0.0,0.0 +2015,8,6,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,26.1,10.6,38,101187,1112,1328,416,696,381,367,80566,32508,42763,15927,290,3.6,9,9,9000.0,7620,9,999999999,28,0.2120,0,88,0.103,0.0,0.0 +2015,8,6,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,10.0,34,101117,980,1328,422,676,515,274,78536,40727,32017,12326,290,5.1,9,9,9000.0,7620,9,999999999,26,0.2120,0,88,0.103,0.0,0.0 +2015,8,6,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,10.6,36,101117,799,1328,420,515,374,260,58296,30390,29598,10577,260,4.1,9,9,9000.0,7620,9,999999999,28,0.2120,0,88,0.103,0.0,0.0 +2015,8,6,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,26.7,10.6,36,101117,582,1328,420,403,483,165,45374,33012,18664,6432,260,4.1,9,9,9000.0,7620,9,999999999,28,0.2120,0,88,0.103,0.0,0.0 +2015,8,6,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,10.0,37,101127,342,1328,413,215,224,118,23404,11385,12902,3782,270,5.1,9,9,9000.0,4267,9,999999999,26,0.2120,0,88,0.103,0.0,0.0 +2015,8,6,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,11.1,42,101137,97,1328,411,78,64,57,8029,0,5895,1127,270,4.6,9,9,9000.0,4267,9,999999999,29,0.2120,0,88,0.103,0.0,0.0 +2015,8,6,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.0,11.1,42,101137,0,551,411,0,0,0,0,0,0,0,270,4.6,9,9,9000.0,4267,9,999999999,29,0.2120,0,88,0.103,0.0,0.0 +2015,8,6,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,12.8,52,101227,0,0,381,0,0,0,0,0,0,0,280,3.6,5,5,9000.0,77777,9,999999999,34,0.2120,0,88,0.103,0.0,0.0 +2015,8,6,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,12.2,51,101267,0,0,378,0,0,0,0,0,0,0,280,2.6,5,5,9000.0,77777,9,999999999,33,0.2120,0,88,0.103,0.0,0.0 +2015,8,6,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.8,12.2,51,101267,0,0,372,0,0,0,0,0,0,0,280,2.6,3,3,9000.0,77777,9,999999999,33,0.2120,0,88,0.103,0.0,0.0 +2015,8,6,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,12.8,57,101277,0,0,367,0,0,0,0,0,0,0,320,2.1,3,3,9000.0,77777,9,999999999,35,0.2120,0,88,0.103,0.0,0.0 +2015,8,7,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,12.8,61,101286,0,0,347,0,0,0,0,0,0,0,320,2.1,0,0,9000.0,77777,9,999999999,35,0.2120,0,88,0.103,0.0,0.0 +2015,8,7,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.6,12.8,61,101286,0,0,347,0,0,0,0,0,0,0,320,2.1,0,0,9000.0,77777,9,999999999,35,0.2120,0,88,0.103,0.0,0.0 +2015,8,7,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,12.2,63,101286,0,0,341,0,0,0,0,0,0,0,350,1.5,0,0,9000.0,77777,9,999999999,33,0.2120,0,88,0.103,0.0,0.0 +2015,8,7,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,12.2,65,101296,0,0,338,0,0,0,0,0,0,0,330,3.1,0,0,9000.0,77777,9,999999999,33,0.2120,0,88,0.103,0.0,0.0 +2015,8,7,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.9,12.2,65,101296,0,0,353,0,0,0,0,0,0,0,330,3.1,3,3,9000.0,77777,9,999999999,33,0.2120,0,88,0.103,0.0,0.0 +2015,8,7,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,12.2,68,101416,175,969,356,46,206,22,5375,0,2574,851,350,3.6,5,5,9000.0,77777,9,999999999,33,0.2120,0,88,0.103,0.0,0.0 +2015,8,7,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,12.8,61,101436,420,1329,362,174,464,49,20746,15903,5854,2131,10,2.6,3,3,9000.0,77777,9,999999999,35,0.2120,0,88,0.103,0.0,0.0 +2015,8,7,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.6,12.8,61,101436,655,1329,362,352,670,73,42806,34172,8901,3493,10,2.6,3,3,9000.0,77777,9,999999999,35,0.2120,0,88,0.103,0.0,0.0 +2015,8,7,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,12.2,53,101417,862,1329,375,533,775,88,57614,79629,12504,2084,40,3.6,5,5,9000.0,77777,9,999999999,33,0.2120,0,88,0.103,0.0,0.0 +2015,8,7,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,12.8,53,101417,1028,1329,379,691,832,99,74554,86208,13557,2875,60,5.1,5,5,9000.0,77777,9,999999999,35,0.2120,0,88,0.103,0.0,0.0 +2015,8,7,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.8,12.8,53,101417,1141,1329,379,808,854,113,86799,88655,15012,4097,60,5.1,5,5,9000.0,77777,9,999999999,35,0.2120,0,88,0.103,0.0,0.0 +2015,8,7,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,13.3,59,101397,1194,1329,374,877,863,123,94078,89725,16084,5197,90,6.7,5,5,9000.0,77777,9,999999999,36,0.2120,0,88,0.103,0.0,0.0 +2015,8,7,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,15.0,66,101377,1183,1329,376,892,858,129,96053,89557,16871,5118,90,5.7,5,5,9000.0,77777,9,999999999,43,0.2120,0,88,0.103,0.0,0.0 +2015,8,7,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,15.0,66,101377,1109,1329,376,849,829,138,105560,48682,17231,7250,90,5.7,5,5,9000.0,77777,9,999999999,43,0.2120,0,88,0.103,0.0,0.0 +2015,8,7,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,15.0,66,101367,977,1329,376,705,622,210,83322,42388,24948,10042,80,5.1,5,5,9000.0,77777,9,999999999,43,0.2120,0,88,0.103,0.0,0.0 +2015,8,7,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,15.6,71,101366,796,1329,374,606,685,146,71522,42026,17305,6850,80,5.1,5,5,9000.0,77777,9,999999999,46,0.2120,0,88,0.103,0.0,0.0 +2015,8,7,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,15.6,71,101366,578,1329,396,438,588,132,49998,34188,15131,5459,80,5.1,9,9,9000.0,77777,9,999999999,46,0.2120,0,88,0.103,0.0,0.0 +2015,8,7,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,16.1,81,101356,338,1329,387,255,435,104,27895,18013,11425,3494,80,4.1,9,9,9000.0,7620,9,999999999,48,0.2120,0,88,0.103,0.0,0.0 +2015,8,7,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,15.6,81,101386,92,1329,362,105,251,46,10936,0,4812,1073,60,3.6,5,5,9000.0,77777,9,999999999,46,0.2120,0,88,0.103,0.0,0.0 +2015,8,7,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.9,15.6,81,101386,0,524,362,0,0,0,0,0,0,0,60,3.6,5,5,9000.0,77777,9,999999999,46,0.2120,0,88,0.103,0.0,0.0 +2015,8,7,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,16.1,87,101416,0,0,355,0,0,0,0,0,0,0,60,2.1,3,3,9000.0,77777,9,999999999,48,0.2120,0,88,0.103,0.0,0.0 +2015,8,7,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,16.1,90,101416,0,0,352,0,0,0,0,0,0,0,10,2.1,3,3,9000.0,77777,9,999999999,49,0.2120,0,88,0.103,0.0,0.0 +2015,8,7,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,16.1,90,101416,0,0,352,0,0,0,0,0,0,0,10,2.1,3,3,9000.0,77777,9,999999999,49,0.2120,0,88,0.103,0.0,0.0 +2015,8,7,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,15.0,81,101386,0,0,353,0,0,0,0,0,0,0,350,2.1,3,3,9000.0,77777,9,999999999,43,0.2120,0,88,0.103,0.0,0.0 +2015,8,8,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,13.9,78,101356,0,0,350,0,0,0,0,0,0,0,350,2.1,3,3,9000.0,77777,9,999999999,39,0.2110,0,88,0.103,0.0,0.0 +2015,8,8,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,13.9,78,101356,0,0,350,0,0,0,0,0,0,0,350,2.1,3,3,9000.0,77777,9,999999999,39,0.2110,0,88,0.103,0.0,0.0 +2015,8,8,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,13.3,80,101376,0,0,344,0,0,0,0,0,0,0,350,2.6,3,3,9000.0,77777,9,999999999,37,0.2110,0,88,0.103,0.0,0.0 +2015,8,8,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,13.3,83,101386,0,0,341,0,0,0,0,0,0,0,340,2.6,3,3,9000.0,77777,9,999999999,37,0.2110,0,88,0.103,0.0,0.0 +2015,8,8,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.1,13.3,83,101386,0,0,341,0,0,0,0,0,0,0,340,2.6,3,3,9000.0,77777,9,999999999,37,0.2110,0,88,0.103,0.0,0.0 +2015,8,8,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,12.8,75,101486,171,946,346,43,185,22,5013,0,2568,847,360,3.6,3,3,9000.0,77777,9,999999999,35,0.2110,0,88,0.103,0.0,0.0 +2015,8,8,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,12.8,68,101516,417,1329,354,171,438,52,20277,15236,6180,2240,360,3.6,3,3,9000.0,77777,9,999999999,35,0.2110,0,88,0.103,0.0,0.0 +2015,8,8,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.9,12.8,68,101516,652,1329,359,348,647,78,42084,33515,9459,3700,360,3.6,5,5,9000.0,77777,9,999999999,35,0.2110,0,88,0.103,0.0,0.0 +2015,8,8,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,12.8,57,101517,859,1329,373,528,757,94,65224,42690,11649,4804,30,3.6,5,5,9000.0,77777,9,999999999,35,0.2110,0,88,0.103,0.0,0.0 +2015,8,8,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,13.3,57,101527,1025,1329,376,685,819,105,73883,84920,14340,2934,30,3.1,5,5,9000.0,77777,9,999999999,36,0.2110,0,88,0.103,0.0,0.0 +2015,8,8,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,13.3,57,101527,1139,1329,376,808,864,107,87060,89835,14273,3936,30,3.1,5,5,9000.0,77777,9,999999999,36,0.2110,0,88,0.103,0.0,0.0 +2015,8,8,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,13.9,55,101537,1192,1329,383,854,789,166,105979,48610,20697,8610,110,5.1,5,5,9000.0,77777,9,999999999,39,0.2110,0,88,0.103,0.0,0.0 +2015,8,8,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,14.4,59,101527,1181,1329,381,804,582,287,95564,42483,34319,13562,110,5.1,5,5,9000.0,77777,9,999999999,41,0.2110,0,88,0.103,0.0,0.0 +2015,8,8,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.8,14.4,59,101527,1106,1329,403,763,571,271,90149,41642,32206,12784,110,5.1,9,9,9000.0,77777,9,999999999,41,0.2110,0,88,0.103,0.0,0.0 +2015,8,8,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,13.9,59,101527,974,1329,399,692,597,231,81202,42715,27253,10810,120,3.1,9,9,9000.0,7620,9,999999999,39,0.2110,0,88,0.103,0.0,0.0 +2015,8,8,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,15.0,68,101556,792,1329,395,590,641,159,69160,40863,18721,7329,130,2.6,9,9,9000.0,7620,9,999999999,43,0.2110,0,88,0.103,0.0,0.0 +2015,8,8,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,15.0,68,101556,574,1329,395,355,301,184,39427,20731,20538,6844,130,2.6,9,9,9000.0,7620,9,999999999,43,0.2110,0,88,0.103,0.0,0.0 +2015,8,8,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,15.0,73,101516,333,1329,389,219,273,121,23640,13047,13121,3763,90,2.1,9,9,9000.0,7620,9,999999999,43,0.2110,0,88,0.103,0.0,0.0 +2015,8,8,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,15.6,81,101526,87,1329,384,84,130,54,8590,0,5549,1025,100,1.5,9,9,9000.0,7620,9,999999999,46,0.2110,0,88,0.103,0.0,0.0 +2015,8,8,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.9,15.6,81,101526,0,495,384,0,0,0,0,0,0,0,100,1.5,9,9,9000.0,7620,9,999999999,46,0.2110,0,88,0.103,0.0,0.0 +2015,8,8,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,15.6,84,101616,0,0,392,0,0,0,0,0,0,0,99,0.0,10,10,9000.0,7620,9,999999999,46,0.2110,0,88,0.103,0.0,0.0 +2015,8,8,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,15.6,84,101606,0,0,392,0,0,0,0,0,0,0,40,1.5,10,10,9000.0,7620,9,999999999,46,0.2110,0,88,0.103,0.0,0.0 +2015,8,8,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.3,15.6,84,101606,0,0,381,0,0,0,0,0,0,0,40,1.5,9,9,9000.0,7620,9,999999999,46,0.2110,0,88,0.103,0.0,0.0 +2015,8,8,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,16.1,90,101606,0,0,379,0,0,0,0,0,0,0,30,2.6,9,9,9000.0,7620,9,999999999,49,0.2110,0,88,0.103,0.0,0.0 +2015,8,9,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,15.6,87,101566,0,0,389,0,0,0,0,0,0,0,10,2.6,10,10,9000.0,7620,9,999999999,46,0.2110,0,88,0.103,0.0,0.0 +2015,8,9,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,15.6,87,101566,0,0,378,0,0,0,0,0,0,0,10,2.6,9,9,9000.0,7620,9,999999999,46,0.2110,0,88,0.103,0.0,0.0 +2015,8,9,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,15.6,90,101576,0,0,386,0,0,0,0,0,0,0,20,3.1,10,10,9000.0,4572,9,999999999,46,0.2110,0,88,0.103,0.0,0.0 +2015,8,9,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,14.4,86,101536,0,0,371,0,0,0,0,0,0,0,360,2.6,9,9,9000.0,6096,9,999999999,41,0.2110,0,88,0.103,0.0,0.0 +2015,8,9,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.7,14.4,86,101536,0,0,371,0,0,0,0,0,0,0,360,2.6,9,9,9000.0,6096,9,999999999,41,0.2110,0,88,0.103,0.0,0.0 +2015,8,9,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,14.4,84,101556,167,924,374,42,153,23,4865,0,2668,875,20,5.1,9,9,9000.0,1829,9,999999999,41,0.2110,0,88,0.103,0.0,0.0 +2015,8,9,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.0,15.0,83,101281,414,1330,378,51,0,51,5047,0,5087,2196,20,4.6,9,9,9000.0,366,9,999999999,43,0.2110,0,88,0.103,0.0,0.0 +2015,8,9,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,15.0,84,101586,649,1330,388,125,3,124,14554,174,14495,5482,20,5.1,10,10,9000.0,366,9,999999999,44,0.2110,0,88,0.103,0.0,0.0 +2015,8,9,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,16.0,78,101281,857,1330,401,167,11,161,19752,690,19129,7660,20,6.7,10,10,9000.0,488,9,999999999,48,0.2110,0,88,0.103,0.0,0.0 +2015,8,9,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,16.1,78,101696,1023,1330,401,214,15,204,25499,987,24432,9972,20,7.2,10,10,9000.0,579,9,999999999,48,0.2110,0,88,0.103,0.0,0.0 +2015,8,9,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,16.1,78,101696,1136,1330,390,416,80,348,48341,6287,40704,15465,20,7.2,9,9,9000.0,579,9,999999999,48,0.2110,0,88,0.103,0.0,0.0 +2015,8,9,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.0,16.0,69,101282,1189,1330,401,584,203,404,67581,16780,47078,17352,20,7.2,9,9,9000.0,6096,9,999999999,48,0.2110,0,88,0.103,0.0,0.0 +2015,8,9,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.0,15.0,64,101282,1178,1330,400,517,117,413,59675,9915,48006,17539,40,8.2,9,9,9000.0,701,9,999999999,43,0.2110,0,88,0.103,0.0,0.0 +2015,8,9,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,15.0,66,101686,1104,1330,398,420,63,365,48433,5178,42371,15824,30,7.7,9,9,9000.0,701,9,999999999,43,0.2110,0,88,0.103,0.0,0.0 +2015,8,9,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.0,16.0,73,101282,971,1330,373,674,637,195,79970,41803,23253,9432,70,5.7,5,5,9000.0,1219,9,999999999,48,0.2110,0,88,0.103,0.0,0.0 +2015,8,9,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,15.0,76,101666,789,1330,359,623,779,110,75081,44176,13304,5363,70,5.7,3,3,9000.0,77777,9,999999999,43,0.2110,0,88,0.103,0.0,0.0 +2015,8,9,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,19.4,15.0,76,101666,570,1330,359,458,716,92,53726,36208,10828,4063,70,5.7,3,3,9000.0,77777,9,999999999,43,0.2110,0,88,0.103,0.0,0.0 +2015,8,9,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,15.0,81,101646,329,1330,339,278,595,70,31356,17942,7921,2631,100,2.6,0,0,9000.0,77777,9,999999999,43,0.2110,0,88,0.103,0.0,0.0 +2015,8,9,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,15.0,84,101696,83,1330,336,110,335,38,11559,0,4009,952,140,1.5,0,0,9000.0,77777,9,999999999,44,0.2110,0,88,0.103,0.0,0.0 +2015,8,9,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,15.0,84,101696,0,467,336,0,0,0,0,0,0,0,140,1.5,0,0,9000.0,77777,9,999999999,44,0.2110,0,88,0.103,0.0,0.0 +2015,8,9,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,14.4,80,101716,0,0,336,0,0,0,0,0,0,0,107,0.0,0,0,9000.0,77777,9,999999999,41,0.2110,0,88,0.103,0.0,0.0 +2015,8,9,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,13.9,76,101686,0,0,337,0,0,0,0,0,0,0,118,0.0,0,0,9000.0,77777,9,999999999,39,0.2110,0,88,0.103,0.0,0.0 +2015,8,9,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.3,13.9,76,101686,0,0,337,0,0,0,0,0,0,0,139,0.0,0,0,9000.0,77777,9,999999999,39,0.2110,0,88,0.103,0.0,0.0 +2015,8,9,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,13.9,78,101696,0,0,335,0,0,0,0,0,0,0,259,0.0,0,0,9000.0,77777,9,999999999,39,0.2110,0,88,0.103,0.0,0.0 +2015,8,10,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,14.4,80,101686,0,0,336,0,0,0,0,0,0,0,290,1.5,0,0,9000.0,77777,9,999999999,41,0.2100,0,88,0.103,0.0,0.0 +2015,8,10,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,14.4,80,101686,0,0,336,0,0,0,0,0,0,0,290,1.5,0,0,9000.0,77777,9,999999999,41,0.2100,0,88,0.103,0.0,0.0 +2015,8,10,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,13.9,81,101686,0,0,332,0,0,0,0,0,0,0,290,1.5,0,0,9000.0,77777,9,999999999,39,0.2100,0,88,0.103,0.0,0.0 +2015,8,10,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,13.9,81,101686,0,0,347,0,0,0,0,0,0,0,270,3.1,3,3,9000.0,77777,9,999999999,39,0.2100,0,88,0.103,0.0,0.0 +2015,8,10,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.2,13.9,81,101686,0,0,352,0,0,0,0,0,0,0,270,3.1,5,5,9000.0,77777,9,999999999,39,0.2100,0,88,0.103,0.0,0.0 +2015,8,10,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,13.3,73,101726,164,901,357,40,164,22,4644,0,2558,839,220,2.6,5,5,9000.0,77777,9,999999999,37,0.2100,0,88,0.103,0.0,0.0 +2015,8,10,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,13.9,68,101756,410,1330,360,165,417,53,19488,14020,6274,2265,230,4.1,3,3,9000.0,77777,9,999999999,39,0.2100,0,88,0.103,0.0,0.0 +2015,8,10,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,13.9,68,101756,646,1330,366,342,636,80,41200,32550,9665,3771,230,4.1,5,5,9000.0,77777,9,999999999,39,0.2100,0,88,0.103,0.0,0.0 +2015,8,10,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,15.0,61,101707,854,1330,404,437,441,201,50812,30393,23490,9130,230,4.6,9,9,9000.0,7620,9,999999999,43,0.2100,0,88,0.103,0.0,0.0 +2015,8,10,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,15.6,58,101687,1020,1330,414,591,513,228,69815,35385,27080,10896,190,4.6,9,9,9000.0,7620,9,999999999,46,0.2100,0,88,0.103,0.0,0.0 +2015,8,10,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,24.4,15.6,58,101687,1134,1330,414,741,655,221,89188,43459,26743,10915,190,4.6,9,9,9000.0,7620,9,999999999,46,0.2100,0,88,0.103,0.0,0.0 +2015,8,10,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,15.0,47,101587,1187,1330,429,834,744,190,102310,46932,23425,9678,200,3.1,9,9,9000.0,7620,9,999999999,43,0.2100,0,88,0.103,0.0,0.0 +2015,8,10,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,15.6,54,101537,1176,1330,397,674,321,390,78081,26350,45491,16886,150,3.6,5,5,9000.0,77777,9,999999999,46,0.2100,0,88,0.103,0.0,0.0 +2015,8,10,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.6,15.6,54,101537,1101,1330,420,456,217,266,53856,15523,31599,12584,150,3.6,9,9,9000.0,77777,9,999999999,46,0.2100,0,88,0.103,0.0,0.0 +2015,8,10,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,15.6,47,101477,967,1330,433,441,134,332,50162,11009,38005,13945,180,6.7,9,9,9000.0,7010,9,999999999,45,0.2100,0,88,0.103,0.0,0.0 +2015,8,10,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,16.1,51,101457,785,1330,406,451,394,215,51503,27953,24682,9184,190,7.2,5,5,9000.0,77777,9,999999999,48,0.2100,0,88,0.103,0.0,0.0 +2015,8,10,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,27.2,16.1,51,101457,566,1330,406,389,489,160,43579,30862,18009,6193,190,7.2,5,5,9000.0,77777,9,999999999,48,0.2100,0,88,0.103,0.0,0.0 +2015,8,10,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,15.0,57,101477,324,1330,387,264,496,90,29125,18146,9967,3120,190,7.2,5,5,9000.0,77777,9,999999999,43,0.2100,0,88,0.103,0.0,0.0 +2015,8,10,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,15.6,66,101527,77,1330,379,102,259,45,10507,0,4657,937,200,6.2,5,5,9000.0,77777,9,999999999,46,0.2100,0,88,0.103,0.0,0.0 +2015,8,10,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,15.6,66,101527,0,437,379,0,0,0,0,0,0,0,200,6.2,5,5,9000.0,77777,9,999999999,46,0.2100,0,88,0.103,0.0,0.0 +2015,8,10,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,16.1,78,101636,0,0,363,0,0,0,0,0,0,0,190,5.1,3,3,9000.0,77777,9,999999999,48,0.2100,0,88,0.103,0.0,0.0 +2015,8,10,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,16.1,81,101626,0,0,360,0,0,0,0,0,0,0,200,6.2,3,3,9000.0,77777,9,999999999,48,0.2100,0,88,0.103,0.0,0.0 +2015,8,10,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,19.4,16.1,81,101626,0,0,345,0,0,0,0,0,0,0,200,6.2,0,0,9000.0,77777,9,999999999,48,0.2100,0,88,0.103,0.0,0.0 +2015,8,10,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,16.7,90,101566,0,0,355,0,0,0,0,0,0,0,190,3.1,3,3,9000.0,77777,9,999999999,52,0.2100,0,88,0.103,0.0,0.0 +2015,8,11,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,16.7,87,101516,0,0,358,0,0,0,0,0,0,0,180,3.6,3,3,9000.0,77777,9,999999999,51,0.2100,0,88,0.103,0.0,0.0 +2015,8,11,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.9,16.7,87,101516,0,0,358,0,0,0,0,0,0,0,180,3.6,3,3,9000.0,77777,9,999999999,51,0.2100,0,88,0.103,0.0,0.0 +2015,8,11,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,17.2,93,101446,0,0,361,0,0,0,0,0,0,0,170,3.6,5,5,9000.0,77777,9,999999999,54,0.2100,0,88,0.103,0.0,0.0 +2015,8,11,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,17.2,93,101406,0,0,383,0,0,0,0,0,0,0,170,3.6,9,9,9000.0,4267,9,999999999,54,0.2100,0,88,0.103,0.0,0.0 +2015,8,11,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.3,17.2,93,101406,0,0,356,0,0,0,0,0,0,0,170,3.6,3,3,9000.0,4267,0,919999999,54,0.2100,0,88,0.103,0.0,0.0 +2015,8,11,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,17.2,90,101366,160,879,397,1,0,1,97,0,97,43,160,4.1,10,10,9000.0,3658,0,919999999,54,0.2100,0,88,0.103,0.0,0.0 +2015,8,11,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,17.2,87,101326,407,1330,400,75,14,71,8627,496,8191,2888,150,4.6,10,10,9000.0,1524,0,919999999,54,0.2100,0,88,0.103,0.0,0.0 +2015,8,11,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,19.4,17.2,87,101326,643,1330,400,144,21,136,16593,1220,15738,5873,150,4.6,10,10,9000.0,1524,0,919999999,54,0.2100,0,88,0.103,0.0,0.0 +2015,8,11,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,18.3,93,101226,851,1330,401,92,9,89,11349,458,11013,4556,140,4.1,10,10,9000.0,1676,0,919999999,60,0.2100,0,88,0.103,0.0,0.0 +2015,8,11,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,19.0,18.0,94,101281,1018,1330,398,71,0,71,7376,0,7449,3877,140,5.7,10,10,6437.0,579,0,919999999,58,0.2100,0,88,0.103,0.0,0.0 +2015,8,11,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,20.0,18.9,93,101166,1131,1330,405,148,3,145,18328,166,18036,7592,150,6.2,10,10,4800.0,579,0,919999999,64,0.2100,0,88,0.103,0.0,0.0 +2015,8,11,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,19.0,19.0,100,101281,1184,1330,400,190,6,184,23278,352,22657,9411,140,4.1,10,10,2414.0,305,0,919999999,65,0.2100,0,88,0.103,0.0,0.0 +2015,8,11,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.0,20.0,100,101281,1173,1330,406,204,7,197,24803,412,24077,9965,150,6.7,10,10,3219.0,640,0,919999999,71,0.2100,0,88,0.103,0.0,0.0 +2015,8,11,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,20.6,93,100867,1098,1330,417,214,9,206,25647,541,24819,10240,180,7.2,10,10,3219.0,640,0,919999999,75,0.2100,0,88,0.103,0.0,0.0 +2015,8,11,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.0,21.0,94,101282,964,1330,419,140,2,138,16957,107,16787,7019,190,6.7,10,10,3219.0,792,0,919999999,79,0.2100,0,88,0.103,0.0,0.0 +2015,8,11,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,20.6,91,100767,781,1330,419,170,3,168,19699,178,19559,7604,190,5.1,10,10,3219.0,427,0,919999999,75,0.2100,0,88,0.103,0.0,0.0 +2015,8,11,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,20.6,91,100767,561,1330,419,89,1,89,10394,44,10429,3928,190,5.1,10,10,3219.0,427,0,919999999,75,0.2100,0,88,0.103,0.0,0.0 +2015,8,11,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,20.6,93,100707,319,1330,417,54,0,54,5267,0,5309,2124,190,4.6,10,10,3219.0,427,0,919999999,75,0.2100,0,88,0.103,0.0,0.0 +2015,8,11,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,20.6,93,100747,72,1330,417,45,55,38,4658,0,3951,879,190,2.6,10,10,3219.0,396,0,919999999,75,0.2100,0,88,0.103,0.0,0.0 +2015,8,11,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,20.6,93,100747,0,408,417,0,0,0,0,0,0,0,190,2.6,10,10,3219.0,396,0,919999999,75,0.2100,0,88,0.103,5.0,0.0 +2015,8,11,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,19.4,96,100647,0,0,394,0,0,0,0,0,0,0,180,5.1,9,9,3219.0,2743,0,919999999,67,0.2100,0,88,0.103,5.0,0.0 +2015,8,11,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.0,20.0,94,101282,0,0,401,0,0,0,0,0,0,0,230,2.6,9,9,3219.0,335,0,919999999,71,0.2100,0,88,0.103,5.0,0.0 +2015,8,11,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,20.0,93,100657,0,0,412,0,0,0,0,0,0,0,250,2.6,10,10,3219.0,335,0,919999999,71,0.2100,0,88,0.103,5.0,0.0 +2015,8,11,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.0,21.0,100,101282,0,0,413,0,0,0,0,0,0,0,180,3.1,10,10,3219.0,274,0,919999999,79,0.2100,0,88,0.103,1.1,0.0 +2015,8,12,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.0,20.0,94,101282,0,0,378,0,0,0,0,0,0,0,225,0.0,5,5,3219.0,335,0,919999999,71,0.2090,0,88,0.103,0.0,0.0 +2015,8,12,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,20.0,100,100567,0,0,367,0,0,0,0,0,0,0,180,2.6,3,3,3219.0,335,0,919999999,71,0.2090,0,88,0.103,0.0,0.0 +2015,8,12,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,20.0,100,100587,0,0,367,0,0,0,0,0,0,0,220,2.1,3,3,3219.0,77777,0,919999999,71,0.2090,0,88,0.103,0.0,0.0 +2015,8,12,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,19.4,90,100597,0,0,372,0,0,0,0,0,0,0,260,2.6,3,3,3219.0,77777,0,919999999,67,0.2090,0,88,0.103,0.0,0.0 +2015,8,12,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,19.4,90,100597,0,0,378,0,0,0,0,0,0,0,260,2.6,5,5,3219.0,77777,0,919999999,67,0.2090,0,88,0.103,0.0,0.0 +2015,8,12,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,18.3,87,100667,156,856,374,34,99,22,3916,0,2538,830,280,5.1,5,5,3219.0,77777,0,919999999,60,0.2090,0,88,0.103,0.0,0.0 +2015,8,12,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,18.3,81,100717,403,1331,380,153,348,58,17847,10565,6783,2434,290,4.6,5,5,3219.0,77777,0,919999999,60,0.2090,0,88,0.103,0.0,0.0 +2015,8,12,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,18.3,81,100717,640,1331,380,328,587,86,39110,28216,10287,4004,290,4.6,5,5,3219.0,77777,0,919999999,60,0.2090,0,88,0.103,0.0,0.0 +2015,8,12,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,17.8,64,100767,848,1331,396,511,732,98,62580,38480,12042,4965,300,4.1,5,5,3219.0,77777,0,919999999,57,0.2090,0,88,0.103,0.0,0.0 +2015,8,12,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,17.8,60,100767,1015,1331,402,675,820,101,73983,86145,13886,2817,310,4.1,5,5,3219.0,77777,0,919999999,56,0.2090,0,88,0.103,0.0,0.0 +2015,8,12,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,26.1,17.8,60,100767,1129,1331,426,636,416,317,74248,30802,37242,14442,310,4.1,9,9,3219.0,77777,0,919999999,56,0.2090,0,88,0.103,0.0,0.0 +2015,8,12,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,17.2,53,100758,1182,1331,411,630,254,413,72610,20997,47937,17551,280,3.6,5,5,3219.0,77777,0,919999999,53,0.2090,0,88,0.103,0.0,0.0 +2015,8,12,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,16.1,48,100778,1170,1331,436,592,197,419,68103,16677,48542,17646,290,4.6,9,9,3219.0,6096,0,919999999,47,0.2090,0,88,0.103,0.0,0.0 +2015,8,12,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,28.3,16.1,48,100778,1095,1331,412,660,485,260,77979,34242,30897,12345,290,4.6,5,5,3219.0,6096,0,919999999,47,0.2090,0,88,0.103,0.0,0.0 +2015,8,12,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,29.4,15.0,42,100758,961,1331,417,490,174,356,55381,14921,40500,14487,260,5.1,5,5,3219.0,77777,0,919999999,42,0.2090,0,88,0.103,0.0,0.0 +2015,8,12,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,13.9,41,100768,777,1331,409,506,478,211,57882,34585,24262,9007,270,4.6,5,5,3219.0,77777,0,919999999,38,0.2090,0,88,0.103,0.0,0.0 +2015,8,12,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,28.3,13.9,41,100768,557,1331,409,377,512,143,42610,31460,16233,5677,270,4.6,5,5,3219.0,77777,0,919999999,38,0.2090,0,88,0.103,0.0,0.0 +2015,8,12,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,14.4,45,100828,315,1331,404,259,534,77,28863,16882,8611,2766,270,4.1,5,5,3219.0,77777,0,919999999,40,0.2090,0,88,0.103,0.0,0.0 +2015,8,12,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,13.3,45,100907,67,1331,397,96,264,39,9935,0,4054,838,270,5.1,5,5,3219.0,77777,0,919999999,36,0.2090,0,88,0.103,0.0,0.0 +2015,8,12,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,26.1,13.3,45,100907,0,377,391,0,0,0,0,0,0,0,270,5.1,3,3,3219.0,77777,9,999999999,36,0.2090,0,88,0.105,0.0,0.0 +2015,8,12,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,14.4,52,101047,0,0,370,0,0,0,0,0,0,0,280,4.1,0,0,3219.0,77777,9,999999999,40,0.2090,0,88,0.105,0.0,0.0 +2015,8,12,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,15.0,60,101087,0,0,363,0,0,0,0,0,0,0,290,3.6,0,0,3219.0,77777,9,999999999,43,0.2090,0,88,0.105,0.0,0.0 +2015,8,12,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.3,15.0,60,101087,0,0,378,0,0,0,0,0,0,0,290,3.6,3,3,3219.0,77777,9,999999999,43,0.2090,0,88,0.105,0.0,0.0 +2015,8,12,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,15.6,66,101167,0,0,373,0,0,0,0,0,0,0,280,3.6,3,3,3219.0,77777,9,999999999,46,0.2090,0,88,0.105,0.0,0.0 +2015,8,13,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,15.6,71,101207,0,0,368,0,0,0,0,0,0,0,290,2.6,3,3,3219.0,77777,9,999999999,46,0.2090,0,88,0.105,0.0,0.0 +2015,8,13,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,15.6,71,101207,0,0,353,0,0,0,0,0,0,0,290,2.6,0,0,3219.0,77777,9,999999999,46,0.2090,0,88,0.105,0.0,0.0 +2015,8,13,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,15.0,73,101246,0,0,347,0,0,0,0,0,0,0,300,4.1,0,0,3219.0,77777,9,999999999,43,0.2090,0,88,0.105,0.0,0.0 +2015,8,13,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,14.4,73,101296,0,0,343,0,0,0,0,0,0,0,300,5.1,0,0,3219.0,77777,9,999999999,41,0.2090,0,88,0.105,0.0,0.0 +2015,8,13,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,19.4,14.4,73,101296,0,0,343,0,0,0,0,0,0,0,300,5.1,0,0,3219.0,77777,9,999999999,41,0.2090,0,88,0.105,0.0,0.0 +2015,8,13,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,14.4,70,101416,152,833,361,37,177,18,4334,0,2111,695,280,3.1,3,3,3219.0,77777,9,999999999,41,0.2090,0,88,0.105,0.0,0.0 +2015,8,13,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,14.4,66,101456,400,1331,366,161,445,45,19197,13352,5376,1947,320,5.1,3,3,3219.0,77777,9,999999999,41,0.2090,0,88,0.105,0.0,0.0 +2015,8,13,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,14.4,66,101456,637,1331,366,338,669,68,41131,32387,8296,3245,320,5.1,3,3,3219.0,77777,9,999999999,41,0.2090,0,88,0.105,0.0,0.0 +2015,8,13,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,13.9,54,101517,845,1331,386,520,781,82,56588,80527,11743,1986,310,2.6,5,5,3219.0,77777,9,999999999,39,0.2090,0,88,0.105,0.0,0.0 +2015,8,13,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,14.4,52,101527,1012,1331,392,680,844,91,73891,87813,12573,2666,264,3.1,5,5,3219.0,77777,9,999999999,40,0.2090,0,88,0.105,0.0,0.0 +2015,8,13,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.0,14.4,52,101527,1126,1331,392,803,885,95,87111,92331,12806,3511,259,3.1,5,5,3219.0,77777,9,999999999,40,0.2090,0,88,0.105,0.0,0.0 +2015,8,13,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,13.9,45,101517,1179,1331,401,876,904,98,94773,94259,13043,4197,240,2.6,5,5,3219.0,77777,9,999999999,38,0.2090,0,88,0.105,0.0,0.0 +2015,8,13,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,15.6,58,101497,1167,1331,391,894,906,101,97158,94874,13462,4118,130,5.7,5,5,3219.0,77777,9,999999999,46,0.2090,0,88,0.105,0.0,0.0 +2015,8,13,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,24.4,15.6,58,101497,1091,1331,391,574,329,287,67290,24327,33848,13300,130,5.7,5,5,3219.0,77777,9,999999999,46,0.2090,0,88,0.105,0.0,0.0 +2015,8,13,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,16.1,62,101487,957,1331,412,608,384,315,69295,30735,36126,13385,100,6.7,9,9,3219.0,6096,9,999999999,48,0.2090,0,88,0.105,0.0,0.0 +2015,8,13,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,16.1,64,101477,773,1331,385,594,714,142,69937,43124,16790,6606,100,6.7,5,5,3219.0,77777,9,999999999,48,0.2090,0,88,0.105,0.0,0.0 +2015,8,13,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.3,16.1,64,101477,552,1331,385,252,241,101,29207,12264,11748,4332,100,6.7,5,5,3219.0,77777,9,999999999,48,0.2090,0,88,0.105,0.0,0.0 +2015,8,13,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,16.7,68,101527,310,1331,384,98,40,79,10859,1192,8786,2794,120,4.1,5,5,3219.0,77777,9,999999999,51,0.2090,0,88,0.105,0.0,0.0 +2015,8,13,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,16.7,76,101586,62,1331,375,43,138,29,4530,0,3067,746,90,2.1,5,5,3219.0,77777,9,999999999,51,0.2090,0,88,0.105,0.0,0.0 +2015,8,13,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,16.7,76,101586,0,346,369,0,0,0,0,0,0,0,90,2.1,3,3,3219.0,77777,9,999999999,51,0.2090,0,88,0.105,0.0,0.0 +2015,8,13,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,15.0,61,101747,0,0,376,0,0,0,0,0,0,0,290,2.6,3,3,3219.0,77777,9,999999999,43,0.2090,0,88,0.105,0.0,0.0 +2015,8,13,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,13.9,57,101787,0,0,374,0,0,0,0,0,0,0,280,2.6,3,3,3219.0,77777,9,999999999,39,0.2090,0,88,0.105,0.0,0.0 +2015,8,13,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,13.9,59,101846,0,0,371,0,0,0,0,0,0,0,290,2.6,3,3,3219.0,77777,9,999999999,39,0.2090,0,88,0.105,0.0,0.0 +2015,8,13,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,13.3,55,101877,0,0,358,0,0,0,0,0,0,0,300,3.1,0,0,3219.0,77777,9,999999999,36,0.2090,0,88,0.105,0.0,0.0 +2015,8,14,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,13.3,63,101866,0,0,363,0,0,0,0,0,0,0,280,3.1,3,3,3219.0,77777,9,999999999,37,0.2080,0,88,0.105,0.0,0.0 +2015,8,14,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.6,13.3,63,101866,0,0,348,0,0,0,0,0,0,0,280,3.1,0,0,3219.0,77777,9,999999999,37,0.2080,0,88,0.105,0.0,0.0 +2015,8,14,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,12.8,66,101886,0,0,356,0,0,0,0,0,0,0,290,2.6,3,3,3219.0,77777,9,999999999,35,0.2080,0,88,0.105,0.0,0.0 +2015,8,14,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,12.8,68,101906,0,0,354,0,0,0,0,0,0,0,280,2.6,3,3,3219.0,77777,9,999999999,35,0.2080,0,88,0.105,0.0,0.0 +2015,8,14,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.9,12.8,68,101906,0,0,354,0,0,0,0,0,0,0,280,2.6,3,3,3219.0,77777,9,999999999,35,0.2080,0,88,0.105,0.0,0.0 +2015,8,14,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,14.4,73,101986,148,811,358,35,177,16,4129,0,1889,623,190,1.5,3,3,3219.0,77777,9,999999999,41,0.2080,0,88,0.105,0.0,0.0 +2015,8,14,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,15.0,70,102006,397,1332,365,163,449,42,19511,12706,5036,1827,170,2.6,3,3,3219.0,77777,9,999999999,43,0.2080,0,88,0.105,0.0,0.0 +2015,8,14,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.6,15.0,70,102006,633,1332,365,346,695,68,42060,33237,8287,3239,170,2.6,3,3,3219.0,77777,9,999999999,43,0.2080,0,88,0.105,0.0,0.0 +2015,8,14,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,13.3,47,102017,843,1332,388,530,801,83,57556,82435,11881,1987,220,4.1,3,3,3219.0,77777,9,999999999,36,0.2080,0,88,0.105,0.0,0.0 +2015,8,14,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,11.1,37,102017,1010,1332,400,689,857,95,74104,88419,13083,2708,270,5.1,5,5,3219.0,77777,9,999999999,29,0.2080,0,88,0.105,0.0,0.0 +2015,8,14,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,27.2,11.1,37,102017,1124,1332,400,808,885,104,86636,91534,13934,3679,270,5.1,5,5,3219.0,77777,9,999999999,29,0.2080,0,88,0.105,0.0,0.0 +2015,8,14,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,12.8,38,101967,1176,1332,401,876,892,111,94135,92666,14666,4507,221,2.6,3,3,3219.0,77777,9,999999999,34,0.2080,0,88,0.105,0.0,0.0 +2015,8,14,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,13.9,40,101907,1164,1332,406,888,885,115,95633,92150,15207,4417,220,6.7,3,3,3219.0,77777,9,999999999,38,0.2080,0,88,0.105,0.0,0.0 +2015,8,14,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,28.9,13.9,40,101907,1088,1332,406,843,867,115,90822,90127,15442,3521,220,6.7,3,3,3219.0,77777,9,999999999,38,0.2080,0,88,0.105,0.0,0.0 +2015,8,14,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,14.4,41,101817,953,1332,407,747,834,112,92270,47820,13885,5809,160,3.1,3,3,3219.0,77777,9,999999999,40,0.2080,0,88,0.105,0.0,0.0 +2015,8,14,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,14.4,41,101797,769,1332,407,608,780,105,73303,43983,12703,5097,240,5.1,3,3,3219.0,77777,9,999999999,40,0.2080,0,88,0.105,0.0,0.0 +2015,8,14,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,28.9,14.4,41,101797,548,1332,407,438,696,92,51151,35037,10780,3998,240,5.1,3,3,3219.0,77777,9,999999999,40,0.2080,0,88,0.105,0.0,0.0 +2015,8,14,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,16.1,54,101767,305,1332,394,255,552,70,28504,14649,7851,2547,190,7.2,3,3,3219.0,77777,9,999999999,48,0.2080,0,88,0.105,0.0,0.0 +2015,8,14,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,15.0,56,101827,56,1332,390,92,270,34,9518,0,3533,738,190,5.1,5,5,3219.0,77777,9,999999999,43,0.2080,0,88,0.105,0.0,0.0 +2015,8,14,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,24.4,15.0,56,101827,0,315,390,0,0,0,0,0,0,0,190,5.1,5,5,3219.0,77777,9,999999999,43,0.2080,0,88,0.105,0.0,0.0 +2015,8,14,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,15.0,60,101887,0,0,363,0,0,0,0,0,0,0,210,6.2,0,0,3219.0,77777,9,999999999,43,0.2080,0,88,0.105,0.0,0.0 +2015,8,14,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,14.4,59,101897,0,0,375,0,0,0,0,0,0,0,220,6.2,3,3,3219.0,77777,9,999999999,41,0.2080,0,88,0.105,0.0,0.0 +2015,8,14,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.8,14.4,59,101897,0,0,375,0,0,0,0,0,0,0,220,6.2,3,3,3219.0,77777,9,999999999,41,0.2080,0,88,0.105,0.0,0.0 +2015,8,14,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,12.8,55,101886,0,0,355,0,0,0,0,0,0,0,250,4.6,0,0,3219.0,77777,9,999999999,35,0.2080,0,88,0.105,0.0,0.0 +2015,8,15,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,13.3,59,101856,0,0,368,0,0,0,0,0,0,0,220,5.1,3,3,3219.0,77777,9,999999999,37,0.2080,0,88,0.105,0.0,0.0 +2015,8,15,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,13.3,59,101856,0,0,368,0,0,0,0,0,0,0,220,5.1,3,3,3219.0,77777,9,999999999,37,0.2080,0,88,0.105,0.0,0.0 +2015,8,15,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,13.9,65,101826,0,0,363,0,0,0,0,0,0,0,230,4.6,3,3,3219.0,77777,9,999999999,39,0.2080,0,88,0.105,0.0,0.0 +2015,8,15,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,14.4,68,101806,0,0,370,0,0,0,0,0,0,0,230,4.6,5,5,3219.0,77777,9,999999999,41,0.2080,0,88,0.105,0.0,0.0 +2015,8,15,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.6,14.4,68,101806,0,0,370,0,0,0,0,0,0,0,230,4.6,5,5,3219.0,77777,9,999999999,41,0.2080,0,88,0.105,0.0,0.0 +2015,8,15,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,15.6,73,101856,144,788,393,10,0,10,966,0,973,405,220,2.6,9,9,3219.0,2896,9,999999999,46,0.2080,0,88,0.105,0.0,0.0 +2015,8,15,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,16.1,68,101866,393,1332,402,101,104,72,11569,3701,8273,2881,230,1.5,9,9,3219.0,3048,9,999999999,48,0.2080,0,88,0.105,0.0,0.0 +2015,8,15,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,16.1,68,101866,630,1332,402,215,145,153,24500,9005,17513,6359,230,1.5,9,9,3219.0,3048,9,999999999,48,0.2080,0,88,0.105,0.0,0.0 +2015,8,15,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,17.2,56,101897,840,1332,429,409,367,202,47328,24688,23495,9081,264,1.5,9,9,3219.0,7620,9,999999999,54,0.2080,0,88,0.105,0.0,0.0 +2015,8,15,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,17.8,53,101877,1007,1332,439,630,682,157,76270,40310,19093,7954,200,2.1,9,9,3219.0,7620,9,999999999,57,0.2080,0,88,0.105,0.0,0.0 +2015,8,15,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,28.3,17.8,53,101877,1121,1332,439,696,546,268,82214,37827,31844,12704,200,2.1,9,9,3219.0,7620,9,999999999,57,0.2080,0,88,0.105,0.0,0.0 +2015,8,15,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,20.0,59,101777,1173,1332,445,675,372,360,78327,27811,42057,15978,140,4.1,9,9,3219.0,7620,9,999999999,71,0.2080,0,88,0.105,0.0,0.0 +2015,8,15,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,19.4,60,101717,1161,1332,438,611,221,419,69971,18033,48327,17587,140,2.6,9,9,3219.0,4572,9,999999999,66,0.2080,0,88,0.105,0.0,0.0 +2015,8,15,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,27.8,19.4,60,101717,1085,1332,438,509,126,404,57809,10406,46207,16740,140,2.6,9,9,3219.0,4572,9,999999999,66,0.2080,0,88,0.105,0.0,0.0 +2015,8,15,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,32.2,17.2,41,101578,950,1332,461,470,155,352,52968,12970,39931,14270,240,4.6,9,9,3219.0,1829,9,999999999,53,0.2080,0,88,0.105,0.0,0.0 +2015,8,15,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.0,19.0,65,101282,765,1332,427,346,110,269,38544,8405,30145,10463,80,5.1,9,9,3219.0,1829,0,019999999,64,0.2080,0,88,0.105,0.0,0.0 +2015,8,15,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.0,19.4,71,101607,543,1332,422,223,66,193,24390,4386,21221,6765,80,5.1,9,9,3219.0,1829,0,019999999,67,0.2080,0,88,0.105,0.0,0.0 +2015,8,15,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,17.2,56,101707,299,1332,441,124,22,114,13268,910,12256,3383,303,0.0,10,10,3219.0,1829,0,019999999,53,0.2080,0,88,0.105,0.0,0.0 +2015,8,15,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,19.4,76,101767,50,1332,416,41,7,39,4146,0,3964,670,190,3.6,9,9,3219.0,1829,0,019999999,67,0.2080,0,88,0.105,0.0,0.0 +2015,8,15,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.9,19.4,76,101767,0,283,416,0,0,0,0,0,0,0,190,3.6,9,9,3219.0,1829,0,019999999,67,0.2080,0,88,0.105,0.0,0.0 +2015,8,15,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,18.3,76,101807,0,0,408,0,0,0,0,0,0,0,210,4.6,9,9,3219.0,4267,0,019999999,60,0.2080,0,88,0.105,0.0,0.0 +2015,8,15,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,19.4,81,101837,0,0,421,0,0,0,0,0,0,0,260,4.6,10,10,3219.0,3353,0,019999999,67,0.2080,0,88,0.105,2.0,0.0 +2015,8,15,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.8,19.4,81,101837,0,0,421,0,0,0,0,0,0,0,260,4.6,10,10,3219.0,3353,0,019999999,67,0.2080,0,88,0.105,0.0,0.0 +2015,8,15,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,18.9,84,101796,0,0,414,0,0,0,0,0,0,0,280,3.1,10,10,3219.0,3353,0,019999999,64,0.2080,0,88,0.105,0.0,0.0 +2015,8,16,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,18.3,81,101796,0,0,414,0,0,0,0,0,0,0,290,3.1,10,10,3219.0,6706,0,019999999,60,0.2080,0,88,0.105,0.0,0.0 +2015,8,16,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,18.3,81,101796,0,0,414,0,0,0,0,0,0,0,290,3.1,10,10,3219.0,6706,0,019999999,60,0.2080,0,88,0.105,0.0,0.0 +2015,8,16,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,18.3,84,101836,0,0,371,0,0,0,0,0,0,0,250,1.5,3,3,3219.0,77777,0,019999999,60,0.2080,0,88,0.105,0.0,0.0 +2015,8,16,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,18.9,93,101766,0,0,372,0,0,0,0,0,0,0,200,3.6,5,5,3219.0,77777,0,019999999,64,0.2080,0,88,0.105,0.0,0.0 +2015,8,16,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,18.9,93,101766,0,0,372,0,0,0,0,0,0,0,200,3.6,5,5,3219.0,77777,0,019999999,64,0.2080,0,88,0.105,0.0,0.0 +2015,8,16,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,18.3,87,101856,140,765,368,27,94,18,3132,0,2091,684,270,3.6,3,3,3219.0,77777,0,019999999,60,0.2080,0,88,0.105,0.0,0.0 +2015,8,16,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,18.3,79,101846,389,1333,377,142,329,55,16568,9273,6433,2299,270,2.1,3,3,3219.0,77777,0,019999999,60,0.2080,0,88,0.105,0.0,0.0 +2015,8,16,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,18.3,79,101846,627,1333,377,311,552,90,36857,26766,10701,4132,270,2.1,3,3,3219.0,77777,0,019999999,60,0.2080,0,88,0.105,0.0,0.0 +2015,8,16,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,18.9,67,101807,837,1333,379,488,682,110,59066,36147,13363,5474,210,2.6,0,0,3219.0,77777,0,019999999,64,0.2080,0,88,0.105,0.0,0.0 +2015,8,16,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,18.9,61,101827,1004,1333,387,645,757,122,79461,40867,15089,6365,250,2.6,0,0,3219.0,77777,0,019999999,63,0.2080,0,88,0.105,0.0,0.0 +2015,8,16,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,27.2,18.9,61,101827,1118,1333,403,768,816,121,84077,86175,16148,3911,250,2.6,3,3,3219.0,77777,0,019999999,63,0.2080,0,88,0.105,0.0,0.0 +2015,8,16,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,29.4,17.8,50,101797,1170,1333,414,840,842,122,91508,88665,16090,4658,240,1.5,3,3,3219.0,77777,0,019999999,57,0.2080,0,88,0.105,0.0,0.0 +2015,8,16,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,31.1,18.3,47,101778,1158,1333,424,857,846,123,93528,89214,16261,4478,250,3.6,3,3,3219.0,77777,0,019999999,59,0.2080,0,88,0.105,0.0,0.0 +2015,8,16,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,31.1,18.3,47,101778,1081,1333,431,573,291,321,66319,21875,37389,14378,250,3.6,5,5,3219.0,77777,0,019999999,59,0.2080,0,88,0.105,0.0,0.0 +2015,8,16,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,19.0,69,101282,946,1333,422,526,245,345,59232,19867,39106,14059,80,5.1,9,9,3219.0,1676,0,019999999,64,0.2080,0,88,0.105,0.0,0.0 +2015,8,16,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,19.4,69,101707,760,1333,396,525,574,178,60396,35837,20577,7842,100,4.1,3,3,3219.0,77777,0,019999999,67,0.2080,0,88,0.105,0.0,0.0 +2015,8,16,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.6,19.4,69,101707,538,1333,396,417,633,106,47844,30453,12208,4451,100,4.1,3,3,3219.0,77777,0,019999999,67,0.2080,0,88,0.105,0.0,0.0 +2015,8,16,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,18.9,71,101667,294,1333,389,238,483,79,26173,12533,8721,2724,120,2.1,3,3,3219.0,77777,0,019999999,64,0.2080,0,88,0.105,0.0,0.0 +2015,8,16,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,19.4,74,101677,45,1333,395,82,216,35,8319,0,3568,632,70,2.1,5,5,3219.0,77777,0,019999999,67,0.2080,0,88,0.105,0.0,0.0 +2015,8,16,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,24.4,19.4,74,101677,0,250,395,0,0,0,0,0,0,0,70,2.1,5,5,3219.0,77777,9,999999999,67,0.2080,0,88,0.105,0.0,0.0 +2015,8,16,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,20.0,76,101717,0,0,374,0,0,0,0,0,0,0,210,1.5,0,0,3219.0,77777,9,999999999,71,0.2080,0,88,0.105,0.0,0.0 +2015,8,16,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,19.4,74,101737,0,0,395,0,0,0,0,0,0,0,210,2.1,5,5,3219.0,77777,9,999999999,67,0.2080,0,88,0.105,0.0,0.0 +2015,8,16,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,24.4,19.4,74,101737,0,0,395,0,0,0,0,0,0,0,210,2.1,5,5,3219.0,77777,9,999999999,67,0.2080,0,88,0.105,0.0,0.0 +2015,8,16,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,19.4,71,101737,0,0,376,0,0,0,0,0,0,0,240,2.6,0,0,3219.0,77777,9,999999999,67,0.2080,0,88,0.105,0.0,0.0 +2015,8,17,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,20.0,74,101747,0,0,393,0,0,0,0,0,0,0,260,3.1,3,3,3219.0,77777,9,999999999,71,0.2070,0,88,0.105,0.0,0.0 +2015,8,17,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.0,20.0,74,101747,0,0,377,0,0,0,0,0,0,0,260,3.1,0,0,3219.0,77777,9,999999999,71,0.2070,0,88,0.105,0.0,0.0 +2015,8,17,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,19.4,81,101727,0,0,365,0,0,0,0,0,0,0,210,2.1,0,0,3219.0,77777,9,999999999,67,0.2070,0,88,0.105,0.0,0.0 +2015,8,17,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,19.4,84,101726,0,0,378,0,0,0,0,0,0,0,210,1.5,3,3,3219.0,77777,9,999999999,67,0.2070,0,88,0.105,0.0,0.0 +2015,8,17,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,19.4,84,101726,0,0,378,0,0,0,0,0,0,0,210,1.5,3,3,3219.0,77777,9,999999999,67,0.2070,0,88,0.105,0.0,0.0 +2015,8,17,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,19.4,74,101797,136,742,389,26,95,17,3019,0,1977,647,280,2.6,3,3,3219.0,77777,9,999999999,67,0.2070,0,88,0.105,0.0,0.0 +2015,8,17,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,19.4,69,101807,386,1333,396,139,320,55,16184,8517,6420,2292,280,2.1,3,3,3219.0,77777,9,999999999,67,0.2070,0,88,0.105,0.0,0.0 +2015,8,17,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.6,19.4,69,101807,624,1333,396,307,535,93,36227,25542,11011,4241,280,2.1,3,3,3219.0,77777,9,999999999,67,0.2070,0,88,0.105,0.0,0.0 +2015,8,17,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,19.4,57,101757,834,1333,413,483,657,119,58053,35258,14358,5856,294,1.5,3,3,3219.0,77777,9,999999999,66,0.2070,0,88,0.105,0.0,0.0 +2015,8,17,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,20.6,63,101747,1001,1333,412,638,727,138,77710,39131,16881,7095,130,4.1,3,3,3219.0,77777,9,999999999,75,0.2070,0,88,0.105,0.0,0.0 +2015,8,17,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,28.3,20.6,63,101747,1115,1333,418,761,787,139,94136,41728,17269,7298,130,4.1,5,5,3219.0,77777,9,999999999,75,0.2070,0,88,0.105,0.0,0.0 +2015,8,17,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.6,18.3,48,101678,1168,1333,428,833,814,141,103886,45124,17661,7427,130,5.1,5,5,3219.0,77777,9,999999999,59,0.2070,0,88,0.105,0.0,0.0 +2015,8,17,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,29.4,19.4,55,101638,1155,1333,423,789,666,214,95117,40992,25938,10656,120,5.7,5,5,3219.0,77777,9,999999999,66,0.2070,0,88,0.105,0.0,0.0 +2015,8,17,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,29.4,19.4,55,101638,1078,1333,423,581,232,390,66096,18878,44675,16331,120,5.7,5,5,3219.0,77777,9,999999999,66,0.2070,0,88,0.105,0.0,0.0 +2015,8,17,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,20.0,63,101557,942,1333,414,459,143,352,51511,11572,39767,14184,120,4.1,5,5,3219.0,77777,9,999999999,71,0.2070,0,88,0.105,0.0,0.0 +2015,8,17,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,20.0,63,101527,756,1333,414,268,130,178,30785,8030,20547,7817,140,4.1,5,5,3219.0,77777,9,999999999,71,0.2070,0,88,0.105,0.0,0.0 +2015,8,17,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,27.8,20.0,63,101527,533,1333,414,340,363,175,37378,22491,19337,6313,140,4.1,5,5,3219.0,77777,9,999999999,71,0.2070,0,88,0.105,0.0,0.0 +2015,8,17,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,31.7,17.8,44,101488,289,1333,433,192,296,110,20514,11421,11808,3241,250,4.1,5,5,3219.0,77777,9,999999999,56,0.2070,0,88,0.105,0.0,0.0 +2015,8,17,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.6,18.3,48,101498,39,1333,428,76,165,38,7609,0,3825,534,256,2.6,5,5,3219.0,77777,9,999999999,59,0.2070,0,88,0.105,0.0,0.0 +2015,8,17,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,30.6,18.3,48,101498,0,217,428,0,0,0,0,0,0,0,268,2.6,5,5,3219.0,77777,9,999999999,59,0.2070,0,88,0.105,0.0,0.0 +2015,8,17,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,21.1,67,101587,0,0,416,0,0,0,0,0,0,0,220,5.1,5,5,3219.0,77777,9,999999999,79,0.2070,0,88,0.105,0.0,0.0 +2015,8,17,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,21.1,69,101587,0,0,406,0,0,0,0,0,0,0,220,4.1,3,3,3219.0,77777,9,999999999,79,0.2070,0,88,0.105,0.0,0.0 +2015,8,17,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,27.2,21.1,69,101587,0,0,389,0,0,0,0,0,0,0,220,4.1,0,0,3219.0,77777,9,999999999,79,0.2070,0,88,0.105,0.0,0.0 +2015,8,17,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,20.6,77,101607,0,0,377,0,0,0,0,0,0,0,220,3.1,0,0,3219.0,77777,9,999999999,75,0.2070,0,88,0.105,0.0,0.0 +2015,8,18,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,20.6,77,101637,0,0,394,0,0,0,0,0,0,0,210,2.6,3,3,3219.0,77777,9,999999999,75,0.2060,0,88,0.105,0.0,0.0 +2015,8,18,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.0,20.6,77,101637,0,0,400,0,0,0,0,0,0,0,210,2.6,5,5,3219.0,77777,9,999999999,75,0.2060,0,88,0.105,0.0,0.0 +2015,8,18,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,20.6,87,101577,0,0,382,0,0,0,0,0,0,0,200,4.1,3,3,3219.0,77777,9,999999999,76,0.2060,0,88,0.105,0.0,0.0 +2015,8,18,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,20.6,87,101577,0,0,382,0,0,0,0,0,0,0,210,3.6,3,3,3219.0,77777,9,999999999,76,0.2060,0,88,0.105,0.0,0.0 +2015,8,18,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.8,20.6,87,101577,0,0,388,0,0,0,0,0,0,0,210,3.6,5,5,3219.0,77777,9,999999999,76,0.2060,0,88,0.105,0.0,0.0 +2015,8,18,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,20.6,87,101627,132,719,388,22,58,17,2545,0,1970,644,220,3.1,5,5,3219.0,77777,9,999999999,76,0.2060,0,88,0.105,0.0,0.0 +2015,8,18,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,20.6,82,101637,382,1334,388,130,252,65,14902,6999,7473,2625,220,3.1,3,3,3219.0,77777,9,999999999,75,0.2060,0,88,0.105,0.0,0.0 +2015,8,18,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.9,20.6,82,101637,621,1334,394,294,454,112,34125,22570,13050,4944,220,3.1,5,5,3219.0,77777,9,999999999,75,0.2060,0,88,0.105,0.0,0.0 +2015,8,18,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,21.7,72,101607,831,1334,407,469,590,143,55412,31918,16969,6843,150,3.1,3,3,3219.0,77777,9,999999999,84,0.2060,0,88,0.105,0.0,0.0 +2015,8,18,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,21.7,67,101607,999,1334,419,624,669,164,74889,37059,19776,8233,130,3.1,5,5,3219.0,77777,9,999999999,84,0.2060,0,88,0.105,0.0,0.0 +2015,8,18,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,28.3,21.7,67,101607,1112,1334,413,746,735,166,90915,39980,20328,8533,130,3.1,3,3,3219.0,77777,9,999999999,84,0.2060,0,88,0.105,0.0,0.0 +2015,8,18,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,21.7,67,101537,1164,1334,419,731,528,288,86032,34746,34106,13542,70,4.6,5,5,3219.0,77777,9,999999999,84,0.2060,0,88,0.105,0.0,0.0 +2015,8,18,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,20.6,77,101497,1151,1334,424,322,191,158,39645,10430,19545,8206,70,5.1,9,9,3219.0,1829,9,999999999,75,0.2060,0,88,0.105,0.0,0.0 +2015,8,18,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.0,20.6,77,101497,1074,1334,424,428,187,277,49938,12725,32515,12879,70,5.1,9,9,3219.0,1829,9,999999999,75,0.2060,0,88,0.105,0.0,0.0 +2015,8,18,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,26.0,21.0,74,101282,938,1334,442,460,214,305,52131,15860,34783,12932,250,10.8,10,10,805.0,1676,0,019999999,78,0.2060,0,88,0.105,0.0,0.0 +2015,8,18,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,24.4,20.6,79,101507,751,1334,397,210,89,143,24507,4963,16761,6557,70,2.6,5,5,9656.0,3962,0,019999999,75,0.2060,0,88,0.105,0.0,0.0 +2015,8,18,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,24.4,20.6,79,101507,528,1334,397,100,4,98,11504,179,11315,4146,70,2.6,5,5,9000.0,3962,0,019999999,75,0.2060,0,88,0.105,0.0,0.0 +2015,8,18,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,20.6,72,101477,283,1334,430,70,0,70,6806,0,6859,2465,220,4.1,9,9,9000.0,3353,0,019999999,75,0.2060,0,88,0.105,0.0,0.0 +2015,8,18,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,21.1,76,101487,33,1334,428,23,0,23,2185,0,2200,538,220,4.1,9,9,9000.0,3353,0,019999999,79,0.2060,0,88,0.105,0.0,0.0 +2015,8,18,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.6,21.1,76,101487,0,184,428,0,0,0,0,0,0,0,220,4.1,9,9,9000.0,3353,9,999999999,79,0.2060,0,88,0.105,0.0,0.0 +2015,8,18,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,18.3,66,101607,0,0,421,0,0,0,0,0,0,0,220,4.6,9,9,9000.0,3048,9,999999999,60,0.2060,0,88,0.105,0.0,0.0 +2015,8,18,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,18.9,74,101627,0,0,415,0,0,0,0,0,0,0,220,4.6,9,9,9000.0,3048,9,999999999,64,0.2060,0,88,0.105,0.0,0.0 +2015,8,18,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.9,18.9,74,101627,0,0,415,0,0,0,0,0,0,0,220,4.6,9,9,9000.0,3048,9,999999999,64,0.2060,0,88,0.105,0.0,0.0 +2015,8,18,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,20.6,87,101647,0,0,388,0,0,0,0,0,0,0,200,2.6,5,5,9000.0,77777,9,999999999,76,0.2060,0,88,0.105,3.6,0.0 +2015,8,19,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,20.6,91,101647,0,0,385,0,0,0,0,0,0,0,220,3.6,5,5,9000.0,77777,9,999999999,76,0.2050,0,88,0.105,0.0,0.0 +2015,8,19,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,20.6,91,101647,0,0,363,0,0,0,0,0,0,0,220,3.6,0,0,9000.0,77777,9,999999999,76,0.2050,0,88,0.105,0.0,0.0 +2015,8,19,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,20.6,91,101667,0,0,385,0,0,0,0,0,0,0,220,3.1,5,5,9000.0,77777,9,999999999,76,0.2050,0,88,0.105,0.0,0.0 +2015,8,19,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.0,21.0,94,101282,0,0,419,0,0,0,0,0,0,0,220,3.6,10,10,9000.0,274,9,999999999,79,0.2050,0,88,0.105,0.0,0.0 +2015,8,19,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,20.6,91,101687,0,0,385,0,0,0,0,0,0,0,230,3.6,5,5,9000.0,274,9,999999999,76,0.2050,0,88,0.105,0.0,0.0 +2015,8,19,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.0,21.0,94,101282,128,695,407,24,73,17,2769,0,1964,640,200,1.5,9,9,9000.0,457,9,999999999,79,0.2050,0,88,0.105,0.0,0.0 +2015,8,19,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.0,21.0,94,101282,379,1334,379,135,300,58,15593,7451,6717,2381,220,3.1,3,3,9000.0,77777,9,999999999,79,0.2050,0,88,0.105,0.0,0.0 +2015,8,19,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.9,20.6,82,101777,617,1334,388,303,523,97,35544,24522,11418,4376,200,3.1,3,3,9000.0,77777,9,999999999,75,0.2050,0,88,0.105,0.0,0.0 +2015,8,19,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,20.6,72,101807,828,1334,406,481,664,117,57753,34498,14102,5753,230,5.7,5,5,9000.0,77777,9,999999999,75,0.2050,0,88,0.105,0.0,0.0 +2015,8,19,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,20.6,67,101807,996,1334,406,639,745,130,78106,39452,15956,6717,230,4.6,3,3,9000.0,77777,9,999999999,75,0.2050,0,88,0.105,0.0,0.0 +2015,8,19,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,27.2,20.6,67,101807,1109,1334,406,761,802,132,94409,41991,16445,6963,230,4.6,3,3,9000.0,77777,9,999999999,75,0.2050,0,88,0.105,0.0,0.0 +2015,8,19,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,29.4,20.0,57,101748,1161,1334,423,833,829,133,91357,87919,17512,4692,190,4.6,5,5,9000.0,77777,9,999999999,70,0.2050,0,88,0.105,0.0,0.0 +2015,8,19,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.0,19.4,53,101708,1148,1334,426,851,837,132,93113,88546,17429,4461,180,4.1,5,5,9000.0,77777,9,999999999,66,0.2050,0,88,0.105,0.0,0.0 +2015,8,19,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,30.0,19.4,53,101708,1070,1334,426,812,829,128,100547,44488,15915,6739,180,4.1,5,5,9000.0,77777,9,999999999,66,0.2050,0,88,0.105,0.0,0.0 +2015,8,19,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.6,18.3,48,101658,933,1334,421,721,805,121,87991,44179,14824,6180,190,5.7,3,3,9000.0,77777,9,999999999,59,0.2050,0,88,0.105,0.0,0.0 +2015,8,19,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.0,18.9,51,101648,747,1334,419,585,758,110,69735,39969,13161,5245,190,6.7,3,3,9000.0,77777,9,999999999,63,0.2050,0,88,0.105,0.0,0.0 +2015,8,19,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,30.0,18.9,51,101648,523,1334,425,417,677,94,48158,30855,10894,3992,190,6.7,5,5,9000.0,77777,9,999999999,63,0.2050,0,88,0.105,0.0,0.0 +2015,8,19,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,19.4,64,101677,277,1334,408,237,531,69,26186,10406,7651,2419,190,4.6,5,5,9000.0,77777,9,999999999,67,0.2050,0,88,0.105,0.0,0.0 +2015,8,19,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,18.9,67,101717,27,1334,401,75,210,26,7650,0,2664,501,190,4.1,5,5,9000.0,77777,9,999999999,63,0.2050,0,88,0.105,0.0,0.0 +2015,8,19,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.6,18.9,67,101717,0,150,379,0,0,0,0,0,0,0,190,4.1,0,0,9000.0,77777,9,999999999,63,0.2050,0,88,0.105,0.0,0.0 +2015,8,19,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,20.0,82,101827,0,0,368,0,0,0,0,0,0,0,170,3.1,0,0,9000.0,77777,9,999999999,71,0.2050,0,88,0.105,0.0,0.0 +2015,8,19,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,20.0,84,101857,0,0,366,0,0,0,0,0,0,0,190,3.1,0,0,9000.0,77777,9,999999999,71,0.2050,0,88,0.105,0.0,0.0 +2015,8,19,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.8,20.0,84,101857,0,0,366,0,0,0,0,0,0,0,190,3.1,0,0,9000.0,77777,9,999999999,71,0.2050,0,88,0.105,0.0,0.0 +2015,8,19,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,21.1,93,101886,0,0,364,0,0,0,0,0,0,0,180,2.6,0,0,9000.0,77777,9,999999999,80,0.2050,0,88,0.105,0.0,0.0 +2015,8,20,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.0,21.0,94,101282,0,0,419,0,0,0,0,0,0,0,170,2.1,10,10,9000.0,77777,9,999999999,79,0.2040,0,88,0.105,0.0,0.0 +2015,8,20,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,21.1,93,101896,0,0,380,0,0,0,0,0,0,0,190,2.1,3,3,9000.0,77777,9,999999999,80,0.2040,0,88,0.105,0.0,0.0 +2015,8,20,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.0,21.0,100,101282,0,0,379,0,0,0,0,0,0,0,80,1.5,5,5,9000.0,305,9,999999999,79,0.2040,0,88,0.105,0.0,0.0 +2015,8,20,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,19.0,94,101281,0,0,394,0,0,0,0,0,0,0,110,1.5,9,9,9000.0,366,9,999999999,65,0.2040,0,88,0.105,0.0,0.0 +2015,8,20,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.6,20.0,96,101896,0,0,410,0,0,0,0,0,0,0,100,1.5,10,10,9000.0,366,9,999999999,72,0.2040,0,88,0.105,0.0,0.0 +2015,8,20,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,20.6,97,101876,124,672,402,27,138,14,3157,0,1638,538,150,2.6,9,9,9000.0,305,9,999999999,76,0.2040,0,88,0.105,0.0,0.0 +2015,8,20,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.0,21.0,94,101282,375,1335,379,144,410,41,17072,7931,4870,1760,120,2.6,3,3,9000.0,244,9,999999999,79,0.2040,0,88,0.105,0.0,0.0 +2015,8,20,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.8,21.1,90,101897,614,1335,389,317,647,67,38213,26271,8098,3162,110,2.6,5,5,9000.0,244,9,999999999,80,0.2040,0,88,0.105,0.0,0.0 +2015,8,20,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,20.6,82,101897,825,1335,394,496,762,83,61080,36001,10252,4228,110,3.6,5,5,9000.0,77777,9,999999999,76,0.2040,0,88,0.105,0.0,0.0 +2015,8,20,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,20.6,77,101927,993,1335,400,654,824,94,72683,87441,13064,2599,100,4.6,5,5,9000.0,77777,9,999999999,75,0.2040,0,88,0.105,0.0,0.0 +2015,8,20,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.0,20.6,77,101927,1106,1335,394,769,842,111,85031,89541,14947,3610,100,4.6,3,3,9000.0,77777,9,999999999,75,0.2040,0,88,0.105,0.0,0.0 +2015,8,20,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,20.6,79,101877,1158,1335,397,838,853,119,92452,90759,15793,4374,90,8.8,5,5,9000.0,77777,9,999999999,75,0.2040,0,88,0.105,0.0,0.0 +2015,8,20,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,20.0,76,101827,1145,1335,390,852,854,122,93681,90606,16204,4239,90,8.2,3,3,9000.0,77777,9,999999999,71,0.2040,0,88,0.105,0.0,0.0 +2015,8,20,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,24.4,20.0,76,101827,1067,1335,396,807,825,130,99695,43894,16127,6829,90,8.2,5,5,9000.0,77777,9,999999999,71,0.2040,0,88,0.105,0.0,0.0 +2015,8,20,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.0,20.0,78,101282,929,1335,394,712,789,127,86374,42383,15469,6439,90,8.8,5,5,9000.0,77777,9,999999999,71,0.2040,0,88,0.105,0.0,0.0 +2015,8,20,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,20.6,85,101717,742,1335,391,575,734,117,68038,38002,13898,5515,100,7.7,5,5,9000.0,77777,9,999999999,76,0.2040,0,88,0.105,0.0,0.0 +2015,8,20,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.3,20.6,85,101717,518,1335,391,406,642,101,46479,28830,11606,4210,100,7.7,5,5,9000.0,77777,9,999999999,76,0.2040,0,88,0.105,0.0,0.0 +2015,8,20,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,20.6,93,101716,272,1335,383,226,478,75,24711,9526,8232,2532,110,7.2,5,5,9000.0,77777,9,999999999,76,0.2040,0,88,0.105,0.0,0.0 +2015,8,20,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.6,20.0,96,101696,21,1335,376,71,178,28,7126,0,2824,432,110,7.7,5,5,9656.0,77777,9,999999999,71,0.2040,0,88,0.105,0.0,0.0 +2015,8,20,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,20.6,20.0,96,101696,0,115,376,0,0,0,0,0,0,0,110,7.7,5,5,9000.0,77777,9,999999999,71,0.2040,0,88,0.103,1.0,0.0 +2015,8,20,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.0,21.0,100,101282,0,0,402,0,0,0,0,0,0,0,110,5.1,9,9,9656.0,122,9,999999999,79,0.2040,0,88,0.103,0.0,0.0 +2015,8,20,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.0,21.0,100,101282,0,0,379,0,0,0,0,0,0,0,110,4.6,5,5,9656.0,77777,9,999999999,79,0.2040,0,88,0.103,0.0,0.0 +2015,8,20,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,21.1,20.6,97,101726,0,0,413,0,0,0,0,0,0,0,100,4.1,10,10,9000.0,77777,9,999999999,76,0.2040,0,88,0.103,0.0,0.0 +2015,8,20,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.0,21.0,100,101282,0,0,413,0,0,0,0,0,0,0,110,2.1,10,10,805.0,274,9,999999999,79,0.2040,0,88,0.103,0.0,0.0 +2015,8,21,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.0,20.0,100,101281,0,0,406,0,0,0,0,0,0,0,70,3.1,10,10,2816.0,335,0,999999999,71,0.2030,0,88,0.103,0.0,0.0 +2015,8,21,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,20.0,20.0,100,101636,0,0,406,0,0,0,0,0,0,0,70,2.1,10,10,8000.0,335,0,999999999,71,0.2030,0,88,0.103,0.0,0.0 +2015,8,21,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.0,20.0,100,101566,0,0,406,0,0,0,0,0,0,0,110,3.6,10,10,1609.0,305,0,999999999,71,0.2030,0,88,0.103,0.0,0.0 +2015,8,21,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.0,20.0,100,101281,0,0,406,0,0,0,0,0,0,0,110,4.1,10,10,1609.0,305,0,999999999,71,0.2030,0,88,0.103,0.0,0.0 +2015,8,21,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,20.0,20.0,100,101566,0,0,406,0,0,0,0,0,0,0,110,3.6,10,10,1600.0,305,0,999999999,71,0.2030,0,88,0.103,0.0,0.0 +2015,8,21,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.6,20.6,100,101596,120,649,410,1,0,1,96,0,97,43,100,2.1,10,10,402.0,61,0,999999999,76,0.2030,0,88,0.103,0.0,0.0 +2015,8,21,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.0,21.0,100,101282,371,1336,413,10,0,10,979,0,987,465,110,2.1,10,10,402.0,213,0,919999999,79,0.2030,0,88,0.103,0.0,0.0 +2015,8,21,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,20.6,20.6,100,101636,611,1336,410,76,0,76,7603,0,7670,3530,80,2.6,10,10,400.0,213,0,919999999,76,0.2030,0,88,0.103,0.0,0.0 +2015,8,21,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.0,21.0,100,101282,822,1336,413,99,0,99,10078,0,10173,4950,150,0.0,10,10,805.0,183,0,019999999,79,0.2030,0,88,0.103,0.0,0.0 +2015,8,21,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,22.0,22.0,100,101282,990,1336,420,186,13,177,22151,736,21183,8752,70,2.1,10,10,6437.0,244,0,019999999,87,0.2030,0,88,0.103,0.0,0.0 +2015,8,21,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,23.3,22.8,97,101647,1103,1336,417,310,35,282,36171,2275,33107,13152,170,2.6,9,9,9000.0,244,0,019999999,94,0.2030,0,88,0.103,0.0,0.0 +2015,8,21,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.0,23.0,94,101282,1155,1336,421,487,132,374,55969,9599,43282,16302,90,3.6,9,9,9000.0,1402,0,019999999,96,0.2030,0,88,0.103,0.0,0.0 +2015,8,21,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,21.7,85,101577,1141,1336,422,504,137,386,57757,10434,44544,16576,70,2.6,9,9,9000.0,2286,0,019999999,84,0.2030,0,88,0.103,0.0,0.0 +2015,8,21,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,24.4,21.7,85,101577,1063,1336,422,627,341,350,71583,25492,40227,15132,70,2.6,9,9,9000.0,2286,0,019999999,84,0.2030,0,88,0.103,0.0,0.0 +2015,8,21,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,24.4,22.2,88,101537,925,1336,422,358,155,239,41220,10034,27675,10805,210,2.1,9,9,8047.0,2743,0,019999999,88,0.2030,0,88,0.103,0.0,0.0 +2015,8,21,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,21.7,85,101497,737,1336,398,499,520,186,56799,31725,21279,7967,110,4.6,5,5,8047.0,77777,0,019999999,84,0.2030,0,88,0.103,0.0,0.0 +2015,8,21,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,24.4,21.7,85,101497,512,1336,398,355,493,141,39451,25716,15742,5362,110,4.6,5,5,8047.0,77777,0,019999999,84,0.2030,0,88,0.103,0.0,0.0 +2015,8,21,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,21.7,77,101547,266,1336,431,217,454,75,23641,8097,8203,2504,170,5.7,9,9,8047.0,1829,0,019999999,84,0.2030,0,88,0.103,0.0,0.0 +2015,8,21,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,21.1,76,101607,14,1336,428,67,167,28,6657,0,2797,362,340,3.1,9,9,8047.0,1829,0,019999999,79,0.2030,0,88,0.103,0.0,0.0 +2015,8,21,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.6,21.1,76,101607,0,80,440,0,0,0,0,0,0,0,340,3.1,10,10,8047.0,1829,0,919999999,79,0.2030,0,88,0.103,0.0,0.0 +2015,8,21,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.0,21.0,89,101282,0,0,413,0,0,0,0,0,0,0,350,3.1,9,9,8047.0,1006,0,919999999,78,0.2030,0,88,0.103,5.0,0.0 +2015,8,21,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,21.1,87,101667,0,0,415,0,0,0,0,0,0,0,220,0.0,9,9,8047.0,945,0,919999999,79,0.2030,0,88,0.103,5.0,0.0 +2015,8,21,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.3,21.1,87,101667,0,0,415,0,0,0,0,0,0,0,252,0.0,9,9,8047.0,945,0,919999999,79,0.2030,0,88,0.103,5.0,0.0 +2015,8,21,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,21.1,96,101656,0,0,417,0,0,0,0,0,0,0,170,2.1,10,10,8047.0,1067,0,919999999,80,0.2030,0,88,0.103,0.5,0.0 +2015,8,22,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,21.1,96,101646,0,0,417,0,0,0,0,0,0,0,300,0.0,10,10,8047.0,1189,0,919999999,80,0.2020,0,88,0.103,0.0,0.0 +2015,8,22,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,21.1,96,101646,0,0,417,0,0,0,0,0,0,0,313,0.0,10,10,8047.0,1189,0,919999999,80,0.2020,0,88,0.103,0.0,0.0 +2015,8,22,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.0,21.0,100,101282,0,0,413,0,0,0,0,0,0,0,321,0.0,10,10,8047.0,305,0,919999999,79,0.2020,0,88,0.103,0.0,0.0 +2015,8,22,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,19.0,94,101281,0,0,394,0,0,0,0,0,0,0,130,1.5,9,9,8047.0,1341,0,919999999,65,0.2020,0,88,0.103,0.0,0.0 +2015,8,22,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,18.9,93,101716,0,0,394,0,0,0,0,0,0,0,130,1.5,9,9,8047.0,1341,0,919999999,64,0.2020,0,88,0.103,0.0,0.0 +2015,8,22,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,18.9,90,101766,116,626,408,15,9,14,1748,0,1633,532,342,0.0,10,10,8047.0,427,0,919999999,64,0.2020,0,88,0.103,0.0,0.0 +2015,8,22,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.0,19.0,88,101282,368,1336,411,70,31,63,8023,857,7242,2522,348,0.0,10,10,8047.0,3353,0,919999999,64,0.2020,0,88,0.103,0.0,0.0 +2015,8,22,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,19.4,87,101806,607,1336,415,181,97,144,20558,5521,16429,5955,10,3.1,10,10,8047.0,3353,0,919999999,67,0.2020,0,88,0.103,0.0,0.0 +2015,8,22,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.0,19.0,88,101282,818,1336,411,266,82,222,30375,5618,25488,9593,360,4.6,10,10,8047.0,244,0,919999999,64,0.2020,0,88,0.103,0.0,0.0 +2015,8,22,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.0,18.0,83,101282,986,1336,409,292,74,248,33999,5156,29040,11450,30,5.1,10,10,8047.0,366,0,919999999,58,0.2020,0,88,0.103,0.0,0.0 +2015,8,22,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.8,18.9,79,101887,1100,1336,421,420,106,337,48510,8032,39178,14951,30,6.2,10,10,8047.0,366,0,919999999,64,0.2020,0,88,0.103,0.0,0.0 +2015,8,22,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,18.9,82,101886,1152,1336,417,426,77,360,49312,5907,41953,15871,40,5.7,10,10,8047.0,427,0,919999999,64,0.2020,0,88,0.103,0.0,0.0 +2015,8,22,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,18.3,81,101876,1138,1336,414,458,82,388,52626,6607,44891,16611,40,3.6,10,10,8047.0,396,0,919999999,60,0.2020,0,88,0.103,0.0,0.0 +2015,8,22,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,18.3,81,101876,1059,1336,414,426,73,365,48619,5883,41937,15519,40,3.6,10,10,8047.0,396,0,919999999,60,0.2020,0,88,0.103,0.0,0.0 +2015,8,22,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.0,18.0,78,101282,920,1336,415,371,91,307,42027,7132,34994,12829,60,3.6,10,10,8047.0,457,0,919999999,58,0.2020,0,88,0.103,0.0,0.0 +2015,8,22,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.0,18.0,78,101282,732,1336,404,372,272,220,41899,19247,24913,8931,80,4.1,9,9,8047.0,1524,0,919999999,58,0.2020,0,88,0.103,0.0,0.0 +2015,8,22,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,18.3,81,101836,507,1336,402,296,249,184,32254,16382,20155,6259,70,3.6,9,9,8047.0,1524,0,919999999,60,0.2020,0,88,0.103,0.0,0.0 +2015,8,22,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,18.3,90,101816,260,1336,393,178,257,102,18921,8439,10893,2904,80,3.1,9,9,8047.0,1036,0,919999999,60,0.2020,0,88,0.103,0.0,0.0 +2015,8,22,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,18.3,90,101786,8,1336,393,59,122,32,5758,0,3142,186,30,1.5,9,9,8047.0,1524,0,919999999,60,0.2020,0,88,0.103,0.0,0.0 +2015,8,22,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,18.3,90,101786,0,45,371,0,0,0,0,0,0,0,30,1.5,5,5,8047.0,1524,9,999999999,60,0.2020,0,88,0.103,0.0,0.0 +2015,8,22,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.0,19.0,100,101281,0,0,400,0,0,0,0,0,0,0,80,2.1,10,10,8047.0,335,9,999999999,65,0.2020,0,88,0.103,0.0,0.0 +2015,8,22,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,19.0,19.0,100,101281,0,0,400,0,0,0,0,0,0,0,20,3.1,10,10,805.0,61,0,999999999,65,0.2020,0,88,0.103,0.0,0.0 +2015,8,22,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,19.4,18.9,97,101816,0,0,402,0,0,0,0,0,0,0,20,3.1,10,10,1600.0,61,0,999999999,64,0.2020,0,88,0.103,0.0,0.0 +2015,8,22,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.0,19.0,94,101281,0,0,405,0,0,0,0,0,0,0,340,3.6,10,10,1609.0,91,0,919999999,65,0.2020,0,88,0.103,0.0,0.0 +2015,8,23,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.0,20.0,100,101281,0,0,406,0,0,0,0,0,0,0,360,3.6,10,10,805.0,91,0,919999999,71,0.2010,0,88,0.103,0.0,0.0 +2015,8,23,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.0,20.0,100,101696,0,0,406,0,0,0,0,0,0,0,350,3.6,10,10,805.0,91,0,919999999,72,0.2010,0,88,0.103,0.0,0.0 +2015,8,23,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.0,19.4,96,101666,0,0,406,0,0,0,0,0,0,0,10,4.6,10,10,805.0,91,0,919999999,67,0.2010,0,88,0.103,0.0,0.0 +2015,8,23,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.0,19.4,96,101666,0,0,406,0,0,0,0,0,0,0,10,4.1,10,10,805.0,122,0,919999999,67,0.2010,0,88,0.103,0.0,0.0 +2015,8,23,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,20.0,19.4,96,101666,0,0,406,0,0,0,0,0,0,0,10,4.1,10,10,800.0,122,0,919999999,67,0.2010,0,88,0.103,0.0,0.0 +2015,8,23,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,19.4,100,101666,112,603,402,22,109,13,2570,0,1520,495,20,4.1,10,10,800.0,183,0,919999999,67,0.2010,0,88,0.103,0.0,0.0 +2015,8,23,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.0,19.0,100,101281,364,1337,400,135,380,42,15957,7884,4974,1782,20,4.1,10,10,800.0,122,0,919999999,65,0.2010,0,88,0.103,0.0,0.0 +2015,8,23,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,20.0,19.4,96,101646,604,1337,406,303,613,70,36391,26296,8430,3268,10,4.1,10,10,4800.0,122,0,919999999,67,0.2010,0,88,0.103,0.0,0.0 +2015,8,23,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.0,20.0,94,101282,815,1337,412,293,348,134,34757,19165,15962,6422,10,4.1,10,10,3219.0,122,0,919999999,71,0.2010,0,88,0.103,0.0,0.0 +2015,8,23,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.0,20.0,94,101282,983,1337,412,250,188,149,30202,10526,18081,7539,350,4.1,10,10,3219.0,183,0,919999999,71,0.2010,0,88,0.103,0.0,0.0 +2015,8,23,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,21.1,20.6,97,101646,1097,1337,413,176,3,173,21356,170,21094,8823,20,4.1,10,10,4000.0,183,0,919999999,76,0.2010,0,88,0.103,0.0,0.0 +2015,8,23,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.0,21.0,100,101282,1148,1337,413,201,6,195,24331,347,23728,9841,10,3.6,10,10,3219.0,122,0,919999999,79,0.2010,0,88,0.103,0.0,0.0 +2015,8,23,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.0,21.0,100,101282,1134,1337,413,239,10,230,28512,616,27592,11267,20,4.1,10,10,3219.0,213,0,919999999,79,0.2010,0,88,0.103,0.0,0.0 +2015,8,23,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,21.1,20.0,93,101536,1055,1337,412,232,9,223,27461,571,26540,10805,30,4.1,10,10,2800.0,213,0,919999999,71,0.2010,0,88,0.103,0.0,0.0 +2015,8,23,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.0,21.0,100,101282,916,1337,413,221,9,214,25666,571,24986,9884,30,5.1,10,10,2816.0,152,0,919999999,79,0.2010,0,88,0.103,0.0,0.0 +2015,8,23,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.0,21.0,100,101282,727,1337,413,177,4,174,20232,241,19987,7523,20,3.1,10,10,805.0,91,0,919999999,79,0.2010,0,88,0.103,0.0,0.0 +2015,8,23,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,21.1,20.6,97,101496,501,1337,413,212,171,133,23640,8815,14897,5088,20,3.6,10,10,800.0,91,0,919999999,76,0.2010,0,88,0.103,0.0,0.0 +2015,8,23,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.0,21.0,100,101282,254,1337,413,198,391,77,21441,7138,8372,2483,50,2.6,10,10,1609.0,91,0,919999999,79,0.2010,0,88,0.103,0.0,0.0 +2015,8,23,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.0,21.0,100,101282,288,1337,413,48,82,34,4600,0,3280,0,70,2.6,10,10,4828.0,152,0,919999999,79,0.2010,0,88,0.103,0.0,0.0 +2015,8,23,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,20.6,20.6,100,101406,0,9,410,0,0,0,0,0,0,0,40,2.6,10,10,4800.0,152,9,999999999,76,0.2010,0,88,0.103,0.0,0.0 +2015,8,23,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.0,20.0,100,101281,0,0,406,0,0,0,0,0,0,0,40,4.6,10,10,3219.0,152,9,999999999,71,0.2010,0,88,0.103,0.0,0.0 +2015,8,23,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.0,19.0,94,101281,0,0,405,0,0,0,0,0,0,0,40,3.1,10,10,1609.0,91,9,999999999,65,0.2010,0,88,0.103,0.0,0.0 +2015,8,23,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,20.0,20.0,100,101426,0,0,406,0,0,0,0,0,0,0,50,2.1,10,10,1600.0,91,9,999999999,71,0.2010,0,88,0.103,0.0,0.0 +2015,8,23,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.0,20.0,94,101282,0,0,412,0,0,0,0,0,0,0,10,1.5,10,10,1609.0,244,9,999999999,71,0.2010,0,88,0.103,0.0,0.0 +2015,8,24,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.0,20.0,94,101282,0,0,412,0,0,0,0,0,0,0,10,2.1,10,10,4828.0,152,9,999999999,71,0.2000,0,88,0.103,0.0,0.0 +2015,8,24,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,20.6,20.0,96,101346,0,0,410,0,0,0,0,0,0,0,32,0.0,10,10,4800.0,152,9,999999999,71,0.2000,0,88,0.103,0.0,0.0 +2015,8,24,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,20.0,96,101286,0,0,410,0,0,0,0,0,0,0,41,0.0,10,10,4800.0,152,9,999999999,71,0.2000,0,88,0.103,0.0,0.0 +2015,8,24,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.0,20.0,100,101281,0,0,406,0,0,0,0,0,0,0,30,2.1,10,10,4023.0,152,9,999999999,71,0.2000,0,88,0.103,0.0,0.0 +2015,8,24,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,20.0,20.0,100,101296,0,0,406,0,0,0,0,0,0,0,40,1.5,10,10,3200.0,152,9,999999999,71,0.2000,0,88,0.103,0.0,0.0 +2015,8,24,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.0,19.4,96,101336,107,579,406,21,85,14,2432,0,1623,525,50,2.1,10,10,1207.0,91,9,999999999,67,0.2000,0,88,0.103,0.0,0.0 +2015,8,24,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.0,20.0,100,101281,360,1337,406,25,0,25,2449,0,2468,1110,60,1.5,10,10,2414.0,91,9,999999999,71,0.2000,0,88,0.103,0.0,0.0 +2015,8,24,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,20.0,20.0,100,101366,600,1337,406,121,11,115,13963,557,13322,4974,6,0.0,10,10,2400.0,91,9,999999999,71,0.2000,0,88,0.103,0.0,0.0 +2015,8,24,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.0,21.0,94,101282,812,1337,419,244,177,150,28643,9929,17687,7044,130,3.1,10,10,2400.0,396,9,999999999,79,0.2000,0,88,0.103,0.0,0.0 +2015,8,24,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.0,20.0,88,101282,980,1337,406,259,177,165,31030,10247,19861,8218,150,3.6,9,9,2400.0,457,9,999999999,71,0.2000,0,88,0.103,0.0,0.0 +2015,8,24,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,20.0,87,101327,1094,1337,407,312,32,286,36425,2220,33594,13255,130,2.1,9,9,2400.0,457,9,999999999,71,0.2000,0,88,0.103,0.0,0.0 +2015,8,24,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.0,20.0,83,101282,1145,1337,423,255,19,239,30408,1207,28662,11644,130,3.1,10,10,2400.0,1402,9,999999999,71,0.2000,0,88,0.103,0.0,0.0 +2015,8,24,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,20.0,82,101247,1130,1337,425,379,54,332,43961,3954,38761,14912,120,3.1,10,10,2400.0,2134,9,999999999,71,0.2000,0,88,0.103,0.0,0.0 +2015,8,24,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.3,20.0,82,101247,1050,1337,413,566,227,384,64131,18394,43810,15946,120,3.1,9,9,2400.0,2134,9,999999999,71,0.2000,0,88,0.103,0.0,0.0 +2015,8,24,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,20.0,90,101167,911,1337,404,387,85,322,43509,6656,36434,13127,120,3.6,9,9,2400.0,1829,9,999999999,71,0.2000,0,88,0.103,0.0,0.0 +2015,8,24,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,20.0,82,101127,722,1337,413,167,17,154,19278,990,17858,6823,110,4.1,9,9,2400.0,1676,9,999999999,71,0.2000,0,88,0.103,0.0,0.0 +2015,8,24,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.3,20.0,82,101127,496,1337,390,243,315,123,27251,15702,13853,4786,110,4.1,5,5,2400.0,1676,9,999999999,71,0.2000,0,88,0.103,0.0,0.0 +2015,8,24,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,20.0,84,101097,248,1337,388,178,317,97,18874,8814,10333,2745,110,4.1,5,5,2400.0,77777,9,999999999,71,0.2000,0,88,0.103,0.0,0.0 +2015,8,24,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,20.6,97,101107,0,1312,379,0,0,0,0,0,0,0,130,3.1,5,5,2400.0,77777,9,999999999,75,0.2000,0,88,0.103,0.0,0.0 +2015,8,24,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,20.6,97,101107,0,0,379,0,0,0,0,0,0,0,130,3.1,5,5,2400.0,77777,9,999999999,75,0.2000,0,88,0.103,0.0,0.0 +2015,8,24,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,20.6,93,101177,0,0,383,0,0,0,0,0,0,0,200,4.6,5,5,2400.0,77777,9,999999999,75,0.2000,0,88,0.103,0.0,0.0 +2015,8,24,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,20.0,93,101187,0,0,379,0,0,0,0,0,0,0,190,4.1,5,5,2400.0,77777,9,999999999,71,0.2000,0,88,0.103,0.0,0.0 +2015,8,24,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,20.0,93,101187,0,0,401,0,0,0,0,0,0,0,190,4.1,9,9,2400.0,77777,9,999999999,71,0.2000,0,88,0.103,0.0,0.0 +2015,8,24,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.0,20.0,94,101282,0,0,401,0,0,0,0,0,0,0,210,3.1,9,9,2400.0,77777,9,999999999,71,0.2000,0,88,0.103,0.0,0.0 +2015,8,25,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,20.0,93,101187,0,0,401,0,0,0,0,0,0,0,190,2.6,9,9,2400.0,305,9,999999999,71,0.1990,0,88,0.103,0.0,0.0 +2015,8,25,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,20.0,93,101187,0,0,401,0,0,0,0,0,0,0,190,2.6,9,9,2400.0,305,9,999999999,71,0.1990,0,88,0.103,0.0,0.0 +2015,8,25,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,19.0,94,101281,0,0,366,0,0,0,0,0,0,0,180,0.0,3,3,2400.0,77777,9,999999999,65,0.1990,0,88,0.103,0.0,0.0 +2015,8,25,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.0,19.0,94,101281,0,0,351,0,0,0,0,0,0,0,180,2.1,0,0,3219.0,77777,0,999999999,65,0.1990,0,88,0.103,0.0,0.0 +2015,8,25,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,20.0,19.4,96,101156,0,0,406,0,0,0,0,0,0,0,170,2.1,10,10,1600.0,77777,0,999999999,67,0.1990,0,88,0.103,0.0,0.0 +2015,8,25,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.0,20.0,100,101281,103,556,373,17,49,14,1962,0,1618,521,140,1.5,5,5,6437.0,244,0,999999999,71,0.1990,0,88,0.103,0.0,0.0 +2015,8,25,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.0,20.0,100,101281,356,1338,395,92,124,65,10472,3222,7421,2556,110,3.6,9,9,1207.0,7620,0,999999999,71,0.1990,0,88,0.103,0.0,0.0 +2015,8,25,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,20.0,20.0,100,101186,597,1338,406,154,119,123,17662,6199,14164,5232,130,3.6,10,10,1200.0,7620,0,999999999,71,0.1990,0,88,0.103,0.0,0.0 +2015,8,25,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,22.0,21.0,94,101282,809,1338,419,190,61,167,22104,3570,19520,7670,110,4.1,10,10,1207.0,183,0,999999999,79,0.1990,0,88,0.103,0.0,0.0 +2015,8,25,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.0,21.0,89,101282,977,1338,425,272,34,248,31520,2258,28904,11393,100,3.1,10,10,1207.0,274,0,999999999,78,0.1990,0,88,0.103,0.0,0.0 +2015,8,25,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.8,21.1,90,101237,1090,1338,412,391,73,333,45022,5330,38596,14775,110,2.6,9,9,1207.0,274,0,999999999,79,0.1990,0,88,0.103,0.0,0.0 +2015,8,25,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,22.0,21.0,94,101282,1141,1338,419,387,59,338,44845,4267,39426,15143,80,5.7,10,10,1609.0,61,0,999999999,79,0.1990,0,88,0.103,0.0,0.0 +2015,8,25,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,22.0,21.0,94,101282,1126,1338,407,476,100,391,54403,7810,45001,16625,70,4.1,9,9,805.0,122,0,999999999,79,0.1990,0,88,0.103,0.0,0.0 +2015,8,25,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,24.4,21.7,85,101127,1046,1338,422,643,427,306,73997,30096,35438,13698,60,4.6,9,9,805.0,122,0,999999999,84,0.1990,0,88,0.103,0.0,0.0 +2015,8,25,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,21.7,91,101037,906,1338,392,568,392,286,64294,28129,32573,12124,80,5.7,5,5,805.0,77777,0,999999999,84,0.1990,0,88,0.103,0.0,0.0 +2015,8,25,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,21.7,82,100977,717,1338,401,535,632,154,61577,35455,17807,6798,100,5.1,5,5,805.0,77777,0,999999999,84,0.1990,0,88,0.103,0.0,0.0 +2015,8,25,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.0,21.7,82,100977,490,1338,401,373,557,120,41772,26073,13496,4673,100,5.1,5,5,805.0,77777,0,999999999,84,0.1990,0,88,0.103,0.0,0.0 +2015,8,25,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,18.9,62,100967,242,1338,407,200,400,80,21530,8302,8648,2466,190,5.7,5,5,805.0,77777,0,999999999,63,0.1990,0,88,0.103,0.0,0.0 +2015,8,25,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,18.3,64,101027,0,1277,400,0,0,0,0,0,0,0,200,5.1,5,5,805.0,77777,0,999999999,59,0.1990,0,88,0.103,0.0,0.0 +2015,8,25,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,19.4,74,101107,0,0,419,0,0,0,0,0,0,0,180,4.1,9,9,805.0,7620,9,999999999,67,0.1990,0,88,0.103,0.0,0.0 +2015,8,25,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,20.0,79,101137,0,0,428,0,0,0,0,0,0,0,180,4.1,10,10,805.0,1372,9,999999999,71,0.1990,0,88,0.103,0.0,0.0 +2015,8,25,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,20.6,87,101157,0,0,411,0,0,0,0,0,0,0,160,3.6,9,9,805.0,1189,9,999999999,75,0.1990,0,88,0.103,0.0,0.0 +2015,8,25,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.8,20.6,87,101157,0,0,382,0,0,0,0,0,0,0,160,3.6,3,3,805.0,1189,9,999999999,75,0.1990,0,88,0.103,0.0,0.0 +2015,8,25,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,20.6,93,101087,0,0,377,0,0,0,0,0,0,0,150,3.6,3,3,805.0,77777,9,999999999,75,0.1990,0,88,0.103,0.0,0.0 +2015,8,26,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,21.1,96,101097,0,0,383,0,0,0,0,0,0,0,150,3.6,5,5,805.0,77777,9,999999999,79,0.1980,0,88,0.103,0.0,0.0 +2015,8,26,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,21.1,96,101097,0,0,377,0,0,0,0,0,0,0,150,3.6,3,3,805.0,77777,9,999999999,79,0.1980,0,88,0.103,0.0,0.0 +2015,8,26,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,20.6,97,101047,0,0,358,0,0,0,0,0,0,0,170,2.1,0,0,805.0,77777,9,999999999,75,0.1980,0,88,0.103,0.0,0.0 +2015,8,26,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,20.0,93,101067,0,0,379,0,0,0,0,0,0,0,220,1.5,5,5,805.0,77777,9,999999999,71,0.1980,0,88,0.103,0.0,0.0 +2015,8,26,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,20.0,93,101067,0,0,401,0,0,0,0,0,0,0,220,1.5,9,9,805.0,77777,9,999999999,71,0.1980,0,88,0.103,0.0,0.0 +2015,8,26,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.0,21.0,100,101282,99,533,413,16,41,13,1850,0,1505,486,150,1.5,10,10,805.0,335,9,999999999,79,0.1980,0,88,0.103,0.0,0.0 +2015,8,26,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.0,21.0,94,101282,353,1338,419,52,61,41,6125,1015,4839,1729,258,3.1,10,10,805.0,396,0,919999999,79,0.1980,0,88,0.103,0.0,0.0 +2015,8,26,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,22.2,21.1,93,101167,593,1338,386,282,470,102,32760,21910,11893,4487,270,3.6,5,5,9000.0,396,0,919999999,79,0.1980,0,88,0.103,0.0,0.0 +2015,8,26,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,21.0,78,101282,805,1338,424,462,632,126,54905,33317,15035,6062,276,0.0,9,9,9000.0,884,0,919999999,78,0.1980,0,88,0.103,0.0,0.0 +2015,8,26,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.0,20.0,70,101282,974,1338,405,499,546,136,60602,29787,16586,6937,230,3.6,5,5,9000.0,77777,0,919999999,71,0.1980,0,88,0.103,0.0,0.0 +2015,8,26,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,26.1,20.0,69,101177,1087,1338,405,625,617,134,77225,33009,16627,7037,250,3.6,5,5,9000.0,77777,0,919999999,71,0.1980,0,88,0.103,0.0,0.0 +2015,8,26,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,17.2,53,101148,1138,1338,411,822,835,134,89120,87617,17703,4283,243,2.6,5,5,9000.0,77777,0,919999999,53,0.1980,0,88,0.103,0.0,0.0 +2015,8,26,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,15.6,46,101118,1122,1338,411,839,843,132,90499,88001,17494,4050,240,3.6,5,5,9000.0,77777,0,919999999,45,0.1980,0,88,0.103,0.0,0.0 +2015,8,26,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,28.3,15.6,46,101118,1042,1338,411,796,829,131,98275,48122,16239,6838,240,3.6,5,5,9000.0,77777,0,919999999,45,0.1980,0,88,0.103,0.0,0.0 +2015,8,26,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,14.4,43,101078,902,1338,410,702,805,122,85431,47310,14904,6147,260,3.6,5,5,9000.0,77777,0,919999999,40,0.1980,0,88,0.103,0.0,0.0 +2015,8,26,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,14.4,45,101088,712,1338,404,343,222,186,39117,15311,21316,7805,270,4.1,5,5,9000.0,77777,0,919999999,40,0.1980,0,88,0.103,0.0,0.0 +2015,8,26,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,27.2,14.4,45,101088,484,1338,428,253,313,139,28153,18406,15536,5136,270,4.1,9,9,9000.0,77777,0,919999999,40,0.1980,0,88,0.103,0.0,0.0 +2015,8,26,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,13.3,44,101117,235,1338,400,149,310,84,16010,8404,9064,2486,280,5.1,5,5,9000.0,77777,0,919999999,36,0.1980,0,88,0.103,0.0,0.0 +2015,8,26,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,13.9,50,101187,0,1243,392,0,0,0,0,0,0,0,280,5.1,5,5,9000.0,77777,0,919999999,38,0.1980,0,88,0.103,0.0,0.0 +2015,8,26,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.0,13.9,50,101187,0,0,386,0,0,0,0,0,0,0,280,5.1,3,3,9000.0,77777,9,999999999,38,0.1980,0,88,0.103,0.0,0.0 +2015,8,26,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,13.9,55,101297,0,0,377,0,0,0,0,0,0,0,270,4.6,3,3,9000.0,77777,9,999999999,39,0.1980,0,88,0.103,0.0,0.0 +2015,8,26,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,13.9,57,101347,0,0,403,0,0,0,0,0,0,0,280,4.1,9,9,9000.0,2134,9,999999999,39,0.1980,0,88,0.103,0.0,0.0 +2015,8,26,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.8,13.9,57,101347,0,0,403,0,0,0,0,0,0,0,280,4.1,9,9,9000.0,2134,9,999999999,39,0.1980,0,88,0.103,0.0,0.0 +2015,8,26,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,13.3,59,101357,0,0,353,0,0,0,0,0,0,0,290,4.6,0,0,9000.0,77777,9,999999999,36,0.1980,0,88,0.103,0.0,0.0 +2015,8,27,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,13.3,63,101356,0,0,348,0,0,0,0,0,0,0,290,4.1,0,0,9000.0,77777,9,999999999,36,0.1970,0,88,0.103,0.0,0.0 +2015,8,27,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.6,13.3,63,101356,0,0,348,0,0,0,0,0,0,0,290,4.1,0,0,9000.0,77777,9,999999999,36,0.1970,0,88,0.103,0.0,0.0 +2015,8,27,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,13.3,68,101316,0,0,342,0,0,0,0,0,0,0,280,5.1,0,0,9000.0,77777,9,999999999,37,0.1970,0,88,0.103,0.0,0.0 +2015,8,27,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,12.8,68,101336,0,0,339,0,0,0,0,0,0,0,280,4.6,0,0,9000.0,77777,9,999999999,35,0.1970,0,88,0.103,0.0,0.0 +2015,8,27,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.9,12.8,68,101336,0,0,354,0,0,0,0,0,0,0,280,4.6,3,3,9000.0,77777,9,999999999,35,0.1970,0,88,0.103,0.0,0.0 +2015,8,27,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,12.2,63,101436,95,509,355,19,102,12,2221,0,1404,450,310,4.1,3,3,9000.0,77777,9,999999999,33,0.1970,0,88,0.103,0.0,0.0 +2015,8,27,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,12.2,59,101476,349,1339,367,129,373,42,15260,9297,4978,1760,300,5.1,5,5,9000.0,77777,9,999999999,33,0.1970,0,88,0.103,0.0,0.0 +2015,8,27,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.6,12.2,59,101476,590,1339,367,298,615,71,35844,30192,8563,3282,300,5.1,5,5,9000.0,77777,9,999999999,33,0.1970,0,88,0.103,0.0,0.0 +2015,8,27,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,12.2,50,101517,802,1339,381,480,750,87,59055,41692,10736,4367,300,4.1,5,5,9000.0,77777,9,999999999,33,0.1970,0,88,0.103,0.0,0.0 +2015,8,27,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,12.2,45,101527,970,1339,389,641,827,95,69139,85385,13199,2498,310,4.1,5,5,9000.0,77777,9,999999999,32,0.1970,0,88,0.103,0.0,0.0 +2015,8,27,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.0,12.2,45,101527,1084,1339,389,765,875,97,82441,90670,13175,3148,310,4.1,5,5,9000.0,77777,9,999999999,32,0.1970,0,88,0.103,0.0,0.0 +2015,8,27,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,11.7,39,101457,1134,1339,398,837,897,99,90008,92938,13295,3612,270,3.6,5,5,9000.0,77777,9,999999999,31,0.1970,0,88,0.103,0.0,0.0 +2015,8,27,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,12.8,40,101427,1118,1339,405,714,558,247,85093,39969,29602,11897,260,4.6,5,5,9000.0,77777,9,999999999,34,0.1970,0,88,0.103,0.0,0.0 +2015,8,27,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,27.8,12.8,40,101427,1037,1339,405,486,282,250,57196,20721,29586,11750,260,4.6,5,5,9000.0,77777,9,999999999,34,0.1970,0,88,0.103,0.0,0.0 +2015,8,27,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,12.8,44,101387,897,1339,419,427,130,332,48060,11292,37605,13212,280,5.7,9,9,9000.0,2743,9,999999999,34,0.1970,0,88,0.103,0.0,0.0 +2015,8,27,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,12.8,45,101417,706,1339,393,330,113,264,36577,9367,29432,9725,300,5.7,5,5,9000.0,77777,9,999999999,34,0.1970,0,88,0.103,0.0,0.0 +2015,8,27,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.6,12.8,45,101417,478,1339,393,329,494,133,36729,28877,14912,4952,300,5.7,5,5,9000.0,77777,9,999999999,34,0.1970,0,88,0.103,0.0,0.0 +2015,8,27,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,11.1,42,101507,229,1339,388,202,470,67,22095,9284,7355,2163,290,5.7,5,5,9000.0,77777,9,999999999,29,0.1970,0,88,0.103,0.0,0.0 +2015,8,27,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,11.1,45,101577,0,1208,382,0,0,0,0,0,0,0,280,5.1,5,5,9000.0,77777,9,999999999,29,0.1970,0,88,0.103,0.0,0.0 +2015,8,27,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.9,11.1,45,101577,0,0,376,0,0,0,0,0,0,0,280,5.1,3,3,9000.0,77777,9,999999999,29,0.1970,0,88,0.103,0.0,0.0 +2015,8,27,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,12.2,53,101717,0,0,369,0,0,0,0,0,0,0,320,3.1,3,3,9000.0,77777,9,999999999,33,0.1970,0,88,0.103,0.0,0.0 +2015,8,27,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,12.2,55,101746,0,0,367,0,0,0,0,0,0,0,320,4.6,3,3,9000.0,77777,9,999999999,33,0.1970,0,88,0.103,0.0,0.0 +2015,8,27,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,12.2,55,101746,0,0,367,0,0,0,0,0,0,0,320,4.6,3,3,9000.0,77777,9,999999999,33,0.1970,0,88,0.103,0.0,0.0 +2015,8,27,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,12.2,61,101796,0,0,344,0,0,0,0,0,0,0,280,3.6,0,0,9000.0,77777,9,999999999,33,0.1970,0,88,0.103,0.0,0.0 +2015,8,28,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,12.2,65,101806,0,0,338,0,0,0,0,0,0,0,290,3.6,0,0,9000.0,77777,9,999999999,33,0.1960,0,88,0.103,0.0,0.0 +2015,8,28,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.9,12.2,65,101806,0,0,338,0,0,0,0,0,0,0,290,3.6,0,0,9000.0,77777,9,999999999,33,0.1960,0,88,0.103,0.0,0.0 +2015,8,28,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,12.2,68,101856,0,0,336,0,0,0,0,0,0,0,300,4.1,0,0,9000.0,77777,9,999999999,33,0.1960,0,88,0.103,0.0,0.0 +2015,8,28,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,11.7,65,101866,0,0,335,0,0,0,0,0,0,0,310,3.1,0,0,9000.0,77777,9,999999999,31,0.1960,0,88,0.103,0.0,0.0 +2015,8,28,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.3,11.7,65,101866,0,0,350,0,0,0,0,0,0,0,310,3.1,3,3,9000.0,77777,9,999999999,31,0.1960,0,88,0.103,0.0,0.0 +2015,8,28,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,12.2,68,101956,91,486,350,19,123,11,2229,0,1291,415,310,3.6,3,3,9000.0,77777,9,999999999,33,0.1960,0,88,0.103,0.0,0.0 +2015,8,28,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,12.2,65,102006,345,1340,353,131,411,37,15631,9367,4422,1569,330,3.6,3,3,9000.0,77777,9,999999999,33,0.1960,0,88,0.103,0.0,0.0 +2015,8,28,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.9,12.2,65,102006,586,1340,353,302,658,63,36628,31190,7659,2944,330,3.6,3,3,9000.0,77777,9,999999999,33,0.1960,0,88,0.103,0.0,0.0 +2015,8,28,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,12.8,55,102046,798,1340,370,485,780,79,52660,79883,11432,1841,20,1.5,3,3,9000.0,77777,9,999999999,35,0.1960,0,88,0.103,0.0,0.0 +2015,8,28,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,13.3,59,102076,967,1340,374,645,844,90,69890,87394,12558,2426,140,2.1,5,5,9000.0,77777,9,999999999,37,0.1960,0,88,0.103,0.0,0.0 +2015,8,28,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,13.3,59,102076,1080,1340,374,766,882,96,82823,91636,13063,3102,140,2.1,5,5,9000.0,77777,9,999999999,37,0.1960,0,88,0.103,0.0,0.0 +2015,8,28,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,13.3,53,102027,1130,1340,382,837,900,100,90372,93589,13441,3592,110,4.1,5,5,9000.0,77777,9,999999999,36,0.1960,0,88,0.103,0.0,0.0 +2015,8,28,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,12.8,52,101997,1114,1340,381,851,904,100,91763,93857,13481,3444,110,4.1,5,5,9000.0,77777,9,999999999,35,0.1960,0,88,0.103,0.0,0.0 +2015,8,28,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.3,12.8,52,101997,1033,1340,381,808,893,98,87204,92524,13438,2839,110,4.1,5,5,9000.0,77777,9,999999999,35,0.1960,0,88,0.103,0.0,0.0 +2015,8,28,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,13.9,55,101917,892,1340,383,709,862,95,76834,89013,13397,2201,130,5.1,5,5,9000.0,77777,9,999999999,39,0.1960,0,88,0.103,0.0,0.0 +2015,8,28,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,15.0,64,101886,701,1340,378,565,807,89,68080,42539,10758,4252,110,6.2,5,5,9000.0,77777,9,999999999,43,0.1960,0,88,0.103,0.0,0.0 +2015,8,28,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,15.0,64,101886,472,1340,373,389,709,77,45238,30519,8982,3253,110,6.2,3,3,9000.0,77777,9,999999999,43,0.1960,0,88,0.103,0.0,0.0 +2015,8,28,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,16.7,73,101926,223,1340,378,203,526,56,22383,4735,6195,1901,110,2.6,5,5,9000.0,77777,9,999999999,51,0.1960,0,88,0.103,0.0,0.0 +2015,8,28,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,16.1,73,101966,0,1172,374,0,0,0,0,0,0,0,130,3.6,5,5,9000.0,77777,9,999999999,48,0.1960,0,88,0.103,0.0,0.0 +2015,8,28,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,16.1,73,101966,0,0,368,0,0,0,0,0,0,0,130,3.6,3,3,9000.0,77777,9,999999999,48,0.1960,0,88,0.099,0.0,0.0 +2015,8,28,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,15.6,73,102046,0,0,365,0,0,0,0,0,0,0,200,2.6,3,3,9000.0,77777,9,999999999,46,0.1960,0,88,0.099,0.0,0.0 +2015,8,28,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,15.0,66,102096,0,0,370,0,0,0,0,0,0,0,230,3.1,3,3,9000.0,77777,9,999999999,43,0.1960,0,88,0.099,0.0,0.0 +2015,8,28,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,15.0,66,102096,0,0,370,0,0,0,0,0,0,0,230,3.1,3,3,9000.0,77777,9,999999999,43,0.1960,0,88,0.099,0.0,0.0 +2015,8,28,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,13.9,68,102116,0,0,360,0,0,0,0,0,0,0,220,2.1,3,3,9000.0,77777,9,999999999,39,0.1960,0,88,0.099,0.0,0.0 +2015,8,29,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,14.4,75,102086,0,0,341,0,0,0,0,0,0,0,210,2.1,0,0,9000.0,77777,9,999999999,41,0.1950,0,88,0.099,0.0,0.0 +2015,8,29,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.9,14.4,75,102086,0,0,341,0,0,0,0,0,0,0,210,2.1,0,0,9000.0,77777,9,999999999,41,0.1950,0,88,0.099,0.0,0.0 +2015,8,29,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,13.9,78,102056,0,0,335,0,0,0,0,0,0,0,309,0.0,0,0,9000.0,77777,9,999999999,39,0.1950,0,88,0.099,0.0,0.0 +2015,8,29,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,13.9,76,102076,0,0,337,0,0,0,0,0,0,0,270,1.5,0,0,9000.0,77777,9,999999999,39,0.1950,0,88,0.099,0.0,0.0 +2015,8,29,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.3,13.9,76,102076,0,0,352,0,0,0,0,0,0,0,270,1.5,3,3,9000.0,77777,9,999999999,39,0.1950,0,88,0.099,0.0,0.0 +2015,8,29,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,12.8,68,102166,86,462,354,16,87,11,1870,0,1287,412,270,3.1,3,3,9000.0,77777,9,999999999,35,0.1950,0,88,0.099,0.0,0.0 +2015,8,29,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,13.3,61,102176,341,1340,365,124,352,44,14571,8378,5181,1821,293,0.0,3,3,9000.0,77777,9,999999999,37,0.1950,0,88,0.099,0.0,0.0 +2015,8,29,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,13.3,61,102176,583,1340,350,292,597,74,34934,29027,8877,3388,274,0.0,0,0,9000.0,77777,9,999999999,37,0.1950,0,88,0.099,0.0,0.0 +2015,8,29,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,11.7,45,102187,795,1340,364,474,734,94,57925,41755,11524,4666,280,3.1,0,0,9000.0,77777,9,999999999,31,0.1950,0,88,0.099,0.0,0.0 +2015,8,29,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,11.7,42,102167,963,1340,386,635,806,107,78875,47329,13337,5581,240,5.7,3,3,9000.0,77777,9,999999999,31,0.1950,0,88,0.099,0.0,0.0 +2015,8,29,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.6,11.7,42,102167,1076,1340,392,756,848,114,80983,87645,15358,3343,240,5.7,5,5,9000.0,77777,9,999999999,31,0.1950,0,88,0.099,0.0,0.0 +2015,8,29,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,12.2,42,102067,1127,1340,389,728,574,265,86411,42338,31636,12590,250,4.6,3,3,9000.0,77777,9,999999999,33,0.1950,0,88,0.099,0.0,0.0 +2015,8,29,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,12.2,41,102007,1110,1340,422,715,489,310,83644,38505,36489,14116,250,5.7,9,9,9000.0,8230,9,999999999,32,0.1950,0,88,0.099,0.0,0.0 +2015,8,29,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,26.7,12.2,41,102007,1028,1340,422,677,489,290,78664,38421,33898,13073,250,5.7,9,9,9000.0,8230,9,999999999,32,0.1950,0,88,0.099,0.0,0.0 +2015,8,29,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,12.2,39,101867,887,1340,425,606,529,234,70051,39657,27195,10390,210,3.6,9,9,9000.0,8230,9,999999999,32,0.1950,0,88,0.099,0.0,0.0 +2015,8,29,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,11.7,39,101817,695,1340,421,489,530,179,55856,37074,20544,7489,260,5.1,9,9,9000.0,8534,9,999999999,31,0.1950,0,88,0.099,0.0,0.0 +2015,8,29,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,26.7,11.7,39,101817,466,1340,421,320,404,135,35594,23984,15082,4926,260,5.1,9,9,9000.0,8534,9,999999999,31,0.1950,0,88,0.099,0.0,0.0 +2015,8,29,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,12.2,43,101807,216,1340,416,179,396,76,19247,8678,8205,2242,280,4.6,9,9,9000.0,8534,9,999999999,33,0.1950,0,88,0.099,0.0,0.0 +2015,8,29,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,12.2,45,101827,0,1137,412,0,0,0,0,0,0,0,250,3.1,9,9,9000.0,8534,9,999999999,33,0.1950,0,88,0.099,0.0,0.0 +2015,8,29,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.0,12.2,45,101827,0,0,389,0,0,0,0,0,0,0,250,3.1,5,5,9000.0,8534,9,999999999,33,0.1950,0,88,0.099,0.0,0.0 +2015,8,29,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,13.3,51,101847,0,0,385,0,0,0,0,0,0,0,250,3.1,5,5,9000.0,77777,9,999999999,36,0.1950,0,88,0.099,0.0,0.0 +2015,8,29,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,14.4,66,101856,0,0,372,0,0,0,0,0,0,0,180,3.6,5,5,9000.0,77777,9,999999999,41,0.1950,0,88,0.099,0.0,0.0 +2015,8,29,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,14.4,66,101856,0,0,394,0,0,0,0,0,0,0,180,3.6,9,9,9000.0,77777,9,999999999,41,0.1950,0,88,0.099,0.0,0.0 +2015,8,29,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,15.0,66,101826,0,0,409,0,0,0,0,0,0,0,240,4.1,10,10,9000.0,7315,9,999999999,43,0.1950,0,88,0.099,0.0,0.0 +2015,8,30,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,15.6,68,101786,0,0,399,0,0,0,0,0,0,0,240,6.2,9,9,9000.0,7315,9,999999999,46,0.1940,0,88,0.099,0.0,0.0 +2015,8,30,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,15.6,68,101786,0,0,399,0,0,0,0,0,0,0,240,6.2,9,9,9000.0,7315,9,999999999,46,0.1940,0,88,0.099,0.0,0.0 +2015,8,30,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,15.6,71,101736,0,0,396,0,0,0,0,0,0,0,240,5.7,9,9,9000.0,7315,9,999999999,46,0.1940,0,88,0.099,0.0,0.0 +2015,8,30,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,16.1,73,101726,0,0,396,0,0,0,0,0,0,0,240,4.6,9,9,9000.0,7620,9,999999999,48,0.1940,0,88,0.099,0.0,0.0 +2015,8,30,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,16.1,73,101726,0,0,396,0,0,0,0,0,0,0,240,4.6,9,9,9000.0,7620,9,999999999,48,0.1940,0,88,0.099,0.0,0.0 +2015,8,30,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,17.2,81,101766,82,439,373,12,32,10,1404,0,1171,376,240,5.1,5,5,9000.0,77777,9,999999999,54,0.1940,0,88,0.099,0.0,0.0 +2015,8,30,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,17.2,76,101786,337,1341,401,94,166,58,10762,4090,6659,2285,230,3.1,9,9,9000.0,7620,9,999999999,54,0.1940,0,88,0.099,0.0,0.0 +2015,8,30,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,17.2,76,101786,579,1341,378,252,375,112,29080,19738,12974,4788,230,3.1,5,5,9000.0,7620,9,999999999,54,0.1940,0,88,0.099,0.0,0.0 +2015,8,30,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,17.2,62,101787,791,1341,396,421,504,154,49316,30777,18120,7109,270,2.6,5,5,9000.0,77777,9,999999999,54,0.1940,0,88,0.099,0.0,0.0 +2015,8,30,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,16.7,51,101757,960,1341,410,563,553,202,66381,36545,23939,9627,290,2.6,5,5,9000.0,77777,9,999999999,51,0.1940,0,88,0.099,0.0,0.0 +2015,8,30,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,27.8,16.7,51,101757,1073,1341,434,606,427,287,70703,31400,33687,13195,290,2.6,9,9,9000.0,77777,9,999999999,51,0.1940,0,88,0.099,0.0,0.0 +2015,8,30,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.0,15.6,42,101688,1123,1341,446,522,280,303,61136,21020,35706,13923,270,4.1,9,9,9000.0,2134,9,999999999,45,0.1940,0,88,0.099,0.0,0.0 +2015,8,30,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.6,16.1,42,101618,1106,1341,450,623,312,367,71668,25480,42501,15842,250,3.1,9,9,9000.0,7620,9,999999999,48,0.1940,0,88,0.099,0.0,0.0 +2015,8,30,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,30.6,16.1,42,101618,1024,1341,450,561,252,363,63801,21111,41557,15164,250,3.1,9,9,9000.0,7620,9,999999999,48,0.1940,0,88,0.099,0.0,0.0 +2015,8,30,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.0,15.0,40,101528,881,1341,445,466,209,321,52365,17610,36299,12785,270,5.1,9,9,9000.0,2286,9,999999999,43,0.1940,0,88,0.099,0.0,0.0 +2015,8,30,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.0,14.4,39,101478,689,1341,444,427,339,232,47615,26039,26013,8861,290,4.1,9,9,9000.0,7620,9,999999999,40,0.1940,0,88,0.099,0.0,0.0 +2015,8,30,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,30.0,14.4,39,101478,460,1341,444,289,305,159,31602,19260,17471,5386,290,4.1,9,9,9000.0,7620,9,999999999,40,0.1940,0,88,0.099,0.0,0.0 +2015,8,30,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,15.0,44,101497,209,1341,435,141,156,96,14782,4619,10113,2379,270,4.6,9,9,9000.0,6096,9,999999999,43,0.1940,0,88,0.099,0.0,0.0 +2015,8,30,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,16.1,49,101537,0,1101,434,0,0,0,0,0,0,0,280,2.6,9,9,9000.0,6096,9,999999999,48,0.1940,0,88,0.099,0.0,0.0 +2015,8,30,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,27.8,16.1,49,101537,0,0,434,0,0,0,0,0,0,0,280,2.6,9,9,9000.0,6096,9,999999999,48,0.1940,0,88,0.099,0.0,0.0 +2015,8,30,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,18.3,71,101587,0,0,414,0,0,0,0,0,0,0,160,2.6,9,9,9000.0,2286,9,999999999,60,0.1940,0,88,0.099,0.0,0.0 +2015,8,30,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,17.2,60,101557,0,0,377,0,0,0,0,0,0,0,240,3.6,0,0,9000.0,77777,9,999999999,53,0.1940,0,88,0.099,0.0,0.0 +2015,8,30,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.6,17.2,60,101557,0,0,423,0,0,0,0,0,0,0,240,3.6,9,9,9000.0,77777,9,999999999,53,0.1940,0,88,0.099,0.0,0.0 +2015,8,30,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,18.3,69,101537,0,0,394,0,0,0,0,0,0,0,240,3.6,5,5,9000.0,77777,9,999999999,60,0.1940,0,88,0.099,0.0,0.0 +2015,8,31,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,18.3,74,101497,0,0,388,0,0,0,0,0,0,0,230,2.6,5,5,9000.0,77777,9,999999999,60,0.1930,0,88,0.099,0.0,0.0 +2015,8,31,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,18.3,76,101467,0,0,364,0,0,0,0,0,0,0,250,2.1,0,0,9000.0,77777,9,999999999,60,0.1930,0,88,0.099,0.0,0.0 +2015,8,31,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,18.3,76,101427,0,0,380,0,0,0,0,0,0,0,220,3.6,3,3,9000.0,77777,9,999999999,60,0.1930,0,88,0.099,0.0,0.0 +2015,8,31,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,18.3,81,101427,0,0,374,0,0,0,0,0,0,0,220,2.6,3,3,9000.0,77777,9,999999999,60,0.1930,0,88,0.099,0.0,0.0 +2015,8,31,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,18.3,81,101427,0,0,380,0,0,0,0,0,0,0,220,2.6,5,5,9000.0,77777,9,999999999,60,0.1930,0,88,0.099,0.0,0.0 +2015,8,31,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,18.3,74,101447,78,415,411,12,37,9,1409,0,1058,340,270,4.1,9,9,9000.0,3048,9,999999999,60,0.1930,0,88,0.099,0.0,0.0 +2015,8,31,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,18.9,71,101437,333,1342,395,89,149,58,10160,3337,6640,2275,280,3.1,5,5,9000.0,77777,9,999999999,63,0.1930,0,88,0.099,0.0,0.0 +2015,8,31,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,24.4,18.9,71,101437,575,1342,395,258,434,99,29992,20911,11549,4319,280,3.1,5,5,9000.0,77777,9,999999999,63,0.1930,0,88,0.099,0.0,0.0 +2015,8,31,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,17.8,56,101437,788,1342,408,429,557,141,50539,32633,16681,6598,280,4.6,5,5,9000.0,77777,9,999999999,57,0.1930,0,88,0.099,0.0,0.0 +2015,8,31,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,17.8,51,101418,956,1342,418,574,609,173,68387,37498,20709,8466,260,4.6,5,5,9000.0,77777,9,999999999,56,0.1930,0,88,0.099,0.0,0.0 +2015,8,31,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,28.9,17.8,51,101418,1069,1342,418,625,463,282,72905,33340,33093,13006,260,4.6,5,5,9000.0,77777,9,999999999,56,0.1930,0,88,0.099,0.0,0.0 +2015,8,31,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,31.1,17.8,45,101268,1119,1342,430,611,307,365,70340,24392,42302,15845,240,5.7,5,5,9000.0,77777,9,999999999,56,0.1930,0,88,0.099,0.0,0.0 +2015,8,31,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,31.1,16.1,40,101218,1101,1342,428,573,220,392,65523,18573,45133,16494,270,8.8,5,5,9000.0,77777,9,999999999,47,0.1930,0,88,0.099,0.0,0.0 +2015,8,31,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,31.1,16.1,40,101218,1019,1342,453,585,320,332,66954,25744,38241,14282,270,8.8,9,9,9000.0,77777,9,999999999,47,0.1930,0,88,0.099,0.0,0.0 +2015,8,31,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,31.1,17.2,43,101098,876,1342,455,532,338,286,60177,26311,32546,11852,280,6.7,9,9,9000.0,7620,9,999999999,53,0.1930,0,88,0.099,0.0,0.0 +2015,8,31,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,31.1,16.7,42,101078,684,1342,428,451,402,227,50228,29774,25420,8691,280,8.2,5,5,9000.0,77777,9,999999999,50,0.1930,0,88,0.099,0.0,0.0 +2015,8,31,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,31.1,16.7,42,101078,454,1342,428,315,337,167,34179,21244,18213,5470,280,8.2,5,5,9000.0,77777,9,999999999,50,0.1930,0,88,0.099,0.0,0.0 +2015,8,31,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.6,15.6,40,101138,203,1342,424,145,169,93,15187,4572,9787,2295,280,6.7,5,5,9000.0,77777,9,999999999,45,0.1930,0,88,0.099,0.0,0.0 +2015,8,31,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,16.5,50,101233,0,1065,409,0,0,0,0,0,0,0,272,5.2,3,3,9000.0,77777,9,999999999,50,0.1930,0,88,0.099,0.0,0.0 +2015,8,31,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,27.1,16.8,53,101257,0,0,392,0,0,0,0,0,0,0,275,5.1,0,0,9000.0,77777,9,999999999,51,0.1930,0,88,0.099,0.0,0.0 +2015,8,31,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,17.1,58,101315,0,0,384,0,0,0,0,0,0,0,287,4.9,0,0,9000.0,77777,9,999999999,53,0.1930,0,88,0.099,0.0,0.0 +2015,8,31,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.8,16.7,64,101554,0,0,379,0,0,0,0,0,0,0,249,3.3,0,0,9000.0,77777,9,999999999,51,0.1930,0,88,0.099,0.0,0.0 +2015,8,31,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,16.1,71,101789,0,0,379,0,0,0,0,0,0,0,206,2.2,0,0,9000.0,77777,9,999999999,48,0.1930,0,88,0.099,0.0,0.0 +2015,8,31,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.6,15.7,78,102034,0,0,373,0,0,0,0,0,0,0,149,1.7,0,0,9000.0,77777,9,999999999,47,0.1930,0,88,0.099,0.0,0.0 +2011,9,1,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.6,15.0,84,102241,0,0,356,0,0,0,0,0,0,0,89,1.4,5,5,8047.0,77777,9,999999999,44,0.1920,0,88,0.096,0.0,0.0 +2011,9,1,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.5,14.9,84,102246,0,0,377,0,0,0,0,0,0,0,79,2.2,9,9,8047.0,77777,9,999999999,43,0.1920,0,88,0.096,0.0,0.0 +2011,9,1,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.5,14.9,84,102261,0,0,389,0,0,0,0,0,0,0,75,2.2,10,10,8047.0,1676,9,999999999,43,0.1920,0,88,0.096,0.0,0.0 +2011,9,1,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.6,14.7,83,102271,0,0,374,0,0,0,0,0,0,0,80,2.3,9,9,8047.0,2134,9,999999999,42,0.1920,0,88,0.096,0.0,0.0 +2011,9,1,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.9,14.9,82,102286,0,0,374,0,0,0,0,0,0,0,78,2.3,9,9,8047.0,2134,9,999999999,43,0.1920,0,88,0.096,0.0,0.0 +2011,9,1,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.4,15.1,81,102311,73,392,356,6,0,6,576,0,580,234,80,2.2,5,5,8047.0,77777,9,999999999,44,0.1920,0,88,0.096,0.0,0.0 +2011,9,1,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,15.0,81,102306,329,1342,359,41,0,41,4026,0,4057,1695,70,3.1,5,5,8047.0,77777,9,999999999,44,0.1920,0,88,0.096,0.0,0.0 +2011,9,1,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,15.0,81,102306,572,1342,339,184,143,125,21050,8161,14359,5184,70,3.1,0,0,8047.0,77777,9,999999999,44,0.1920,0,88,0.096,0.0,0.0 +2011,9,1,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,15.6,79,102346,784,1342,344,385,417,155,45074,26163,18227,7114,90,2.6,0,0,8047.0,77777,9,999999999,46,0.1920,0,88,0.096,0.0,0.0 +2011,9,1,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,15.0,70,102346,953,1342,349,602,719,129,73459,42365,15804,6570,80,2.1,0,0,8047.0,77777,9,999999999,44,0.1920,0,88,0.096,0.0,0.0 +2011,9,1,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,15.0,70,102346,1065,1342,365,740,837,113,80046,87206,15291,3230,80,2.1,3,3,8047.0,77777,9,999999999,44,0.1920,0,88,0.096,0.0,0.0 +2011,9,1,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,13.9,61,102246,1115,1342,369,810,862,116,87238,89640,15514,3709,80,4.6,3,3,8047.0,77777,9,999999999,39,0.1920,0,88,0.096,0.0,0.0 +2011,9,1,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,12.8,57,102226,1097,1342,367,824,864,118,88429,89548,15813,3563,70,4.1,3,3,8047.0,77777,9,999999999,35,0.1920,0,88,0.096,0.0,0.0 +2011,9,1,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,12.8,57,102226,1014,1342,395,776,836,125,95900,50010,15508,6508,70,4.1,9,9,8047.0,77777,9,999999999,35,0.1920,0,88,0.096,0.0,0.0 +2011,9,1,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,14.4,68,102176,871,1342,391,589,506,229,67911,36930,26546,10123,80,4.1,9,9,8047.0,8534,9,999999999,41,0.1920,0,88,0.096,0.0,0.0 +2011,9,1,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,15.6,79,102146,678,1342,387,399,277,237,44266,21294,26441,8861,80,5.1,9,9,8047.0,8534,9,999999999,46,0.1920,0,88,0.096,0.0,0.0 +2011,9,1,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,19.4,15.6,79,102146,447,1342,387,253,295,133,27958,16312,14763,4759,80,5.1,9,9,8047.0,8534,9,999999999,46,0.1920,0,88,0.096,0.0,0.0 +2011,9,1,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,14.4,78,102086,196,1342,379,70,3,69,7506,42,7428,2013,80,3.1,9,9,8047.0,8534,9,999999999,41,0.1920,0,88,0.096,0.0,0.0 +2011,9,1,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,13.3,75,102076,0,1028,375,0,0,0,0,0,0,0,80,3.1,9,9,8047.0,8534,9,999999999,37,0.1920,0,88,0.096,0.0,0.0 +2011,9,1,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,13.3,75,102076,0,0,375,0,0,0,0,0,0,0,80,3.1,9,9,8047.0,8534,9,999999999,37,0.1920,0,88,0.096,0.0,0.0 +2011,9,1,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,15.0,87,102126,0,0,353,0,0,0,0,0,0,0,40,3.6,5,5,8047.0,77777,9,999999999,44,0.1920,0,88,0.096,0.0,0.0 +2011,9,1,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,13.9,81,102136,0,0,373,0,0,0,0,0,0,0,40,2.6,9,9,8047.0,7620,9,999999999,39,0.1920,0,88,0.096,0.0,0.0 +2011,9,1,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.2,13.9,81,102136,0,0,373,0,0,0,0,0,0,0,40,2.6,9,9,8047.0,7620,9,999999999,39,0.1920,0,88,0.096,0.0,0.0 +2011,9,1,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,13.9,84,102106,0,0,370,0,0,0,0,0,0,0,90,3.1,9,9,8047.0,213,9,999999999,39,0.1920,0,88,0.096,0.0,0.0 +2011,9,2,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,13.9,87,102095,0,0,367,0,0,0,0,0,0,0,60,3.1,9,9,8047.0,213,9,999999999,39,0.1910,0,88,0.096,0.0,0.0 +2011,9,2,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.1,13.9,87,102095,0,0,367,0,0,0,0,0,0,0,60,3.1,9,9,8047.0,213,9,999999999,39,0.1910,0,88,0.096,0.0,0.0 +2011,9,2,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,13.9,84,102066,0,0,370,0,0,0,0,0,0,0,40,2.6,9,9,8047.0,274,9,999999999,39,0.1910,0,88,0.096,0.0,0.0 +2011,9,2,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.0,13.0,77,101281,0,0,371,0,0,0,0,0,0,0,70,2.6,9,9,8047.0,335,9,999999999,36,0.1910,0,88,0.096,0.0,0.0 +2011,9,2,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.7,13.3,80,102056,0,0,380,0,0,0,0,0,0,0,60,3.1,10,10,8047.0,335,9,999999999,37,0.1910,0,88,0.096,0.0,0.0 +2011,9,2,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,13.3,80,102096,69,368,380,13,69,9,1522,0,1054,336,60,2.6,10,10,8047.0,427,9,999999999,37,0.1910,0,88,0.096,0.0,0.0 +2011,9,2,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,13.3,75,102086,325,1343,375,29,0,29,2851,0,2873,1242,20,1.5,9,9,8047.0,427,9,999999999,37,0.1910,0,88,0.096,0.0,0.0 +2011,9,2,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,13.3,75,102086,568,1343,349,264,510,63,31871,23376,7624,2912,20,1.5,3,3,8047.0,427,9,999999999,37,0.1910,0,88,0.096,0.0,0.0 +2011,9,2,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,14.4,75,102086,781,1343,356,463,747,84,56814,39832,10338,4189,80,2.6,3,3,8047.0,77777,9,999999999,41,0.1910,0,88,0.096,0.0,0.0 +2011,9,2,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,14.4,73,102086,949,1343,358,623,823,94,67640,85359,13138,2391,90,2.6,3,3,8047.0,77777,9,999999999,41,0.1910,0,88,0.096,0.0,0.0 +2011,9,2,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,14.4,73,102086,1062,1343,358,743,866,99,80531,90160,13509,3011,90,2.6,3,3,8047.0,77777,9,999999999,41,0.1910,0,88,0.096,0.0,0.0 +2011,9,2,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,14.4,73,102036,1111,1343,358,814,887,102,88133,92443,13762,3427,80,4.1,3,3,8047.0,77777,9,999999999,41,0.1910,0,88,0.096,0.0,0.0 +2011,9,2,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,14.4,73,101966,1093,1343,358,827,892,103,89522,92917,13938,3296,80,4.1,3,3,8047.0,77777,9,999999999,41,0.1910,0,88,0.096,0.0,0.0 +2011,9,2,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,14.4,73,101966,1009,1343,358,783,878,101,84829,91240,13903,2732,80,4.1,3,3,8047.0,77777,9,999999999,41,0.1910,0,88,0.096,0.0,0.0 +2011,9,2,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,14.4,75,101886,865,1343,356,684,850,96,74209,87722,13601,2111,80,4.6,3,3,8047.0,77777,9,999999999,41,0.1910,0,88,0.096,0.0,0.0 +2011,9,2,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,15.0,81,101866,672,1343,353,541,796,88,64883,41437,10587,4143,90,3.6,3,3,8047.0,77777,9,999999999,44,0.1910,0,88,0.096,0.0,0.0 +2011,9,2,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,15.0,81,101866,441,1343,353,365,692,76,42156,28268,8805,3133,90,3.6,3,3,8047.0,77777,9,999999999,44,0.1910,0,88,0.096,0.0,0.0 +2011,9,2,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,14.4,84,101796,189,1343,347,182,494,53,19888,1981,5811,1705,100,2.6,3,3,8047.0,77777,9,999999999,41,0.1910,0,88,0.096,0.0,0.0 +2011,9,2,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,14.4,86,101756,0,991,345,0,0,0,0,0,0,0,110,3.1,3,3,8047.0,77777,9,999999999,41,0.1910,0,88,0.096,0.0,0.0 +2011,9,2,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,14.4,86,101756,0,0,331,0,0,0,0,0,0,0,110,3.1,0,0,8047.0,77777,9,999999999,41,0.1910,0,88,0.096,0.0,0.0 +2011,9,2,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,14.4,86,101716,0,0,331,0,0,0,0,0,0,0,130,2.1,0,0,8047.0,77777,9,999999999,41,0.1910,0,88,0.096,0.0,0.0 +2011,9,2,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.0,14.0,88,101281,0,0,341,0,0,0,0,0,0,0,190,3.1,3,3,8047.0,77777,9,999999999,39,0.1910,0,88,0.096,0.0,0.0 +2011,9,2,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,14.4,90,101706,0,0,328,0,0,0,0,0,0,0,180,4.1,0,0,8047.0,77777,9,999999999,41,0.1910,0,88,0.096,0.0,0.0 +2011,9,2,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,13.9,87,101636,0,0,327,0,0,0,0,0,0,0,190,3.1,0,0,8047.0,77777,9,999999999,39,0.1910,0,88,0.096,0.0,0.0 +2011,9,3,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,13.3,83,101606,0,0,327,0,0,0,0,0,0,0,200,3.1,0,0,8047.0,77777,9,999999999,37,0.1900,0,88,0.096,0.0,0.0 +2011,9,3,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,13.3,83,101606,0,0,327,0,0,0,0,0,0,0,200,3.1,0,0,8047.0,77777,9,999999999,37,0.1900,0,88,0.096,0.0,0.0 +2011,9,3,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,13.9,87,101456,0,0,327,0,0,0,0,0,0,0,220,1.5,0,0,8047.0,77777,9,999999999,39,0.1900,0,88,0.096,0.0,0.0 +2011,9,3,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,14.4,86,101476,0,0,331,0,0,0,0,0,0,0,230,3.1,0,0,8047.0,77777,9,999999999,41,0.1900,0,88,0.096,0.0,0.0 +2011,9,3,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,14.4,86,101476,0,0,350,0,0,0,0,0,0,0,230,3.1,5,5,8047.0,77777,9,999999999,41,0.1900,0,88,0.096,0.0,0.0 +2011,9,3,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,14.4,84,101446,65,345,353,8,20,7,951,0,832,266,210,4.1,5,5,8047.0,77777,9,999999999,41,0.1900,0,88,0.096,0.0,0.0 +2011,9,3,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,15.0,78,101416,321,1344,362,98,174,60,11152,4429,6848,2306,230,5.7,5,5,8047.0,77777,9,999999999,43,0.1900,0,88,0.096,0.0,0.0 +2011,9,3,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,15.0,78,101416,564,1344,362,252,407,102,29249,21262,11881,4387,230,5.7,5,5,8047.0,77777,9,999999999,43,0.1900,0,88,0.096,0.0,0.0 +2011,9,3,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,16.1,64,101297,777,1344,385,421,551,141,49565,33202,16670,6555,230,5.1,5,5,8047.0,77777,9,999999999,48,0.1900,0,88,0.096,0.0,0.0 +2011,9,3,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,16.7,60,101237,945,1344,395,543,541,196,64011,35488,23221,9330,240,6.2,5,5,8047.0,77777,9,999999999,51,0.1900,0,88,0.096,0.0,0.0 +2011,9,3,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,16.7,60,101237,1058,1344,418,556,336,309,64329,25647,35974,13831,240,6.2,9,9,8047.0,77777,9,999999999,51,0.1900,0,88,0.096,0.0,0.0 +2011,9,3,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,18.3,55,101108,1106,1344,440,704,552,266,82883,38109,31501,12568,230,6.2,9,9,8047.0,7620,9,999999999,59,0.1900,0,88,0.096,0.0,0.0 +2011,9,3,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,18.9,57,101078,1088,1344,440,679,457,309,78753,33502,36064,13983,230,6.2,9,9,8047.0,7620,9,999999999,63,0.1900,0,88,0.096,0.0,0.0 +2011,9,3,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,28.3,18.9,57,101078,1004,1344,453,615,365,333,70015,28550,38156,14186,230,6.2,10,10,8047.0,7620,9,999999999,63,0.1900,0,88,0.096,0.0,0.0 +2011,9,3,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,29.4,19.4,55,101038,860,1344,448,504,280,308,56376,22098,34669,12244,220,5.7,9,9,8047.0,6706,9,999999999,66,0.1900,0,88,0.096,0.0,0.0 +2011,9,3,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,29.4,20.0,57,101058,666,1344,423,441,404,219,48915,28071,24425,8343,260,6.2,5,5,8047.0,77777,9,999999999,70,0.1900,0,88,0.096,0.0,0.0 +2011,9,3,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,29.4,20.0,57,101058,434,1344,423,312,388,149,33887,21162,16263,4991,260,6.2,5,5,8047.0,77777,9,999999999,70,0.1900,0,88,0.096,0.0,0.0 +2011,9,3,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,19.4,69,101097,182,1344,402,147,219,85,15298,3788,8889,2047,200,3.6,5,5,8047.0,77777,9,999999999,66,0.1900,0,88,0.096,0.0,0.0 +2011,9,3,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,18.9,74,101137,0,954,386,0,0,0,0,0,0,0,200,4.1,3,3,8047.0,77777,9,999999999,63,0.1900,0,88,0.096,0.0,0.0 +2011,9,3,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,18.9,74,101137,0,0,370,0,0,0,0,0,0,0,200,4.1,0,0,8047.0,77777,9,999999999,63,0.1900,0,88,0.096,0.0,0.0 +2011,9,3,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,18.3,79,101177,0,0,361,0,0,0,0,0,0,0,190,3.6,0,0,8047.0,77777,9,999999999,60,0.1900,0,88,0.096,0.0,0.0 +2011,9,3,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,18.3,76,101167,0,0,364,0,0,0,0,0,0,0,220,3.6,0,0,8047.0,77777,9,999999999,60,0.1900,0,88,0.096,0.0,0.0 +2011,9,3,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,18.3,76,101167,0,0,364,0,0,0,0,0,0,0,220,3.6,0,0,8047.0,77777,9,999999999,60,0.1900,0,88,0.096,0.0,0.0 +2011,9,3,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,17.8,79,101217,0,0,379,0,0,0,0,0,0,0,220,4.1,5,5,8047.0,77777,9,999999999,57,0.1900,0,88,0.096,0.0,0.0 +2011,9,4,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,17.8,81,101177,0,0,376,0,0,0,0,0,0,0,210,4.1,5,5,8047.0,77777,9,999999999,57,0.1890,0,88,0.096,0.0,0.0 +2011,9,4,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,17.8,81,101177,0,0,370,0,0,0,0,0,0,0,210,4.1,3,3,8047.0,77777,9,999999999,57,0.1890,0,88,0.096,0.0,0.0 +2011,9,4,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,17.2,78,101127,0,0,354,0,0,0,0,0,0,0,220,4.1,0,0,8047.0,77777,9,999999999,54,0.1890,0,88,0.096,0.0,0.0 +2011,9,4,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,17.2,81,101137,0,0,367,0,0,0,0,0,0,0,240,4.6,3,3,8047.0,77777,9,999999999,54,0.1890,0,88,0.096,0.0,0.0 +2011,9,4,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,17.2,81,101137,0,0,395,0,0,0,0,0,0,0,240,4.6,9,9,8047.0,77777,9,999999999,54,0.1890,0,88,0.096,0.0,0.0 +2011,9,4,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,17.8,84,101187,60,321,368,5,6,5,606,0,606,195,210,3.6,3,3,8047.0,77777,9,999999999,57,0.1890,0,88,0.096,0.0,0.0 +2011,9,4,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,18.3,81,101247,317,1344,402,87,106,64,9808,2466,7237,2412,230,4.1,9,9,8047.0,1006,9,999999999,60,0.1890,0,88,0.096,0.0,0.0 +2011,9,4,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,18.3,81,101247,560,1344,402,230,249,138,25961,14034,15645,5521,230,4.1,9,9,8047.0,1006,9,999999999,60,0.1890,0,88,0.096,0.0,0.0 +2011,9,4,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.0,19.0,78,101282,773,1344,410,337,239,221,38158,16546,25159,9223,190,3.1,9,9,8047.0,7620,9,999999999,64,0.1890,0,88,0.096,0.0,0.0 +2011,9,4,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,20.0,71,101187,942,1344,402,457,328,242,52788,22222,28111,10966,180,5.1,5,5,8047.0,77777,9,999999999,71,0.1890,0,88,0.096,0.0,0.0 +2011,9,4,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,20.0,71,101187,1054,1344,396,593,455,244,69630,29943,28814,11579,180,5.1,3,3,8047.0,77777,9,999999999,71,0.1890,0,88,0.096,0.0,0.0 +2011,9,4,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,29.0,21.0,62,101283,1102,1344,447,729,608,244,86106,38714,28986,11735,230,6.7,9,9,8047.0,823,9,999999999,78,0.1890,0,88,0.096,0.0,0.0 +2011,9,4,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,28.9,21.1,63,101068,1083,1344,460,741,621,241,87363,39476,28576,11568,220,7.7,10,10,8047.0,762,9,999999999,78,0.1890,0,88,0.096,0.0,0.0 +2011,9,4,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,28.9,21.1,63,101068,999,1344,460,696,594,240,81066,38626,28112,11197,220,7.7,10,10,8000.0,762,9,999999999,78,0.1890,0,88,0.096,0.0,0.0 +2011,9,4,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.0,22.0,70,101283,854,1344,418,601,547,227,68633,35512,26067,9947,190,6.7,5,5,8000.0,77777,9,999999999,86,0.1890,0,88,0.096,0.0,0.0 +2011,9,4,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,29.0,22.0,66,101283,660,1344,424,467,475,199,52017,30174,22284,7802,190,5.7,5,5,8000.0,884,9,999999999,86,0.1890,0,88,0.096,0.0,0.0 +2011,9,4,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,21.1,67,100938,428,1344,440,309,392,147,33493,20573,16013,4901,200,6.2,9,9,8000.0,77777,9,999999999,78,0.1890,0,88,0.096,0.0,0.0 +2011,9,4,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,19.4,74,100927,175,1344,419,144,220,82,14977,3299,8570,1964,190,6.2,9,9,8000.0,6706,9,999999999,66,0.1890,0,88,0.096,0.0,0.0 +2011,9,4,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,18.9,71,100997,0,917,418,0,0,0,0,0,0,0,210,6.7,9,9,8000.0,4267,9,999999999,63,0.1890,0,88,0.096,0.0,0.0 +2011,9,4,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,24.4,18.9,71,100997,0,0,418,0,0,0,0,0,0,0,210,6.7,9,9,8000.0,4267,9,999999999,63,0.1890,0,88,0.096,0.0,0.0 +2011,9,4,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,18.3,74,101027,0,0,411,0,0,0,0,0,0,0,220,5.7,9,9,8000.0,7620,9,999999999,60,0.1890,0,88,0.096,0.0,0.0 +2011,9,4,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,18.3,76,101047,0,0,420,0,0,0,0,0,0,0,210,5.7,10,10,8000.0,1158,9,999999999,60,0.1890,0,88,0.096,0.0,0.0 +2011,9,4,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.8,18.3,76,101047,0,0,408,0,0,0,0,0,0,0,210,5.7,9,9,8000.0,1158,9,999999999,60,0.1890,0,88,0.096,0.0,0.0 +2011,9,4,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,17.8,76,100967,0,0,404,0,0,0,0,0,0,0,210,5.1,9,9,8000.0,1006,9,999999999,57,0.1890,0,88,0.096,0.0,0.0 +2011,9,5,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,17.2,76,100957,0,0,378,0,0,0,0,0,0,0,200,6.2,5,5,8000.0,77777,9,999999999,54,0.1880,0,88,0.096,0.0,0.0 +2011,9,5,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,17.2,76,100957,0,0,373,0,0,0,0,0,0,0,200,6.2,3,3,8000.0,77777,9,999999999,54,0.1880,0,88,0.096,0.0,0.0 +2011,9,5,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,15.6,68,100937,0,0,377,0,0,0,0,0,0,0,210,6.7,5,5,8000.0,77777,9,999999999,46,0.1880,0,88,0.096,0.0,0.0 +2011,9,5,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,16.1,73,100977,0,0,353,0,0,0,0,0,0,0,210,5.7,0,0,8000.0,77777,9,999999999,48,0.1880,0,88,0.096,0.0,0.0 +2011,9,5,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,16.1,73,100977,0,0,368,0,0,0,0,0,0,0,210,5.7,3,3,8000.0,77777,9,999999999,48,0.1880,0,88,0.096,0.0,0.0 +2011,9,5,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,17.8,81,100947,56,297,376,7,18,7,823,0,824,263,210,4.6,5,5,8000.0,77777,9,999999999,57,0.1880,0,88,0.096,0.0,0.0 +2011,9,5,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,18.3,81,100927,313,1345,380,98,213,54,11185,4081,6180,2101,190,4.6,5,5,8000.0,77777,9,999999999,60,0.1880,0,88,0.096,0.0,0.0 +2011,9,5,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,18.3,81,100927,556,1345,380,255,464,89,29781,21433,10429,3898,190,4.6,5,5,8000.0,77777,9,999999999,60,0.1880,0,88,0.096,0.0,0.0 +2011,9,5,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,18.9,65,100917,769,1345,428,428,615,121,50791,33492,14415,5740,210,6.7,9,9,8000.0,7620,9,999999999,63,0.1880,0,88,0.096,0.0,0.0 +2011,9,5,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,19.4,60,100928,938,1345,438,533,525,206,62350,33662,24223,9669,210,5.7,9,9,8000.0,7620,9,999999999,66,0.1880,0,88,0.096,0.0,0.0 +2011,9,5,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,27.8,19.4,60,100928,1050,1345,438,611,456,276,71050,31971,32287,12699,210,5.7,9,9,8000.0,7620,9,999999999,66,0.1880,0,88,0.096,0.0,0.0 +2011,9,5,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.0,18.9,51,100888,1098,1345,450,619,342,350,71177,26471,40512,15293,210,8.8,9,9,8000.0,7620,9,999999999,63,0.1880,0,88,0.096,0.0,0.0 +2011,9,5,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.0,19.4,53,100858,1079,1345,451,639,351,357,73117,27424,41123,15384,210,8.2,9,9,8000.0,7620,9,999999999,66,0.1880,0,88,0.096,0.0,0.0 +2011,9,5,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,30.0,19.4,53,100858,994,1345,464,554,267,347,62718,21257,39543,14468,210,8.2,10,10,8000.0,7620,9,999999999,66,0.1880,0,88,0.096,0.0,0.0 +2011,9,5,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,20.0,63,100818,849,1345,451,442,194,304,49359,15142,34161,12028,200,8.2,10,10,8000.0,4267,9,999999999,70,0.1880,0,88,0.096,0.0,0.0 +2011,9,5,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,19.4,64,100818,653,1345,444,301,107,238,33092,7889,26316,8635,190,6.7,10,10,8000.0,4267,9,999999999,66,0.1880,0,88,0.096,0.0,0.0 +2011,9,5,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,26.7,19.4,64,100818,421,1345,444,122,28,108,13570,1227,12062,4007,190,6.7,10,10,8000.0,4267,9,999999999,66,0.1880,0,88,0.096,0.0,0.0 +2011,9,5,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,19.4,71,100877,168,1345,434,53,15,47,5761,0,5126,1500,190,6.2,10,10,8000.0,4267,9,999999999,66,0.1880,0,88,0.096,0.0,0.0 +2011,9,5,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,20.0,76,100927,0,879,431,0,0,0,0,0,0,0,200,6.7,10,10,8000.0,4267,9,999999999,71,0.1880,0,88,0.096,0.0,0.0 +2011,9,5,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,24.4,20.0,76,100927,0,0,431,0,0,0,0,0,0,0,200,6.7,10,10,8000.0,4267,9,999999999,71,0.1880,0,88,0.102,0.0,0.0 +2011,9,5,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,20.6,85,100957,0,0,426,0,0,0,0,0,0,0,190,4.6,10,10,8000.0,4267,9,999999999,75,0.1880,0,88,0.102,5.0,0.0 +2011,9,5,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,20.6,85,100997,0,0,414,0,0,0,0,0,0,0,200,3.6,9,9,8000.0,4267,9,999999999,75,0.1880,0,88,0.102,5.0,0.0 +2011,9,5,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.3,20.6,85,100997,0,0,414,0,0,0,0,0,0,0,200,3.6,9,9,8000.0,4267,9,999999999,75,0.1880,0,88,0.102,0.2,0.0 +2011,9,5,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,20.6,85,101027,0,0,414,0,0,0,0,0,0,0,210,3.1,9,9,8000.0,1402,9,999999999,75,0.1880,0,88,0.102,0.0,0.0 +2011,9,6,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.0,20.0,83,101282,0,0,412,0,0,0,0,0,0,0,190,2.1,9,9,8000.0,701,9,999999999,71,0.1880,0,88,0.102,0.0,0.0 +2011,9,6,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.3,20.0,82,101017,0,0,413,0,0,0,0,0,0,0,200,2.1,9,9,8000.0,701,9,999999999,71,0.1880,0,88,0.102,0.0,0.0 +2011,9,6,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.0,20.0,83,101282,0,0,423,0,0,0,0,0,0,0,255,0.0,10,10,8000.0,1494,0,919999999,71,0.1880,0,88,0.102,0.0,0.0 +2011,9,6,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,18.0,16.0,88,101281,0,0,390,0,0,0,0,0,0,0,360,6.2,10,10,4023.0,396,0,919999999,48,0.1880,0,88,0.102,0.0,0.0 +2011,9,6,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,17.2,15.0,87,101156,0,0,385,0,0,0,0,0,0,0,360,7.7,10,10,6000.0,396,0,919999999,43,0.1880,0,88,0.102,0.0,0.0 +2011,9,6,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.0,14.0,82,101281,52,274,383,0,0,0,0,0,0,0,350,6.2,10,10,8047.0,1189,0,919999999,39,0.1880,0,88,0.102,0.0,0.0 +2011,9,6,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.0,14.0,82,101281,309,1346,383,17,0,17,1668,0,1681,749,340,4.1,10,10,8047.0,1372,0,919999999,39,0.1880,0,88,0.102,0.0,0.0 +2011,9,6,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,16.7,14.4,86,101416,552,1346,382,20,0,20,2003,0,2020,985,350,5.1,10,10,8000.0,1372,0,919999999,41,0.1880,0,88,0.102,0.0,0.0 +2011,9,6,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.0,14.0,82,101281,766,1346,383,94,5,92,11428,273,11220,4512,40,5.7,10,10,8000.0,488,0,919999999,39,0.1880,0,88,0.102,0.0,0.0 +2011,9,6,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,13.9,78,101616,934,1346,387,210,12,203,24691,829,23989,9538,30,4.1,10,10,8000.0,1981,0,919999999,39,0.1880,0,88,0.102,0.0,0.0 +2011,9,6,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,13.9,78,101616,1046,1346,387,265,18,251,31168,1309,29688,11798,30,4.1,10,10,8000.0,1981,0,919999999,39,0.1880,0,88,0.102,0.0,0.0 +2011,9,6,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.0,14.0,77,101281,1093,1346,388,253,16,241,30056,1130,28789,11594,40,5.1,10,10,8000.0,640,0,919999999,39,0.1880,0,88,0.102,0.0,0.0 +2011,9,6,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,13.3,70,101786,1074,1346,392,242,10,234,28748,708,27949,11268,70,5.1,10,10,8000.0,853,0,919999999,37,0.1880,0,88,0.102,0.0,0.0 +2011,9,6,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.9,13.3,70,101786,988,1346,392,227,9,220,26757,636,26068,10413,70,5.1,10,10,8000.0,853,0,919999999,37,0.1880,0,88,0.102,0.0,0.0 +2011,9,6,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,15.0,87,101896,843,1346,385,172,7,168,20211,453,19832,7832,80,2.1,10,10,8000.0,2286,0,919999999,44,0.1880,0,88,0.102,0.0,0.0 +2011,9,6,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,15.0,87,101926,647,1346,385,139,4,137,16026,241,15862,5893,110,3.1,10,10,8000.0,4572,0,919999999,44,0.1880,0,88,0.102,0.0,0.0 +2011,9,6,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.2,15.0,87,101926,414,1346,385,75,0,75,7419,0,7478,3026,110,3.1,10,10,8000.0,4572,0,919999999,44,0.1880,0,88,0.102,0.0,0.0 +2011,9,6,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,16.7,15.0,90,102026,161,1346,382,54,0,54,5225,0,5262,1590,80,2.6,10,10,4828.0,1341,0,919999999,44,0.1880,0,88,0.102,0.0,0.0 +2011,9,6,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.0,15.0,88,101281,0,841,384,0,0,0,0,0,0,0,80,2.6,10,10,8047.0,1189,0,919999999,43,0.1880,0,88,0.102,0.0,0.0 +2011,9,6,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.1,14.4,90,102155,0,0,378,0,0,0,0,0,0,0,100,2.6,10,10,8047.0,1189,0,919999999,41,0.1880,0,88,0.102,5.0,0.0 +2011,9,6,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.0,14.0,88,101281,0,0,377,0,0,0,0,0,0,0,100,1.5,10,10,8047.0,274,0,919999999,39,0.1880,0,88,0.102,4.9,0.0 +2011,9,6,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.0,14.0,88,101281,0,0,367,0,0,0,0,0,0,0,130,3.1,9,9,8047.0,2286,0,919999999,39,0.1880,0,88,0.102,0.0,0.0 +2011,9,6,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.6,13.9,90,102265,0,0,365,0,0,0,0,0,0,0,130,3.6,9,9,8047.0,2286,0,919999999,39,0.1880,0,88,0.102,0.0,0.0 +2011,9,6,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,13.9,87,102275,0,0,367,0,0,0,0,0,0,0,50,2.6,9,9,8047.0,3658,0,919999999,39,0.1880,0,88,0.102,0.0,0.0 +2011,9,7,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,13.9,87,102215,0,0,378,0,0,0,0,0,0,0,50,4.1,10,10,8047.0,1524,0,919999999,39,0.1870,0,88,0.102,0.0,0.0 +2011,9,7,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.1,13.9,87,102215,0,0,378,0,0,0,0,0,0,0,50,4.1,10,10,8047.0,1524,0,919999999,39,0.1870,0,88,0.102,0.0,0.0 +2011,9,7,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,14.4,90,102235,0,0,368,0,0,0,0,0,0,0,40,4.1,9,9,8047.0,914,0,919999999,41,0.1870,0,88,0.102,0.0,0.0 +2011,9,7,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,15.0,93,102205,0,0,379,0,0,0,0,0,0,0,60,6.7,10,10,8047.0,914,0,919999999,44,0.1870,0,88,0.102,0.0,0.0 +2011,9,7,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.1,15.0,93,102205,0,0,379,0,0,0,0,0,0,0,60,6.7,10,10,8047.0,914,0,919999999,44,0.1870,0,88,0.102,0.0,0.0 +2011,9,7,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.0,15.0,88,101281,47,250,384,2,0,2,192,0,193,80,50,7.2,10,10,8047.0,701,0,919999999,43,0.1870,0,88,0.102,0.0,0.0 +2011,9,7,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,16.0,15.0,94,101281,305,1346,379,10,0,10,980,0,987,449,40,6.7,10,10,3219.0,823,0,919999999,44,0.1870,0,88,0.102,0.0,0.0 +2011,9,7,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,16.1,14.4,90,102365,549,1346,378,15,0,15,1502,0,1514,744,40,5.7,10,10,8000.0,823,0,919999999,41,0.1870,0,88,0.102,0.0,0.0 +2011,9,7,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,16.0,15.0,94,101281,762,1346,379,63,0,63,6419,0,6476,3191,40,6.7,10,10,4023.0,396,0,919999999,44,0.1870,0,88,0.102,0.0,0.0 +2011,9,7,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.0,16.0,94,101281,930,1346,385,80,0,80,8258,0,8337,4227,50,5.7,10,10,4828.0,305,0,919999999,48,0.1870,0,88,0.102,0.0,0.0 +2011,9,7,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.0,16.0,94,101281,1041,1346,385,108,0,108,11251,0,11362,5736,60,7.2,10,10,9656.0,152,0,919999999,48,0.1870,0,88,0.102,0.0,0.0 +2011,9,7,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,16.1,15.0,93,102275,1089,1346,379,113,0,113,11828,0,11946,6028,50,7.7,10,10,1609.0,91,0,919999999,44,0.1870,0,88,0.102,0.0,0.0 +2011,9,7,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,16.0,15.0,94,101281,1069,1346,379,112,0,112,11704,0,11820,5961,60,8.2,10,10,3219.0,91,0,919999999,44,0.1870,0,88,0.102,0.0,0.0 +2011,9,7,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,16.1,15.0,93,102245,983,1346,379,144,0,144,14943,0,15087,7301,50,7.7,10,10,3200.0,91,0,919999999,44,0.1870,0,88,0.102,0.0,0.0 +2011,9,7,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.0,15.0,88,101281,837,1346,384,132,0,132,13533,0,13658,6389,40,6.7,10,10,3219.0,152,0,919999999,43,0.1870,0,88,0.102,0.0,0.0 +2011,9,7,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,16.1,15.0,93,102135,641,1346,379,209,135,146,23944,8347,16799,6157,30,6.2,10,10,3219.0,152,0,919999999,44,0.1870,0,88,0.102,0.0,0.0 +2011,9,7,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,16.1,15.0,93,102135,408,1346,379,156,140,112,17304,6800,12475,4035,30,6.2,10,10,3200.0,152,0,919999999,44,0.1870,0,88,0.102,0.0,0.0 +2011,9,7,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,16.1,14.4,90,102095,154,1346,378,87,39,73,9075,485,7650,1716,30,7.2,10,10,6437.0,213,0,919999999,41,0.1870,0,88,0.102,0.0,0.0 +2011,9,7,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,14.4,90,102095,0,803,378,0,0,0,0,0,0,0,20,5.1,10,10,6437.0,213,0,919999999,41,0.1870,0,88,0.102,0.0,0.0 +2011,9,7,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.1,14.4,90,102095,0,0,378,0,0,0,0,0,0,0,20,5.1,10,10,6437.0,213,0,919999999,41,0.1870,0,88,0.102,5.0,0.0 +2011,9,7,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,14.4,90,102065,0,0,378,0,0,0,0,0,0,0,10,5.1,10,10,6437.0,213,0,919999999,41,0.1870,0,88,0.102,5.0,0.0 +2011,9,7,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,14.4,90,101975,0,0,378,0,0,0,0,0,0,0,20,5.1,10,10,6437.0,213,0,919999999,41,0.1870,0,88,0.102,5.0,0.0 +2011,9,7,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.1,14.4,90,101975,0,0,378,0,0,0,0,0,0,0,20,5.1,10,10,6437.0,213,0,919999999,41,0.1870,0,88,0.102,0.0,0.0 +2011,9,7,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,16.1,14.4,90,101965,0,0,378,0,0,0,0,0,0,0,20,4.1,10,10,3219.0,152,0,919999999,41,0.1870,0,88,0.102,0.0,0.0 +2011,9,8,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,15.6,14.4,93,101905,0,0,376,0,0,0,0,0,0,0,20,3.6,10,10,3219.0,152,0,919999999,41,0.1860,0,88,0.102,0.0,0.0 +2011,9,8,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,15.6,14.4,93,101905,0,0,376,0,0,0,0,0,0,0,20,3.6,10,10,3200.0,152,0,919999999,41,0.1860,0,88,0.102,0.0,0.0 +2011,9,8,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,15.6,14.4,93,101895,0,0,376,0,0,0,0,0,0,0,20,3.1,10,10,3219.0,244,0,919999999,41,0.1860,0,88,0.102,0.0,0.0 +2011,9,8,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,15.6,14.4,93,101845,0,0,376,0,0,0,0,0,0,0,10,3.6,10,10,3219.0,183,0,919999999,41,0.1860,0,88,0.102,0.0,0.0 +2011,9,8,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,15.6,14.4,93,101845,0,0,376,0,0,0,0,0,0,0,10,3.6,10,10,3200.0,183,0,919999999,41,0.1860,0,88,0.102,0.0,0.0 +2011,9,8,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,15.0,14.0,94,101281,43,226,372,3,0,3,287,0,289,118,50,4.1,10,10,3219.0,183,0,919999999,39,0.1860,0,88,0.102,0.0,0.0 +2011,9,8,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,15.0,14.0,94,101281,301,1347,372,9,0,9,882,0,889,405,330,5.1,10,10,2816.0,274,0,919999999,39,0.1860,0,88,0.102,0.0,0.0 +2011,9,8,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,15.0,13.9,93,101875,545,1347,372,26,0,26,2603,0,2625,1264,10,4.6,10,10,2000.0,274,0,919999999,39,0.1860,0,88,0.102,0.0,0.0 +2011,9,8,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,15.0,14.0,94,101281,758,1347,372,37,0,37,3771,0,3805,1928,60,3.1,10,10,6437.0,457,0,919999999,39,0.1860,0,88,0.102,0.0,0.0 +2011,9,8,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,14.0,14.0,100,101280,926,1347,367,146,7,141,17628,430,17095,7022,20,3.1,10,10,3219.0,1250,0,919999999,40,0.1860,0,88,0.102,0.0,0.0 +2011,9,8,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.0,13.9,93,101835,1037,1347,372,252,20,238,29721,1429,28224,11283,120,5.7,10,10,3219.0,1250,0,919999999,39,0.1860,0,88,0.102,0.0,0.0 +2011,9,8,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.0,14.0,88,101281,1084,1347,377,343,36,315,39847,2834,36822,14146,40,3.1,10,10,3219.0,183,0,919999999,39,0.1860,0,88,0.102,0.0,0.0 +2011,9,8,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,15.0,87,101726,1064,1347,385,190,5,186,22908,322,22536,9307,360,4.1,10,10,3219.0,213,0,919999999,44,0.1860,0,88,0.102,0.0,0.0 +2011,9,8,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.2,15.0,87,101726,978,1347,385,152,1,151,18387,61,18346,7592,360,4.1,10,10,3219.0,213,0,919999999,44,0.1860,0,88,0.102,0.0,0.0 +2011,9,8,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.0,16.0,94,101281,831,1347,385,182,5,179,21219,327,20969,8182,30,2.6,10,10,4023.0,152,0,919999999,48,0.1860,0,88,0.102,0.0,0.0 +2011,9,8,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,15.0,87,101636,634,1347,385,309,332,152,35239,20876,17412,6312,40,3.1,10,10,4023.0,244,0,919999999,44,0.1860,0,88,0.102,0.0,0.0 +2011,9,8,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.2,15.0,87,101636,401,1347,374,248,397,117,27356,19709,12961,4110,40,3.1,9,9,4023.0,244,0,919999999,44,0.1860,0,88,0.102,0.0,0.0 +2011,9,8,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.0,14.0,88,101281,146,1347,367,140,327,58,14839,433,6173,1553,90,3.6,9,9,4023.0,488,0,919999999,39,0.1860,0,88,0.102,0.0,0.0 +2011,9,8,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.0,14.0,88,101281,0,765,367,0,0,0,0,0,0,0,80,2.6,9,9,4023.0,396,0,919999999,39,0.1860,0,88,0.102,0.0,0.0 +2011,9,8,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.6,14.4,93,101586,0,0,345,0,0,0,0,0,0,0,70,2.1,5,5,4023.0,396,9,999999999,41,0.1860,0,88,0.102,5.0,0.0 +2011,9,8,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,13.9,90,101516,0,0,325,0,0,0,0,0,0,0,76,0.0,0,0,4023.0,77777,9,999999999,39,0.1860,0,88,0.102,5.0,0.0 +2011,9,8,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,14.4,93,101456,0,0,345,0,0,0,0,0,0,0,360,1.5,5,5,4023.0,77777,9,999999999,41,0.1860,0,88,0.102,5.0,0.0 +2011,9,8,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,14.4,93,101456,0,0,345,0,0,0,0,0,0,0,360,1.5,5,5,4023.0,77777,9,999999999,41,0.1860,0,88,0.102,4.6,0.0 +2011,9,8,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.0,14.0,88,101281,0,0,347,0,0,0,0,0,0,0,340,1.5,5,5,4023.0,305,9,999999999,39,0.1860,0,88,0.102,0.0,0.0 +2011,9,9,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.0,15.0,94,101281,0,0,368,0,0,0,0,0,0,0,340,2.6,9,9,4023.0,152,9,999999999,44,0.1850,0,88,0.102,0.0,0.0 +2011,9,9,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.1,15.0,93,101236,0,0,379,0,0,0,0,0,0,0,340,2.6,10,10,4023.0,152,9,999999999,44,0.1850,0,88,0.102,0.0,0.0 +2011,9,9,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,16.0,14.0,88,101281,0,0,377,0,0,0,0,0,0,0,357,0.0,10,10,9656.0,77777,0,999999999,39,0.1850,0,88,0.102,0.0,0.0 +2011,9,9,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,15.6,15.0,96,101066,0,0,377,0,0,0,0,0,0,0,330,3.1,10,10,402.0,91,0,999999999,44,0.1850,0,88,0.102,0.0,0.0 +2011,9,9,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,15.6,15.0,96,101066,0,0,377,0,0,0,0,0,0,0,330,3.1,10,10,400.0,91,0,999999999,44,0.1850,0,88,0.102,0.0,0.0 +2011,9,9,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,16.1,15.6,97,100976,38,202,380,3,0,3,287,0,289,117,320,3.6,10,10,402.0,91,0,999999999,46,0.1850,0,88,0.102,0.0,0.0 +2011,9,9,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.0,16.0,94,101281,296,1348,375,51,17,47,5865,281,5418,1843,330,3.1,9,9,3219.0,91,0,999999999,48,0.1850,0,88,0.102,0.0,0.0 +2011,9,9,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.7,16.1,96,100956,541,1348,373,154,101,118,17557,5447,13506,4822,340,2.6,9,9,3219.0,91,0,999999999,48,0.1850,0,88,0.102,0.0,0.0 +2011,9,9,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,16.7,76,100877,754,1348,397,345,331,180,39645,21745,20785,7828,350,5.7,9,9,3219.0,7620,0,999999999,51,0.1850,0,88,0.102,0.0,0.0 +2011,9,9,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,13.9,57,100817,922,1348,403,454,314,260,52237,23989,30086,11412,350,5.7,9,9,3219.0,7620,0,999999999,38,0.1850,0,88,0.102,0.0,0.0 +2011,9,9,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.8,13.9,57,100817,1033,1348,403,576,393,290,66842,30397,33855,13066,350,5.7,9,9,3219.0,7620,0,999999999,38,0.1850,0,88,0.102,0.0,0.0 +2011,9,9,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,15.6,64,100747,1080,1348,405,611,347,342,70383,27897,39651,14944,100,4.1,9,9,3219.0,7620,0,999999999,46,0.1850,0,88,0.102,0.0,0.0 +2011,9,9,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,15.0,66,100737,1059,1348,398,608,322,355,69647,26700,40933,15182,100,3.1,9,9,3219.0,7620,0,999999999,43,0.1850,0,88,0.102,0.0,0.0 +2011,9,9,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,15.0,66,100737,972,1348,376,658,600,219,77285,41713,25858,10297,100,3.1,5,5,3219.0,7620,0,999999999,43,0.1850,0,88,0.102,0.0,0.0 +2011,9,9,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,15.6,52,100638,825,1348,400,616,738,141,73110,44708,16805,6714,290,5.1,5,5,3219.0,77777,0,999999999,45,0.1850,0,88,0.102,0.0,0.0 +2011,9,9,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,12.8,42,100628,628,1348,393,510,814,74,61535,40918,8953,3469,290,4.6,3,3,3219.0,77777,0,999999999,34,0.1850,0,88,0.102,0.0,0.0 +2011,9,9,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,12.8,42,100628,394,1348,393,333,712,61,38703,24761,7109,2508,290,4.6,3,3,3219.0,77777,0,999999999,34,0.1850,0,88,0.102,0.0,0.0 +2011,9,9,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,12.2,45,100667,139,1348,383,151,492,40,16468,0,4376,1251,300,3.6,3,3,3219.0,77777,0,999999999,32,0.1850,0,88,0.102,0.0,0.0 +2011,9,9,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,13.3,50,100767,0,726,382,0,0,0,0,0,0,0,250,3.1,3,3,3219.0,77777,0,999999999,36,0.1850,0,88,0.102,0.0,0.0 +2011,9,9,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,13.3,50,100767,0,0,382,0,0,0,0,0,0,0,250,3.1,3,3,3219.0,77777,9,999999999,36,0.1850,0,88,0.102,0.0,0.0 +2011,9,9,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,13.3,55,100857,0,0,374,0,0,0,0,0,0,0,300,4.6,3,3,3219.0,77777,9,999999999,36,0.1850,0,88,0.102,0.0,0.0 +2011,9,9,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,12.8,57,100917,0,0,367,0,0,0,0,0,0,0,290,4.1,3,3,3219.0,77777,9,999999999,35,0.1850,0,88,0.102,0.0,0.0 +2011,9,9,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,12.8,57,100917,0,0,367,0,0,0,0,0,0,0,290,4.1,3,3,3219.0,77777,9,999999999,35,0.1850,0,88,0.102,0.0,0.0 +2011,9,9,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,12.8,59,100957,0,0,349,0,0,0,0,0,0,0,280,3.1,0,0,3219.0,77777,9,999999999,35,0.1850,0,88,0.102,0.0,0.0 +2011,9,10,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,13.3,63,100967,0,0,348,0,0,0,0,0,0,0,290,4.1,0,0,3219.0,77777,9,999999999,36,0.1840,0,88,0.102,0.0,0.0 +2011,9,10,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,13.3,63,100967,0,0,363,0,0,0,0,0,0,0,290,4.1,3,3,3219.0,77777,9,999999999,36,0.1840,0,88,0.102,0.0,0.0 +2011,9,10,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,13.3,63,100987,0,0,368,0,0,0,0,0,0,0,300,3.1,5,5,3219.0,77777,9,999999999,36,0.1840,0,88,0.102,0.0,0.0 +2011,9,10,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,13.3,63,101017,0,0,368,0,0,0,0,0,0,0,310,3.6,5,5,3219.0,77777,9,999999999,36,0.1840,0,88,0.102,0.0,0.0 +2011,9,10,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,13.3,63,101017,0,0,368,0,0,0,0,0,0,0,310,3.6,5,5,3219.0,77777,9,999999999,36,0.1840,0,88,0.102,0.0,0.0 +2011,9,10,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,13.3,68,101126,34,178,362,7,48,5,829,0,593,187,320,3.6,5,5,3219.0,77777,9,999999999,36,0.1840,0,88,0.102,0.0,0.0 +2011,9,10,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,13.3,63,101187,292,1348,348,95,288,35,11187,3885,4129,1429,340,4.1,0,0,3219.0,77777,9,999999999,36,0.1840,0,88,0.102,0.0,0.0 +2011,9,10,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,13.3,63,101187,536,1348,348,253,536,62,30367,23657,7460,2815,340,4.1,0,0,3219.0,77777,9,999999999,36,0.1840,0,88,0.102,0.0,0.0 +2011,9,10,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,13.9,68,101366,750,1348,345,438,749,78,53757,39290,9600,3860,60,5.1,0,0,3219.0,77777,9,999999999,39,0.1840,0,88,0.102,0.0,0.0 +2011,9,10,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,12.8,66,101416,918,1348,362,540,618,169,64263,40712,20204,8153,80,4.6,5,5,3219.0,77777,9,999999999,35,0.1840,0,88,0.102,0.0,0.0 +2011,9,10,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,12.8,66,101416,1029,1348,383,606,496,254,71059,36827,29952,11820,80,4.6,9,9,3219.0,77777,9,999999999,35,0.1840,0,88,0.102,0.0,0.0 +2011,9,10,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,12.8,63,101386,1075,1348,386,651,453,300,75864,35456,35173,13610,110,4.6,9,9,3219.0,4877,9,999999999,35,0.1840,0,88,0.102,0.0,0.0 +2011,9,10,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,12.8,66,101416,1054,1348,383,668,478,294,77727,37344,34415,13308,130,5.1,9,9,3219.0,4877,9,999999999,35,0.1840,0,88,0.102,0.0,0.0 +2011,9,10,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,19.4,12.8,66,101416,967,1348,383,611,429,289,70254,34195,33428,12608,130,5.1,9,9,3219.0,4877,9,999999999,35,0.1840,0,88,0.102,0.0,0.0 +2011,9,10,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,10.0,58,101416,819,1348,374,569,561,201,65851,41030,23378,8876,90,5.1,9,9,3219.0,7620,9,999999999,26,0.1840,0,88,0.102,0.0,0.0 +2011,9,10,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,11.7,65,101466,621,1348,376,468,654,127,54115,39677,14743,5444,80,4.6,9,9,3219.0,7620,9,999999999,31,0.1840,0,88,0.102,0.0,0.0 +2011,9,10,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.3,11.7,65,101466,387,1348,355,306,597,91,34399,26126,10267,3403,80,4.6,5,5,3219.0,7620,9,999999999,31,0.1840,0,88,0.102,0.0,0.0 +2011,9,10,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,11.1,70,101556,132,1348,347,144,432,44,15519,0,4758,1289,110,5.1,5,5,3219.0,77777,9,999999999,30,0.1840,0,88,0.102,0.0,0.0 +2011,9,10,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,11.7,72,101656,0,687,368,0,0,0,0,0,0,0,120,3.1,9,9,3219.0,6706,9,999999999,31,0.1840,0,88,0.102,0.0,0.0 +2011,9,10,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.7,11.7,72,101656,0,0,368,0,0,0,0,0,0,0,120,3.1,9,9,3219.0,6706,9,999999999,31,0.1840,0,88,0.102,0.0,0.0 +2011,9,10,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,11.1,72,101816,0,0,344,0,0,0,0,0,0,0,160,1.5,5,5,3219.0,77777,9,999999999,30,0.1840,0,88,0.102,0.0,0.0 +2011,9,10,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,10.6,70,101836,0,0,338,0,0,0,0,0,0,0,157,0.0,3,3,3219.0,77777,9,999999999,28,0.1840,0,88,0.102,0.0,0.0 +2011,9,10,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,10.6,70,101836,0,0,324,0,0,0,0,0,0,0,167,0.0,0,0,3219.0,77777,9,999999999,28,0.1840,0,88,0.102,0.0,0.0 +2011,9,10,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,11.1,77,101895,0,0,320,0,0,0,0,0,0,0,30,1.5,0,0,3219.0,77777,9,999999999,30,0.1840,0,88,0.102,0.0,0.0 +2011,9,11,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,11.1,81,101925,0,0,317,0,0,0,0,0,0,0,10,1.5,0,0,3219.0,77777,9,999999999,30,0.1830,0,88,0.102,0.0,0.0 +2011,9,11,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,11.1,81,101925,0,0,317,0,0,0,0,0,0,0,10,1.5,0,0,3219.0,77777,9,999999999,30,0.1830,0,88,0.102,0.0,0.0 +2011,9,11,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,11.1,81,101975,0,0,317,0,0,0,0,0,0,0,350,1.5,0,0,3219.0,77777,9,999999999,30,0.1830,0,88,0.102,0.0,0.0 +2011,9,11,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,10.6,84,101985,0,0,312,0,0,0,0,0,0,0,360,1.5,0,0,3219.0,77777,9,999999999,28,0.1830,0,88,0.102,0.0,0.0 +2011,9,11,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,10.6,84,101985,0,0,312,0,0,0,0,0,0,0,360,1.5,0,0,3219.0,77777,9,999999999,28,0.1830,0,88,0.102,0.0,0.0 +2011,9,11,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,11.1,81,102075,29,155,331,6,35,5,708,0,591,185,118,0.0,3,3,3219.0,77777,9,999999999,30,0.1830,0,88,0.102,0.0,0.0 +2011,9,11,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,12.2,80,102095,288,1349,337,99,343,35,11649,4659,4125,1424,127,0.0,3,3,3219.0,77777,9,999999999,33,0.1830,0,88,0.102,0.0,0.0 +2011,9,11,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,12.2,80,102095,532,1349,337,259,609,59,31197,26839,7123,2687,147,0.0,3,3,3219.0,77777,9,999999999,33,0.1830,0,88,0.102,0.0,0.0 +2011,9,11,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,11.7,67,102156,746,1349,347,440,763,75,54192,40843,9262,3718,130,2.1,3,3,3219.0,77777,9,999999999,31,0.1830,0,88,0.102,0.0,0.0 +2011,9,11,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,12.2,65,102106,913,1349,353,597,833,87,64558,85792,12289,2186,156,2.6,3,3,3219.0,77777,9,999999999,33,0.1830,0,88,0.102,0.0,0.0 +2011,9,11,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,12.2,65,102106,1024,1349,353,712,861,99,76699,89026,13605,2763,159,4.6,3,3,3219.0,77777,9,999999999,33,0.1830,0,88,0.102,0.0,0.0 +2011,9,11,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,11.1,57,101976,1070,1349,363,777,871,106,83290,89922,14376,3137,100,6.7,5,5,3219.0,77777,9,999999999,29,0.1830,0,88,0.102,0.0,0.0 +2011,9,11,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,11.1,57,101906,1049,1349,363,784,865,111,83932,89210,15076,3047,110,6.7,5,5,3219.0,77777,9,999999999,29,0.1830,0,88,0.102,0.0,0.0 +2011,9,11,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,11.1,57,101906,961,1349,363,732,839,113,90470,50224,14017,5847,110,6.7,5,5,3219.0,77777,9,999999999,29,0.1830,0,88,0.102,0.0,0.0 +2011,9,11,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,11.7,61,101766,813,1349,360,627,787,113,75721,46947,13696,5521,110,5.7,5,5,3219.0,77777,9,999999999,31,0.1830,0,88,0.102,0.0,0.0 +2011,9,11,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,13.3,68,101706,615,1349,384,478,702,107,55888,39097,12555,4720,120,5.7,9,9,3219.0,7620,9,999999999,37,0.1830,0,88,0.102,0.0,0.0 +2011,9,11,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,19.4,13.3,68,101706,380,1349,384,282,460,96,31465,20070,10752,3502,120,5.7,9,9,3219.0,7620,9,999999999,37,0.1830,0,88,0.102,0.0,0.0 +2011,9,11,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,12.8,59,101656,124,1349,392,134,375,47,14275,0,5026,1291,200,4.6,9,9,3219.0,2286,9,999999999,35,0.1830,0,88,0.102,0.0,0.0 +2011,9,11,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,12.2,63,101656,0,648,355,0,0,0,0,0,0,0,190,4.6,3,3,3219.0,77777,9,999999999,33,0.1830,0,88,0.102,0.0,0.0 +2011,9,11,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,12.2,63,101656,0,0,361,0,0,0,0,0,0,0,190,4.6,5,5,3219.0,77777,9,999999999,33,0.1830,0,88,0.102,0.0,0.0 +2011,9,11,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,13.3,73,101666,0,0,378,0,0,0,0,0,0,0,200,5.1,9,9,3219.0,2286,9,999999999,37,0.1830,0,88,0.102,0.0,0.0 +2011,9,11,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,11.7,67,101646,0,0,373,0,0,0,0,0,0,0,220,5.1,9,9,3219.0,2286,9,999999999,31,0.1830,0,88,0.102,0.0,0.0 +2011,9,11,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,11.7,67,101646,0,0,353,0,0,0,0,0,0,0,220,5.1,5,5,3219.0,2286,9,999999999,31,0.1830,0,88,0.102,0.0,0.0 +2011,9,11,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,11.7,72,101586,0,0,347,0,0,0,0,0,0,0,230,3.1,5,5,3219.0,77777,9,999999999,31,0.1830,0,88,0.102,0.0,0.0 +2011,9,12,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.0,12.0,72,101281,0,0,370,0,0,0,0,0,0,0,230,4.1,9,9,3219.0,549,9,999999999,32,0.1820,0,88,0.102,0.0,0.0 +2011,9,12,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.7,11.7,72,101556,0,0,378,0,0,0,0,0,0,0,230,4.1,10,10,3219.0,549,9,999999999,31,0.1820,0,88,0.102,0.0,0.0 +2011,9,12,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.0,12.0,72,101281,0,0,329,0,0,0,0,0,0,0,230,4.6,0,0,3219.0,77777,9,999999999,32,0.1820,0,88,0.102,0.0,0.0 +2011,9,12,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,13.3,80,101466,0,0,349,0,0,0,0,0,0,0,220,5.1,5,5,3219.0,77777,9,999999999,37,0.1820,0,88,0.102,0.0,0.0 +2011,9,12,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,13.3,80,101466,0,0,349,0,0,0,0,0,0,0,220,5.1,5,5,3219.0,77777,9,999999999,37,0.1820,0,88,0.102,0.0,0.0 +2011,9,12,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,15.0,87,101486,25,131,353,0,0,0,0,0,0,0,220,3.6,5,5,3219.0,77777,9,999999999,44,0.1820,0,88,0.102,0.0,0.0 +2011,9,12,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,15.6,81,101486,284,1350,357,83,176,50,9458,2850,5713,1909,240,5.1,3,3,3219.0,77777,9,999999999,46,0.1820,0,88,0.102,0.0,0.0 +2011,9,12,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,15.6,81,101486,528,1350,342,230,396,95,26611,19414,11030,4023,240,5.1,0,0,3219.0,77777,9,999999999,46,0.1820,0,88,0.102,0.0,0.0 +2011,9,12,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,16.1,68,101497,742,1350,374,402,566,130,47305,33155,15359,5996,270,2.1,3,3,3219.0,77777,9,999999999,48,0.1820,0,88,0.102,0.0,0.0 +2011,9,12,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,16.1,62,101497,909,1350,383,557,665,149,66677,40393,17914,7306,270,4.6,3,3,3219.0,77777,9,999999999,48,0.1820,0,88,0.102,0.0,0.0 +2011,9,12,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,16.1,62,101497,1020,1350,383,685,779,129,84264,44861,15933,6693,270,4.6,3,3,3219.0,77777,9,999999999,48,0.1820,0,88,0.102,0.0,0.0 +2011,9,12,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,16.7,56,101387,1065,1350,395,756,828,122,82067,86634,16468,3270,240,5.1,3,3,3219.0,77777,9,999999999,51,0.1820,0,88,0.102,0.0,0.0 +2011,9,12,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,16.1,51,101317,1043,1350,400,766,836,120,95053,47178,14948,6310,230,5.1,3,3,3219.0,77777,9,999999999,48,0.1820,0,88,0.102,0.0,0.0 +2011,9,12,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,16.1,51,101317,955,1350,400,712,789,133,86572,46122,16237,6742,230,5.1,3,3,3219.0,77777,9,999999999,48,0.1820,0,88,0.102,0.0,0.0 +2011,9,12,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,16.1,51,101237,807,1350,406,609,741,130,72468,43439,15531,6208,230,6.2,5,5,3219.0,77777,9,999999999,48,0.1820,0,88,0.102,0.0,0.0 +2011,9,12,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,15.6,49,101247,608,1350,399,466,674,114,54048,37077,13272,4946,260,5.7,3,3,3219.0,77777,9,999999999,45,0.1820,0,88,0.102,0.0,0.0 +2011,9,12,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.2,15.6,49,101247,373,1350,399,296,557,89,33105,21791,9991,3290,260,5.7,3,3,3219.0,77777,9,999999999,45,0.1820,0,88,0.102,0.0,0.0 +2011,9,12,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,15.6,54,101267,117,1350,391,125,314,51,13126,0,5378,1280,250,3.1,3,3,3219.0,77777,9,999999999,45,0.1820,0,88,0.102,0.0,0.0 +2011,9,12,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,16.1,58,101297,0,609,372,0,0,0,0,0,0,0,260,2.6,0,0,3219.0,77777,9,999999999,48,0.1820,0,88,0.102,0.0,0.0 +2011,9,12,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,16.1,58,101297,0,0,372,0,0,0,0,0,0,0,260,2.6,0,0,3219.0,77777,9,999999999,48,0.1820,0,88,0.102,0.0,0.0 +2011,9,12,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,18.3,81,101387,0,0,358,0,0,0,0,0,0,0,220,4.1,0,0,3219.0,77777,9,999999999,60,0.1820,0,88,0.102,0.0,0.0 +2011,9,12,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,17.8,79,101387,0,0,358,0,0,0,0,0,0,0,230,3.1,0,0,3219.0,77777,9,999999999,57,0.1820,0,88,0.102,0.0,0.0 +2011,9,12,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,17.8,79,101387,0,0,358,0,0,0,0,0,0,0,230,3.1,0,0,3219.0,77777,9,999999999,57,0.1820,0,88,0.102,0.0,0.0 +2011,9,12,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,17.2,78,101347,0,0,354,0,0,0,0,0,0,0,250,3.6,0,0,3219.0,77777,9,999999999,54,0.1820,0,88,0.102,0.0,0.0 +2011,9,13,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,16.7,81,101336,0,0,349,0,0,0,0,0,0,0,150,2.1,0,0,3219.0,77777,9,999999999,51,0.1810,0,88,0.102,0.0,0.0 +2011,9,13,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,16.7,81,101336,0,0,349,0,0,0,0,0,0,0,150,2.1,0,0,3219.0,77777,9,999999999,51,0.1810,0,88,0.102,0.0,0.0 +2011,9,13,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,16.7,87,101286,0,0,343,0,0,0,0,0,0,0,190,2.6,0,0,3219.0,77777,9,999999999,51,0.1810,0,88,0.102,0.0,0.0 +2011,9,13,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,16.7,84,101276,0,0,361,0,0,0,0,0,0,0,237,0.0,3,3,3219.0,77777,9,999999999,51,0.1810,0,88,0.102,0.0,0.0 +2011,9,13,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,16.7,84,101276,0,0,346,0,0,0,0,0,0,0,232,0.0,0,0,3219.0,77777,9,999999999,51,0.1810,0,88,0.102,0.0,0.0 +2011,9,13,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,18.9,16.7,87,101266,20,107,343,0,0,0,0,0,0,0,210,1.5,0,0,6437.0,77777,9,999999999,51,0.1810,0,88,0.102,0.0,0.0 +2011,9,13,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.0,17.8,87,101266,279,1351,350,79,157,49,8986,2050,5588,1869,200,2.1,0,0,6437.0,77777,9,999999999,57,0.1810,0,88,0.102,0.0,0.0 +2011,9,13,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.0,17.8,87,101266,524,1351,350,230,429,82,26845,18838,9601,3552,200,2.1,0,0,6000.0,77777,9,999999999,57,0.1810,0,88,0.102,0.0,0.0 +2011,9,13,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,17.8,69,101267,737,1351,369,405,618,109,48204,33143,13021,5154,220,4.6,0,0,6000.0,77777,9,999999999,57,0.1810,0,88,0.102,0.0,0.0 +2011,9,13,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,16.7,58,101247,905,1351,376,559,711,127,67652,40815,15431,6354,240,5.7,0,0,6000.0,77777,9,999999999,51,0.1810,0,88,0.102,0.0,0.0 +2011,9,13,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,16.7,58,101247,1015,1351,376,677,770,133,82991,44289,16371,6868,240,5.7,0,0,6000.0,77777,9,999999999,51,0.1810,0,88,0.102,0.0,0.0 +2011,9,13,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.8,16.1,49,101108,1061,1351,403,744,796,138,91581,46407,17058,7176,220,7.2,3,3,6000.0,77777,9,999999999,48,0.1810,0,88,0.102,0.0,0.0 +2011,9,13,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,16.1,46,101058,1038,1351,409,754,798,140,92422,46839,17233,7230,240,6.2,3,3,6000.0,77777,9,999999999,47,0.1810,0,88,0.102,0.0,0.0 +2011,9,13,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,16.1,46,101058,949,1351,409,706,778,139,85477,46077,16899,6991,240,6.2,3,3,6000.0,77777,9,999999999,47,0.1810,0,88,0.102,0.0,0.0 +2011,9,13,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,15.6,44,100958,800,1351,415,604,730,134,71653,43547,15961,6347,230,6.2,5,5,6000.0,77777,9,999999999,45,0.1810,0,88,0.102,0.0,0.0 +2011,9,13,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,15.0,44,100938,601,1351,404,458,646,123,52750,36902,14223,5226,230,6.2,3,3,6000.0,77777,9,999999999,43,0.1810,0,88,0.102,0.0,0.0 +2011,9,13,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,15.0,44,100938,366,1351,404,285,493,102,31466,21278,11307,3573,230,6.2,3,3,6000.0,77777,9,999999999,43,0.1810,0,88,0.102,0.0,0.0 +2011,9,13,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,17.8,67,100997,109,1351,387,117,251,56,12094,0,5816,1239,200,5.7,3,3,6000.0,77777,9,999999999,57,0.1810,0,88,0.102,0.0,0.0 +2011,9,13,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,17.2,64,101027,0,570,387,0,0,0,0,0,0,0,200,6.2,3,3,6000.0,77777,9,999999999,53,0.1810,0,88,0.102,0.0,0.0 +2011,9,13,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,17.2,64,101027,0,0,387,0,0,0,0,0,0,0,200,6.2,3,3,6000.0,77777,9,999999999,53,0.1810,0,88,0.102,0.0,0.0 +2011,9,13,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,16.7,71,101087,0,0,359,0,0,0,0,0,0,0,220,5.1,0,0,6000.0,77777,9,999999999,51,0.1810,0,88,0.102,0.0,0.0 +2011,9,13,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,17.2,73,101057,0,0,360,0,0,0,0,0,0,0,210,4.6,0,0,6000.0,77777,9,999999999,54,0.1810,0,88,0.102,0.0,0.0 +2011,9,13,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,17.2,73,101057,0,0,360,0,0,0,0,0,0,0,210,4.6,0,0,6000.0,77777,9,999999999,54,0.1810,0,88,0.102,0.0,0.0 +2011,9,13,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,17.2,76,101067,0,0,357,0,0,0,0,0,0,0,220,5.1,0,0,6000.0,77777,9,999999999,54,0.1810,0,88,0.102,0.0,0.0 +2011,9,14,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,17.8,81,101057,0,0,355,0,0,0,0,0,0,0,220,4.1,0,0,6000.0,77777,9,999999999,57,0.1800,0,88,0.102,0.0,0.0 +2011,9,14,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,17.8,81,101057,0,0,355,0,0,0,0,0,0,0,220,4.1,0,0,6000.0,77777,9,999999999,57,0.1800,0,88,0.102,0.0,0.0 +2011,9,14,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,17.8,87,101056,0,0,350,0,0,0,0,0,0,0,200,4.1,0,0,6000.0,77777,9,999999999,57,0.1800,0,88,0.102,0.0,0.0 +2011,9,14,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,18.3,87,101057,0,0,353,0,0,0,0,0,0,0,210,4.1,0,0,6000.0,77777,9,999999999,60,0.1800,0,88,0.102,0.0,0.0 +2011,9,14,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,18.3,87,101057,0,0,353,0,0,0,0,0,0,0,210,4.1,0,0,6000.0,77777,9,999999999,60,0.1800,0,88,0.102,0.0,0.0 +2011,9,14,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,18.3,84,101157,16,83,356,0,0,0,0,0,0,0,220,4.1,0,0,6000.0,77777,9,999999999,60,0.1800,0,88,0.102,0.0,0.0 +2011,9,14,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,18.3,79,101197,275,1351,361,76,143,50,8613,1758,5682,1889,230,4.6,0,0,6000.0,77777,9,999999999,60,0.1800,0,88,0.102,0.0,0.0 +2011,9,14,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,18.3,79,101197,520,1351,361,212,296,113,24085,14819,12889,4576,230,4.6,0,0,6000.0,77777,9,999999999,60,0.1800,0,88,0.102,0.0,0.0 +2011,9,14,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.6,18.3,64,101217,733,1351,378,377,449,163,43425,27652,18863,7147,260,3.6,0,0,6000.0,77777,9,999999999,60,0.1800,0,88,0.102,0.0,0.0 +2011,9,14,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,18.9,62,101227,900,1351,384,527,552,192,61613,35060,22560,8962,230,4.1,0,0,6000.0,77777,9,999999999,63,0.1800,0,88,0.102,0.0,0.0 +2011,9,14,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,18.9,62,101227,1010,1351,401,651,669,179,77821,40515,21502,8861,230,4.1,3,3,6000.0,77777,9,999999999,63,0.1800,0,88,0.102,0.0,0.0 +2011,9,14,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,18.3,55,101168,1056,1351,409,719,717,176,86672,43265,21319,8854,210,3.6,3,3,6000.0,77777,9,999999999,59,0.1800,0,88,0.102,0.0,0.0 +2011,9,14,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.3,18.3,55,101158,1033,1351,440,391,360,113,48567,19277,14089,5960,210,4.6,9,9,6000.0,1341,9,999999999,59,0.1800,0,88,0.102,0.0,0.0 +2011,9,14,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,28.3,18.3,55,101158,944,1351,409,216,179,77,27247,8859,9741,4092,210,4.6,3,3,6000.0,1341,9,999999999,59,0.1800,0,88,0.102,0.0,0.0 +2011,9,14,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,30.0,18.3,50,101118,794,1351,418,403,384,171,46745,23974,19929,7712,250,6.2,3,3,6000.0,77777,9,999999999,59,0.1800,0,88,0.102,0.0,0.0 +2011,9,14,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,18.3,53,101128,594,1351,412,322,288,169,35991,18086,18982,6552,250,6.2,3,3,6000.0,77777,9,999999999,59,0.1800,0,88,0.102,0.0,0.0 +2011,9,14,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,28.9,18.3,53,101128,358,1351,443,177,200,120,19178,9058,13061,3888,250,6.2,9,9,6000.0,77777,0,019999999,59,0.1800,0,88,0.102,0.0,0.0 +2011,9,14,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,25.0,21.1,79,101207,102,1351,424,94,122,65,9495,0,6601,1121,200,3.1,9,9,8047.0,1524,0,019999999,79,0.1800,0,88,0.102,0.0,0.0 +2011,9,14,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,19.4,79,101237,0,531,389,0,0,0,0,0,0,0,190,3.6,5,5,8047.0,77777,0,019999999,67,0.1800,0,88,0.102,0.0,0.0 +2011,9,14,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,19.4,79,101237,0,0,383,0,0,0,0,0,0,0,190,3.6,3,3,8047.0,77777,9,999999999,67,0.1800,0,88,0.102,0.0,0.0 +2011,9,14,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,18.9,82,101297,0,0,377,0,0,0,0,0,0,0,210,3.6,3,3,8047.0,77777,9,999999999,64,0.1800,0,88,0.102,2.0,0.0 +2011,9,14,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,18.9,84,101337,0,0,375,0,0,0,0,0,0,0,190,2.6,3,3,8047.0,77777,9,999999999,64,0.1800,0,88,0.102,0.0,0.0 +2011,9,14,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,18.9,84,101337,0,0,375,0,0,0,0,0,0,0,190,2.6,3,3,8047.0,77777,9,999999999,64,0.1800,0,88,0.102,0.0,0.0 +2011,9,14,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,18.3,87,101326,0,0,374,0,0,0,0,0,0,0,204,0.0,5,5,8047.0,77777,9,999999999,60,0.1800,0,88,0.102,0.0,0.0 +2011,9,15,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.1,18.9,87,101297,0,0,400,0,0,0,0,0,0,0,206,0.0,9,9,9656.0,1372,9,999999999,64,0.1790,0,88,0.102,0.0,0.0 +2011,9,15,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,21.1,18.9,87,101297,0,0,400,0,0,0,0,0,0,0,203,0.0,9,9,9000.0,1372,9,999999999,64,0.1790,0,88,0.102,0.0,0.0 +2011,9,15,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.0,19.0,88,101282,0,0,411,0,0,0,0,0,0,0,210,3.1,10,10,9656.0,518,9,999999999,64,0.1790,0,88,0.102,0.0,0.0 +2011,9,15,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.6,18.9,90,101157,0,0,397,0,0,0,0,0,0,0,190,2.1,9,9,8047.0,366,9,999999999,64,0.1790,0,88,0.102,0.0,0.0 +2011,9,15,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,20.6,18.9,90,101157,0,0,408,0,0,0,0,0,0,0,190,2.1,10,10,8000.0,366,9,999999999,64,0.1790,0,88,0.102,0.0,0.0 +2011,9,15,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.7,19.4,87,101127,11,59,415,0,0,0,0,0,0,0,200,3.1,10,10,8047.0,244,9,999999999,67,0.1790,0,88,0.102,0.0,0.0 +2011,9,15,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,22.0,19.0,83,101282,271,1352,416,19,0,19,1848,0,1863,810,190,4.6,10,10,8047.0,305,9,999999999,64,0.1790,0,88,0.102,0.0,0.0 +2011,9,15,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,21.7,19.4,87,101087,516,1352,415,185,237,97,21232,10696,11173,4048,200,4.1,10,10,8000.0,305,9,999999999,67,0.1790,0,88,0.102,0.0,0.0 +2011,9,15,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.0,19.0,78,101282,729,1352,422,180,38,164,20692,2318,18941,7158,200,4.1,10,10,8000.0,77777,9,999999999,64,0.1790,0,88,0.102,0.0,0.0 +2011,9,15,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.0,19.0,74,101282,896,1352,416,208,23,197,24248,1475,23082,9123,210,4.6,9,9,8000.0,2286,9,999999999,64,0.1790,0,88,0.102,0.0,0.0 +2011,9,15,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,24.4,19.4,74,101067,1006,1352,419,412,143,306,47166,10680,35250,13373,210,3.6,9,9,8000.0,2286,9,999999999,67,0.1790,0,88,0.102,0.0,0.0 +2011,9,15,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.7,19.4,64,100937,1051,1352,444,439,114,353,50023,8973,40492,15041,260,3.1,10,10,8000.0,1067,9,999999999,66,0.1790,0,88,0.102,0.0,0.0 +2011,9,15,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,27.0,18.0,58,101282,1027,1352,432,240,49,202,28516,3132,24125,9848,290,8.2,9,9,8000.0,1433,9,999999999,58,0.1790,0,88,0.102,0.0,0.0 +2011,9,15,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,26.1,18.3,62,100877,938,1352,427,444,152,336,49963,12383,38055,13626,310,5.7,9,9,8000.0,1433,9,999999999,59,0.1790,0,88,0.102,0.0,0.0 +2011,9,15,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,15.0,64,100877,788,1352,401,142,21,127,16884,1242,15160,6024,20,4.1,9,9,8000.0,1494,9,999999999,43,0.1790,0,88,0.102,0.0,0.0 +2011,9,15,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,15.6,68,100927,588,1352,399,225,138,164,25233,8890,18479,6375,50,2.6,9,9,8000.0,1676,9,999999999,46,0.1790,0,88,0.102,0.0,0.0 +2011,9,15,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,15.6,68,100927,351,1352,399,132,29,122,14285,1397,13263,3868,50,2.6,9,9,8000.0,1676,9,999999999,46,0.1790,0,88,0.102,0.0,0.0 +2011,9,15,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,12.2,65,101026,94,1352,390,42,0,42,4049,0,4077,1051,330,7.2,10,10,8000.0,1128,9,999999999,33,0.1790,0,88,0.102,0.0,0.0 +2011,9,15,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,13.3,78,101126,0,491,383,0,0,0,0,0,0,0,320,7.2,10,10,8000.0,1829,0,919999999,37,0.1790,0,88,0.102,0.0,0.0 +2011,9,15,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.2,13.3,78,101126,0,0,383,0,0,0,0,0,0,0,320,7.2,10,10,8000.0,1829,0,919999999,37,0.1790,0,88,0.102,0.8,0.0 +2011,9,15,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.0,12.0,77,101281,0,0,375,0,0,0,0,0,0,0,320,9.3,10,10,8000.0,1128,0,919999999,32,0.1790,0,88,0.102,0.0,0.0 +2011,9,15,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,6.1,59,101375,0,0,357,0,0,0,0,0,0,0,320,8.8,10,10,8000.0,3048,0,919999999,18,0.1790,0,88,0.102,0.0,0.0 +2011,9,15,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.9,6.1,59,101375,0,0,357,0,0,0,0,0,0,0,320,8.7,10,10,8000.0,3048,0,919999999,18,0.1790,0,88,0.102,0.0,0.0 +2011,9,15,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,4.4,57,101465,0,0,316,0,0,0,0,0,0,0,310,7.7,3,3,8000.0,77777,0,919999999,15,0.1790,0,88,0.102,0.0,0.0 +2011,9,16,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,3.9,57,101535,0,0,300,0,0,0,0,0,0,0,320,6.2,0,0,8000.0,77777,0,919999999,14,0.1780,0,88,0.102,0.0,0.0 +2011,9,16,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,3.9,57,101535,0,0,300,0,0,0,0,0,0,0,320,6.2,0,0,8000.0,77777,0,919999999,14,0.1780,0,88,0.102,0.0,0.0 +2011,9,16,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,3.9,61,101665,0,0,295,0,0,0,0,0,0,0,290,5.1,0,0,8000.0,77777,0,919999999,15,0.1780,0,88,0.102,0.0,0.0 +2011,9,16,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,3.3,59,101765,0,0,295,0,0,0,0,0,0,0,310,7.2,0,0,8000.0,77777,0,919999999,14,0.1780,0,88,0.102,0.0,0.0 +2011,9,16,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,3.3,59,101765,0,0,295,0,0,0,0,0,0,0,310,7.2,0,0,8000.0,77777,0,919999999,14,0.1780,0,88,0.102,0.0,0.0 +2011,9,16,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,2.8,61,101975,7,34,290,0,0,0,0,0,0,0,290,4.6,0,0,8000.0,77777,0,919999999,13,0.1780,0,88,0.102,0.0,0.0 +2011,9,16,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,2.8,57,102085,266,1353,294,97,399,29,11542,4826,3455,1184,320,6.7,0,0,8000.0,77777,0,919999999,13,0.1780,0,88,0.102,0.0,0.0 +2011,9,16,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,2.8,57,102085,511,1353,294,261,674,52,31717,31065,6331,2368,320,6.7,0,0,8000.0,77777,0,919999999,13,0.1780,0,88,0.102,0.0,0.0 +2011,9,16,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,2.8,47,102225,725,1353,319,449,828,67,47999,82668,9883,1596,310,6.2,3,3,8000.0,77777,0,919999999,13,0.1780,0,88,0.102,0.0,0.0 +2011,9,16,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,3.3,45,102255,892,1353,325,612,901,76,65288,91315,10836,1999,320,6.2,3,3,8000.0,77777,0,919999999,14,0.1780,0,88,0.102,0.0,0.0 +2011,9,16,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,3.3,45,102255,1001,1353,325,733,939,81,78051,95638,11286,2391,320,6.2,3,3,8000.0,77777,0,919999999,14,0.1780,0,88,0.102,0.0,0.0 +2011,9,16,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,2.8,39,102255,1045,1353,337,799,955,83,84950,97341,11453,2608,310,6.7,5,5,8000.0,77777,0,919999999,13,0.1780,0,88,0.102,0.0,0.0 +2011,9,16,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,1.7,35,102226,1022,1353,338,806,955,84,85543,97131,11631,2522,330,6.2,5,5,8000.0,77777,0,919999999,12,0.1780,0,88,0.102,0.0,0.0 +2011,9,16,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,1.7,35,102226,932,1353,333,753,937,83,79952,94939,11690,2190,330,6.2,3,3,8000.0,77777,0,919999999,12,0.1780,0,88,0.102,0.0,0.0 +2011,9,16,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,1.1,31,102216,781,1353,342,644,901,80,68365,90236,11580,1793,330,6.2,5,5,8000.0,77777,0,919999999,11,0.1780,0,88,0.102,0.0,0.0 +2011,9,16,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,1.7,34,102256,581,1353,341,491,837,72,59078,45131,8685,3293,310,6.2,5,5,8000.0,77777,0,919999999,12,0.1780,0,88,0.102,0.0,0.0 +2011,9,16,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,1.7,34,102256,344,1353,341,307,715,60,35388,25046,6935,2357,310,6.2,5,5,8000.0,77777,0,919999999,12,0.1780,0,88,0.102,0.0,0.0 +2011,9,16,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,1.1,35,102375,87,1353,335,124,433,35,13249,0,3753,939,290,4.6,5,5,8000.0,77777,0,919999999,11,0.1780,0,88,0.102,0.0,0.0 +2011,9,16,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,0.6,35,102455,0,451,332,0,0,0,0,0,0,0,300,4.6,5,5,8000.0,77777,0,919999999,10,0.1780,0,88,0.102,0.0,0.0 +2011,9,16,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,0.6,35,102455,0,0,332,0,0,0,0,0,0,0,300,4.6,5,5,8000.0,77777,9,999999999,10,0.1780,0,88,0.102,0.0,0.0 +2011,9,16,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,2.2,44,102575,0,0,326,0,0,0,0,0,0,0,340,2.6,5,5,8000.0,77777,9,999999999,12,0.1780,0,88,0.102,0.0,0.0 +2011,9,16,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,2.8,51,102645,0,0,319,0,0,0,0,0,0,0,340,2.6,5,5,8000.0,77777,9,999999999,13,0.1780,0,88,0.102,0.0,0.0 +2011,9,16,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,2.8,51,102645,0,0,319,0,0,0,0,0,0,0,340,2.6,5,5,8000.0,77777,9,999999999,13,0.1780,0,88,0.102,0.0,0.0 +2011,9,16,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,2.8,53,102765,0,0,335,0,0,0,0,0,0,0,320,2.6,9,9,8000.0,7620,9,999999999,13,0.1780,0,88,0.102,0.0,0.0 +2011,9,17,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,2.8,54,102794,0,0,333,0,0,0,0,0,0,0,300,3.1,9,9,8000.0,7620,9,999999999,13,0.1760,0,88,0.102,0.0,0.0 +2011,9,17,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,2.8,54,102794,0,0,333,0,0,0,0,0,0,0,300,3.1,9,9,8000.0,7620,9,999999999,13,0.1760,0,88,0.102,0.0,0.0 +2011,9,17,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,2.8,58,102834,0,0,328,0,0,0,0,0,0,0,320,4.6,9,9,8000.0,7620,9,999999999,13,0.1760,0,88,0.102,0.0,0.0 +2011,9,17,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,2.8,61,102864,0,0,290,0,0,0,0,0,0,0,330,5.1,0,0,8000.0,77777,9,999999999,13,0.1760,0,88,0.102,0.0,0.0 +2011,9,17,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,2.8,61,102864,0,0,302,0,0,0,0,0,0,0,330,5.1,3,3,8000.0,77777,9,999999999,13,0.1760,0,88,0.102,0.0,0.0 +2011,9,17,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,3.3,66,102984,2,10,288,0,0,0,0,0,0,0,350,3.6,0,0,8000.0,77777,9,999999999,14,0.1760,0,88,0.102,0.0,0.0 +2011,9,17,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,3.3,61,103054,262,1354,310,91,364,30,10781,4191,3559,1215,340,3.6,5,5,8000.0,77777,9,999999999,14,0.1760,0,88,0.102,0.0,0.0 +2011,9,17,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,3.3,61,103054,507,1354,305,250,634,54,30259,29221,6549,2443,340,3.6,3,3,8000.0,77777,9,999999999,14,0.1760,0,88,0.102,0.0,0.0 +2011,9,17,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,3.3,45,103145,720,1354,311,434,793,71,46346,79138,10449,1619,38,1.5,0,0,8000.0,77777,9,999999999,14,0.1760,0,88,0.102,0.0,0.0 +2011,9,17,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,3.3,44,103155,887,1354,352,487,508,201,57126,38311,23693,9218,90,3.6,9,9,8000.0,5486,9,999999999,14,0.1760,0,88,0.102,0.0,0.0 +2011,9,17,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.6,3.3,44,103155,996,1354,352,679,787,125,83950,51152,15513,6461,90,3.6,9,9,8000.0,5486,9,999999999,14,0.1760,0,88,0.102,0.0,0.0 +2011,9,17,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,4.4,44,103105,1040,1354,339,779,920,93,82739,93878,12766,2748,100,4.1,5,5,8000.0,77777,9,999999999,15,0.1760,0,88,0.102,0.0,0.0 +2011,9,17,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,5.0,48,103075,1016,1354,357,784,915,97,83250,93339,13345,2681,110,3.6,9,9,8000.0,6706,9,999999999,16,0.1760,0,88,0.102,0.0,0.0 +2011,9,17,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.1,5.0,48,103075,926,1354,337,731,894,97,77626,90823,13566,2299,110,3.6,5,5,8000.0,6706,9,999999999,16,0.1760,0,88,0.102,0.0,0.0 +2011,9,17,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,6.7,54,103025,775,1354,339,625,860,91,76391,50806,11156,4477,110,4.1,5,5,8000.0,77777,9,999999999,19,0.1760,0,88,0.102,0.0,0.0 +2011,9,17,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,5.6,53,103055,574,1354,352,422,574,121,48630,35604,13997,5044,130,2.1,9,9,8000.0,6706,9,999999999,17,0.1760,0,88,0.102,0.0,0.0 +2011,9,17,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.0,5.6,53,103055,336,1354,352,234,372,77,26342,14320,8697,2828,130,2.1,9,9,8000.0,6706,9,999999999,17,0.1760,0,88,0.102,0.0,0.0 +2011,9,17,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,7.2,62,103045,79,1354,351,116,384,37,12226,0,3915,912,110,4.1,9,9,8000.0,4572,9,999999999,20,0.1760,0,88,0.102,0.0,0.0 +2011,9,17,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,6.7,60,103035,0,411,360,0,0,0,0,0,0,0,110,2.6,10,10,8000.0,4572,9,999999999,19,0.1760,0,88,0.102,0.0,0.0 +2011,9,17,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,14.4,6.7,60,103035,0,0,350,0,0,0,0,0,0,0,110,2.6,9,9,8000.0,4572,9,999999999,19,0.1760,0,88,0.102,0.0,0.0 +2011,9,17,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,7.8,67,103055,0,0,349,0,0,0,0,0,0,0,160,2.1,9,9,8000.0,6096,9,999999999,22,0.1760,0,88,0.102,0.0,0.0 +2011,9,17,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,7.8,67,103135,0,0,349,0,0,0,0,0,0,0,180,2.1,9,9,8000.0,4267,9,999999999,22,0.1760,0,88,0.102,0.0,0.0 +2011,9,17,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.9,7.8,67,103135,0,0,349,0,0,0,0,0,0,0,180,2.1,9,9,8000.0,4267,9,999999999,22,0.1760,0,88,0.102,0.0,0.0 +2011,9,17,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,7.2,62,103125,0,0,351,0,0,0,0,0,0,0,136,0.0,9,9,8000.0,4267,9,999999999,20,0.1760,0,88,0.102,0.0,0.0 +2011,9,18,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,6.7,62,103105,0,0,329,0,0,0,0,0,0,0,130,0.0,5,5,8000.0,77777,9,999999999,19,0.1750,0,88,0.102,0.0,0.0 +2011,9,18,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,6.7,62,103105,0,0,329,0,0,0,0,0,0,0,105,0.0,5,5,8000.0,77777,9,999999999,19,0.1750,0,88,0.102,0.0,0.0 +2011,9,18,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,7.2,71,103084,0,0,340,0,0,0,0,0,0,0,340,3.1,9,9,8000.0,4572,9,999999999,20,0.1750,0,88,0.102,0.0,0.0 +2011,9,18,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,7.2,74,103104,0,0,319,0,0,0,0,0,0,0,340,2.1,5,5,8000.0,77777,9,999999999,20,0.1750,0,88,0.102,0.0,0.0 +2011,9,18,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,7.2,74,103104,0,0,319,0,0,0,0,0,0,0,340,2.1,5,5,8000.0,77777,9,999999999,20,0.1750,0,88,0.102,0.0,0.0 +2011,9,18,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,6.1,68,103154,0,0,337,0,0,0,0,0,0,0,10,3.6,9,9,8000.0,4572,9,999999999,18,0.1750,0,88,0.102,0.0,0.0 +2011,9,18,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,6.1,62,103185,258,1341,344,14,0,14,1374,0,1384,603,10,4.1,9,9,8000.0,4572,9,999999999,18,0.1750,0,88,0.102,0.0,0.0 +2011,9,18,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,6.1,62,103185,503,1354,344,79,10,75,9305,495,8859,3242,10,4.1,9,9,8000.0,4572,9,999999999,18,0.1750,0,88,0.102,0.0,0.0 +2011,9,18,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,10.0,65,103175,716,1354,366,268,224,154,31087,14984,17941,6752,40,5.1,9,9,8000.0,4572,9,999999999,27,0.1750,0,88,0.102,0.0,0.0 +2011,9,18,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,6.7,50,103185,882,1354,364,419,293,242,48335,23278,28068,10559,90,6.2,9,9,8000.0,4572,9,999999999,19,0.1750,0,88,0.102,0.0,0.0 +2011,9,18,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.2,6.7,50,103185,991,1354,364,472,228,314,54260,19543,36317,13491,90,6.2,9,9,8000.0,4572,9,999999999,19,0.1750,0,88,0.102,0.0,0.0 +2011,9,18,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,9.4,60,103095,1035,1354,368,581,359,313,67167,29802,36406,13768,60,6.2,9,9,8000.0,4572,9,999999999,25,0.1750,0,88,0.102,0.0,0.0 +2011,9,18,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,8.9,54,103035,1010,1354,373,610,411,303,70458,34032,35209,13304,80,5.1,9,9,8000.0,6096,9,999999999,24,0.1750,0,88,0.102,0.0,0.0 +2011,9,18,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.3,8.9,54,103035,919,1354,373,455,196,312,51690,16936,35661,12840,80,5.1,9,9,8000.0,6096,9,999999999,24,0.1750,0,88,0.102,0.0,0.0 +2011,9,18,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,8.3,54,102945,768,1354,349,533,643,154,62458,43545,18124,6981,80,6.2,5,5,8000.0,77777,9,999999999,22,0.1750,0,88,0.102,0.0,0.0 +2011,9,18,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,8.9,58,102935,567,1354,346,460,758,88,54191,40572,10399,3878,60,6.2,5,5,8000.0,77777,9,999999999,24,0.1750,0,88,0.102,0.0,0.0 +2011,9,18,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,8.9,58,102935,329,1354,346,284,640,68,32170,21141,7726,2555,60,6.2,5,5,8000.0,77777,9,999999999,24,0.1750,0,88,0.102,0.0,0.0 +2011,9,18,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,8.3,62,102905,71,1354,338,109,344,36,11430,0,3790,853,60,5.1,5,5,8000.0,77777,9,999999999,23,0.1750,0,88,0.102,0.0,0.0 +2011,9,18,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,8.3,62,102865,0,371,338,0,0,0,0,0,0,0,60,5.1,5,5,8000.0,77777,9,999999999,23,0.1750,0,88,0.102,0.0,0.0 +2011,9,18,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,8.3,62,102865,0,0,333,0,0,0,0,0,0,0,60,5.1,3,3,8000.0,77777,9,999999999,23,0.1750,0,88,0.102,0.0,0.0 +2011,9,18,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,6.7,58,102855,0,0,315,0,0,0,0,0,0,0,60,4.1,0,0,8000.0,77777,9,999999999,19,0.1750,0,88,0.102,0.0,0.0 +2011,9,18,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,7.8,69,102835,0,0,322,0,0,0,0,0,0,0,350,2.6,3,3,8000.0,77777,9,999999999,22,0.1750,0,88,0.102,0.0,0.0 +2011,9,18,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,7.8,69,102835,0,0,322,0,0,0,0,0,0,0,350,2.6,3,3,8000.0,77777,9,999999999,22,0.1750,0,88,0.102,0.0,0.0 +2011,9,18,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,7.8,72,102745,0,0,320,0,0,0,0,0,0,0,360,3.1,3,3,8000.0,77777,9,999999999,22,0.1750,0,88,0.102,0.0,0.0 +2011,9,19,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,7.8,74,102705,0,0,317,0,0,0,0,0,0,0,350,3.1,3,3,8000.0,77777,9,999999999,22,0.1740,0,88,0.102,0.0,0.0 +2011,9,19,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,7.8,74,102705,0,0,317,0,0,0,0,0,0,0,350,3.1,3,3,8000.0,77777,9,999999999,22,0.1740,0,88,0.102,0.0,0.0 +2011,9,19,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,8.3,80,102625,0,0,315,0,0,0,0,0,0,0,10,4.1,3,3,8000.0,77777,9,999999999,23,0.1740,0,88,0.102,0.0,0.0 +2011,9,19,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,8.3,83,102614,0,0,318,0,0,0,0,0,0,0,360,3.1,5,5,8000.0,77777,9,999999999,23,0.1740,0,88,0.102,0.0,0.0 +2011,9,19,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,8.3,83,102614,0,0,318,0,0,0,0,0,0,0,360,3.1,5,5,8000.0,77777,9,999999999,23,0.1740,0,88,0.102,0.0,0.0 +2011,9,19,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,8.3,86,102624,0,0,315,0,0,0,0,0,0,0,360,3.6,5,5,8000.0,77777,9,999999999,23,0.1740,0,88,0.102,0.0,0.0 +2011,9,19,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,8.9,77,102615,253,1317,326,83,298,34,9684,2695,3974,1341,360,4.1,5,5,8000.0,77777,9,999999999,24,0.1740,0,88,0.102,0.0,0.0 +2011,9,19,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,8.9,77,102615,498,1355,321,239,584,59,28612,25777,7079,2627,360,4.1,3,3,8000.0,77777,9,999999999,24,0.1740,0,88,0.102,0.0,0.0 +2011,9,19,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,10.6,67,102595,711,1355,341,422,765,77,51571,41302,9435,3742,30,5.7,3,3,8000.0,77777,9,999999999,28,0.1740,0,88,0.102,0.0,0.0 +2011,9,19,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,10.6,63,102585,878,1355,351,583,848,88,62768,86809,12501,2079,30,4.1,5,5,8000.0,77777,9,999999999,28,0.1740,0,88,0.102,0.0,0.0 +2011,9,19,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,10.6,63,102585,986,1355,351,702,892,93,75464,91802,12919,2494,30,4.1,5,5,8000.0,77777,9,999999999,28,0.1740,0,88,0.102,0.0,0.0 +2011,9,19,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,8.3,54,102486,1030,1355,349,768,912,96,82062,93574,13196,2730,90,4.6,5,5,8000.0,77777,9,999999999,22,0.1740,0,88,0.102,0.0,0.0 +2011,9,19,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,8.9,56,102396,1005,1355,349,776,913,97,82998,93687,13390,2621,80,5.7,5,5,8000.0,77777,9,999999999,24,0.1740,0,88,0.102,0.0,0.0 +2011,9,19,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,8.9,56,102396,913,1355,349,722,892,97,77224,91133,13612,2251,80,5.7,5,5,8000.0,77777,9,999999999,24,0.1740,0,88,0.102,0.0,0.0 +2011,9,19,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,8.3,56,102275,761,1355,346,614,850,93,74698,49691,11349,4535,100,4.6,5,5,8000.0,77777,9,999999999,22,0.1740,0,88,0.102,0.0,0.0 +2011,9,19,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,8.9,60,102245,560,1355,344,461,776,85,54372,40864,10056,3748,110,4.1,5,5,8000.0,77777,9,999999999,24,0.1740,0,88,0.102,0.0,0.0 +2011,9,19,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,8.9,60,102245,322,1355,344,281,641,67,31793,20432,7604,2503,110,4.1,5,5,8000.0,77777,9,999999999,24,0.1740,0,88,0.102,0.0,0.0 +2011,9,19,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,10.0,72,102175,64,1355,337,106,337,36,11024,0,3760,795,110,4.6,5,5,8000.0,77777,9,999999999,27,0.1740,0,88,0.102,0.0,0.0 +2011,9,19,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,11.1,77,102155,0,331,333,0,0,0,0,0,0,0,130,4.6,3,3,8000.0,77777,9,999999999,30,0.1740,0,88,0.102,0.0,0.0 +2011,9,19,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,11.1,77,102155,0,0,333,0,0,0,0,0,0,0,130,4.6,3,3,8000.0,77777,9,999999999,30,0.1740,0,88,0.102,0.0,0.0 +2011,9,19,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,11.1,83,102165,0,0,328,0,0,0,0,0,0,0,190,3.1,3,3,8000.0,77777,9,999999999,30,0.1740,0,88,0.102,0.0,0.0 +2011,9,19,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,10.6,84,102115,0,0,325,0,0,0,0,0,0,0,180,2.6,3,3,8000.0,77777,9,999999999,28,0.1740,0,88,0.102,0.0,0.0 +2011,9,19,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,10.6,84,102115,0,0,330,0,0,0,0,0,0,0,180,2.6,5,5,8000.0,77777,9,999999999,28,0.1740,0,88,0.102,0.0,0.0 +2011,9,19,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,10.6,84,102035,0,0,359,0,0,0,0,0,0,0,200,3.6,10,10,8000.0,7620,9,999999999,28,0.1740,0,88,0.102,0.0,0.0 +2011,9,20,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,11.1,81,102005,0,0,366,0,0,0,0,0,0,0,190,3.1,10,10,8000.0,7620,9,999999999,30,0.1720,0,88,0.102,0.0,0.0 +2011,9,20,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,14.4,11.1,81,102005,0,0,366,0,0,0,0,0,0,0,190,3.1,10,10,8000.0,7620,9,999999999,30,0.1720,0,88,0.102,0.0,0.0 +2011,9,20,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,11.1,87,101905,0,0,331,0,0,0,0,0,0,0,200,3.1,5,5,8000.0,77777,9,999999999,30,0.1720,0,88,0.102,0.0,0.0 +2011,9,20,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,11.1,89,101915,0,0,328,0,0,0,0,0,0,0,190,2.6,5,5,8000.0,77777,9,999999999,30,0.1720,0,88,0.102,0.0,0.0 +2011,9,20,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,11.1,89,101915,0,0,328,0,0,0,0,0,0,0,190,2.6,5,5,8000.0,77777,9,999999999,30,0.1720,0,88,0.102,0.0,0.0 +2011,9,20,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,11.1,83,101935,0,0,353,0,0,0,0,0,0,0,200,3.1,9,9,8000.0,4267,9,999999999,30,0.1720,0,88,0.102,0.0,0.0 +2011,9,20,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,11.7,81,101935,249,1294,369,22,0,22,2150,0,2166,911,210,3.1,10,10,8000.0,2438,9,999999999,32,0.1720,0,88,0.102,0.0,0.0 +2011,9,20,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.0,11.7,81,101935,494,1356,369,34,0,34,3394,0,3422,1587,210,3.1,10,10,8000.0,2438,9,999999999,32,0.1720,0,88,0.102,0.0,0.0 +2011,9,20,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,12.8,78,101936,707,1356,380,53,0,53,5382,0,5429,2651,230,4.6,10,10,8000.0,1219,9,999999999,35,0.1720,0,88,0.102,0.0,0.0 +2011,9,20,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,13.9,84,101916,873,1356,381,152,2,151,18092,126,18051,7259,200,4.6,10,10,8000.0,1524,0,919999999,39,0.1720,0,88,0.102,0.0,0.0 +2011,9,20,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.7,13.9,84,101916,981,1356,381,191,5,188,22730,333,22482,9122,200,4.6,10,10,8000.0,1524,0,919999999,39,0.1720,0,88,0.102,0.0,0.0 +2011,9,20,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.2,15.0,87,101846,1024,1356,385,119,1,118,14748,57,14680,6180,210,4.1,10,10,9656.0,1524,0,919999999,44,0.1720,0,88,0.102,0.0,0.0 +2011,9,20,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.0,15.0,88,101281,999,1356,384,124,0,124,12877,0,13001,6417,210,5.7,10,10,6437.0,792,0,919999999,43,0.1720,0,88,0.102,0.0,0.0 +2011,9,20,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,15.6,87,101806,907,1356,389,129,0,129,13289,0,13414,6438,200,4.1,10,10,6437.0,792,0,919999999,46,0.1720,0,88,0.102,0.0,0.0 +2011,9,20,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,16.1,87,101766,755,1356,392,259,84,212,29370,5981,24167,8789,220,4.1,10,10,6437.0,671,0,919999999,49,0.1720,0,88,0.102,0.0,0.0 +2011,9,20,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,16.1,84,101766,553,1356,395,211,60,183,23253,4065,20270,6562,240,4.1,10,10,6437.0,732,0,919999999,49,0.1720,0,88,0.102,0.0,0.0 +2011,9,20,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.9,16.1,84,101766,314,1356,395,137,79,109,14779,3251,11811,3384,240,4.1,10,10,6437.0,732,0,919999999,49,0.1720,0,88,0.102,0.0,0.0 +2011,9,20,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,15.6,79,101846,56,1356,398,40,49,35,4121,0,3622,731,240,4.1,10,10,6437.0,732,0,919999999,46,0.1720,0,88,0.102,0.0,0.0 +2011,9,20,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,15.6,79,101916,0,291,398,0,0,0,0,0,0,0,230,3.1,10,10,6437.0,823,0,919999999,46,0.1720,0,88,0.102,0.0,0.0 +2011,9,20,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,19.4,15.6,79,101916,0,0,398,0,0,0,0,0,0,0,230,3.1,10,10,6437.0,823,9,999999999,46,0.1720,0,88,0.102,0.0,0.0 +2011,9,20,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,15.6,87,101996,0,0,357,0,0,0,0,0,0,0,240,4.1,5,5,6437.0,77777,9,999999999,46,0.1720,0,88,0.102,3.0,0.0 +2011,9,20,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,15.0,84,102026,0,0,356,0,0,0,0,0,0,0,230,4.1,5,5,6437.0,77777,9,999999999,44,0.1720,0,88,0.102,0.3,0.0 +2011,9,20,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,15.0,84,102026,0,0,336,0,0,0,0,0,0,0,230,4.1,0,0,6437.0,77777,9,999999999,44,0.1720,0,88,0.102,0.0,0.0 +2011,9,20,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,15.0,87,102086,0,0,334,0,0,0,0,0,0,0,250,3.1,0,0,6437.0,77777,9,999999999,44,0.1720,0,88,0.102,0.0,0.0 +2011,9,21,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,14.4,84,102116,0,0,333,0,0,0,0,0,0,0,260,2.6,0,0,6437.0,77777,9,999999999,41,0.1710,0,88,0.102,0.0,0.0 +2011,9,21,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,14.4,84,102116,0,0,333,0,0,0,0,0,0,0,260,2.6,0,0,6437.0,77777,9,999999999,41,0.1710,0,88,0.102,0.0,0.0 +2011,9,21,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,14.4,86,102165,0,0,331,0,0,0,0,0,0,0,270,3.1,0,0,6437.0,77777,9,999999999,41,0.1710,0,88,0.102,0.0,0.0 +2011,9,21,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,13.9,87,102205,0,0,327,0,0,0,0,0,0,0,290,2.6,0,0,6437.0,77777,9,999999999,39,0.1710,0,88,0.102,0.0,0.0 +2011,9,21,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,13.9,87,102205,0,0,347,0,0,0,0,0,0,0,290,2.6,5,5,6437.0,77777,9,999999999,39,0.1710,0,88,0.102,0.0,0.0 +2011,9,21,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,15.0,13.0,88,101281,0,0,341,0,0,0,0,0,0,0,300,3.6,5,5,805.0,77777,0,999999999,36,0.1710,0,88,0.102,0.0,0.0 +2011,9,21,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,16.0,14.0,88,101281,244,1270,341,71,219,36,8193,1069,4163,1393,306,0.0,3,3,2414.0,77777,0,999999999,39,0.1710,0,88,0.102,0.0,0.0 +2011,9,21,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.2,14.4,84,102325,489,1357,347,215,469,70,25265,19920,8249,3027,290,2.1,3,3,2400.0,77777,0,999999999,41,0.1710,0,88,0.102,0.0,0.0 +2011,9,21,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,14.4,68,102396,702,1357,364,389,654,97,46524,35592,11640,4567,273,0.0,3,3,2400.0,77777,0,999999999,41,0.1710,0,88,0.102,0.0,0.0 +2011,9,21,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,15.6,73,102376,868,1357,365,545,746,114,66139,42380,13886,5687,120,2.1,3,3,2400.0,77777,0,999999999,46,0.1710,0,88,0.102,0.0,0.0 +2011,9,21,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,15.6,73,102376,976,1357,371,665,813,115,81968,46068,14228,5958,120,2.1,5,5,2400.0,77777,0,999999999,46,0.1710,0,88,0.102,0.0,0.0 +2011,9,21,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,15.6,62,102306,1019,1357,385,601,506,239,70503,35734,28192,11210,120,3.1,5,5,2400.0,77777,0,999999999,46,0.1710,0,88,0.102,0.0,0.0 +2011,9,21,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,14.4,66,102276,993,1357,372,547,346,292,62974,27099,33819,12840,110,6.2,5,5,2400.0,77777,0,999999999,41,0.1710,0,88,0.102,0.0,0.0 +2011,9,21,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,14.4,66,102276,901,1357,372,511,330,287,58056,26430,32802,12000,110,6.2,5,5,2400.0,77777,0,999999999,41,0.1710,0,88,0.102,0.0,0.0 +2011,9,21,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,15.0,73,102216,748,1357,367,442,319,254,49369,25133,28533,9825,110,6.2,5,5,2400.0,77777,0,999999999,44,0.1710,0,88,0.102,0.0,0.0 +2011,9,21,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,15.6,73,102206,545,1357,371,358,405,168,39683,26333,18713,6177,100,4.6,5,5,2400.0,77777,0,999999999,46,0.1710,0,88,0.102,0.0,0.0 +2011,9,21,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,15.6,73,102206,307,1357,371,192,222,114,20588,9541,12280,3397,100,4.6,5,5,2400.0,77777,0,999999999,46,0.1710,0,88,0.102,0.0,0.0 +2011,9,21,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,15.6,68,102226,48,1357,377,71,93,44,7105,0,4427,573,200,5.1,5,5,2400.0,77777,0,999999999,46,0.1710,0,88,0.102,0.0,0.0 +2011,9,21,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,15.6,76,102276,0,251,368,0,0,0,0,0,0,0,190,3.1,5,5,2400.0,77777,0,999999999,46,0.1710,0,88,0.102,0.0,0.0 +2011,9,21,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,15.6,76,102276,0,0,390,0,0,0,0,0,0,0,190,3.1,9,9,2400.0,77777,9,999999999,46,0.1710,0,88,0.104,0.0,0.0 +2011,9,21,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,15.6,76,102286,0,0,390,0,0,0,0,0,0,0,200,4.6,9,9,2400.0,3658,9,999999999,46,0.1710,0,88,0.104,0.0,0.0 +2011,9,21,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,15.6,76,102286,0,0,401,0,0,0,0,0,0,0,200,4.1,10,10,2400.0,3353,9,999999999,46,0.1710,0,88,0.104,0.0,0.0 +2011,9,21,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,15.6,76,102286,0,0,401,0,0,0,0,0,0,0,200,4.1,10,10,2400.0,3353,9,999999999,46,0.1710,0,88,0.104,0.0,0.0 +2011,9,21,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,17.2,87,102236,0,0,400,0,0,0,0,0,0,0,170,2.1,10,10,2400.0,1341,9,999999999,54,0.1710,0,88,0.104,0.8,0.0 +2011,9,22,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.0,17.0,88,101281,0,0,397,0,0,0,0,0,0,0,160,2.1,10,10,2400.0,427,9,999999999,53,0.1700,0,88,0.104,0.0,0.0 +2011,9,22,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,19.4,17.2,87,102196,0,0,400,0,0,0,0,0,0,0,170,3.1,10,10,2400.0,427,9,999999999,54,0.1700,0,88,0.104,0.0,0.0 +2011,9,22,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,17.2,90,102086,0,0,397,0,0,0,0,0,0,0,140,2.1,10,10,2400.0,152,9,999999999,54,0.1700,0,88,0.104,0.0,0.0 +2011,9,22,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,17.8,90,102066,0,0,400,0,0,0,0,0,0,0,162,0.0,10,10,2400.0,152,9,999999999,58,0.1700,0,88,0.104,0.0,0.0 +2011,9,22,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,19.4,17.8,90,102066,0,0,400,0,0,0,0,0,0,0,165,0.0,10,10,2400.0,152,0,919999999,58,0.1700,0,88,0.104,0.0,0.0 +2011,9,22,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,18.0,17.0,94,101281,0,0,392,0,0,0,0,0,0,0,80,1.5,10,10,8047.0,244,0,919999999,53,0.1700,0,88,0.104,0.0,0.0 +2011,9,22,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,19.4,18.3,93,102046,240,1247,401,7,0,7,680,0,685,307,130,2.1,10,10,9656.0,152,0,919999999,61,0.1700,0,88,0.104,0.0,0.0 +2011,9,22,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,19.4,18.3,93,102046,485,1357,401,42,0,42,4165,0,4199,1919,130,2.1,10,10,9000.0,152,0,919999999,61,0.1700,0,88,0.104,0.0,0.0 +2011,9,22,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.0,19.0,88,101282,698,1357,411,186,62,154,21354,3686,17760,6661,168,1.5,10,10,4828.0,244,0,919999999,64,0.1700,0,88,0.104,0.0,0.0 +2011,9,22,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.0,19.0,88,101282,863,1357,411,222,20,210,25599,1327,24343,9393,80,2.6,10,10,9656.0,427,0,919999999,64,0.1700,0,88,0.104,0.0,0.0 +2011,9,22,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,20.6,18.3,87,102026,971,1357,408,142,6,138,17213,341,16799,6988,80,2.6,10,10,9000.0,427,0,919999999,60,0.1700,0,88,0.104,0.0,0.0 +2011,9,22,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.0,19.0,88,101282,1013,1357,411,181,5,177,21648,301,21273,8774,120,5.1,10,10,2414.0,549,0,919999999,64,0.1700,0,88,0.104,0.0,0.0 +2011,9,22,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.0,20.0,94,101282,987,1357,412,292,25,273,33596,1767,31598,12202,130,3.6,10,10,2414.0,1250,0,919999999,71,0.1700,0,88,0.104,0.0,0.0 +2011,9,22,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,19.4,90,101896,894,1357,400,333,73,285,37645,5487,32414,11889,130,2.6,9,9,2414.0,1250,0,919999999,67,0.1700,0,88,0.104,0.0,0.0 +2011,9,22,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.0,20.0,88,101282,741,1357,418,281,67,243,31312,4836,27233,9499,110,2.1,10,10,2414.0,884,0,919999999,71,0.1700,0,88,0.104,0.0,0.0 +2011,9,22,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,18.9,87,101846,538,1357,411,152,97,106,17410,4692,12187,4416,140,2.6,10,10,2414.0,671,0,919999999,64,0.1700,0,88,0.104,0.0,0.0 +2011,9,22,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,18.9,87,101846,299,1357,411,197,277,107,21115,10138,11521,3242,140,2.6,10,10,2414.0,671,0,919999999,64,0.1700,0,88,0.104,0.0,0.0 +2011,9,22,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.0,19.0,88,101282,41,1357,411,68,104,41,6764,0,4101,503,120,3.1,10,10,2414.0,518,0,919999999,64,0.1700,0,88,0.104,0.0,0.0 +2011,9,22,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.0,19.0,88,101282,0,211,411,0,0,0,0,0,0,0,165,0.0,10,10,2414.0,671,0,919999999,64,0.1700,0,88,0.104,0.0,0.0 +2011,9,22,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,18.9,93,101846,0,0,394,0,0,0,0,0,0,0,188,0.0,9,9,2414.0,671,9,999999999,64,0.1700,0,88,0.104,1.0,0.0 +2011,9,22,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.0,20.0,88,101282,0,0,377,0,0,0,0,0,0,0,220,3.6,3,3,2414.0,77777,9,999999999,71,0.1700,0,88,0.104,0.0,0.0 +2011,9,22,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,19.4,84,101916,0,0,406,0,0,0,0,0,0,0,220,3.6,9,9,2414.0,2438,9,999999999,67,0.1700,0,88,0.104,0.0,0.0 +2011,9,22,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,19.4,84,101916,0,0,384,0,0,0,0,0,0,0,220,3.6,5,5,2414.0,2438,9,999999999,67,0.1700,0,88,0.104,0.0,0.0 +2011,9,22,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,19.0,94,101281,0,0,372,0,0,0,0,0,0,0,160,1.5,5,5,2414.0,274,9,999999999,65,0.1700,0,88,0.104,0.0,0.0 +2011,9,23,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,18.9,93,101916,0,0,366,0,0,0,0,0,0,0,226,0.0,3,3,2414.0,77777,9,999999999,64,0.1690,0,88,0.104,0.0,0.0 +2011,9,23,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,18.9,93,101916,0,0,351,0,0,0,0,0,0,0,231,0.0,0,0,2414.0,77777,9,999999999,64,0.1690,0,88,0.104,0.0,0.0 +2011,9,23,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.0,19.0,100,101281,0,0,389,0,0,0,0,0,0,0,240,1.5,9,9,2414.0,77777,9,999999999,65,0.1690,0,88,0.104,0.0,0.0 +2011,9,23,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,19.4,93,101896,0,0,409,0,0,0,0,0,0,0,210,3.1,10,10,2414.0,183,9,999999999,67,0.1690,0,88,0.104,0.0,0.0 +2011,9,23,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.6,19.4,93,101896,0,0,409,0,0,0,0,0,0,0,210,3.1,10,10,2414.0,183,9,999999999,67,0.1690,0,88,0.104,0.0,0.0 +2011,9,23,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.0,19.0,88,101282,0,0,411,0,0,0,0,0,0,0,260,2.1,10,10,9656.0,6096,9,999999999,64,0.1690,0,88,0.104,0.0,0.0 +2011,9,23,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,19.4,87,102006,235,1223,415,29,0,29,2811,0,2832,1148,280,2.1,10,10,9656.0,4267,9,999999999,67,0.1690,0,88,0.104,0.0,0.0 +2011,9,23,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,19.4,87,102006,480,1358,415,94,12,90,10758,503,10337,3696,280,2.1,10,10,9656.0,4267,9,999999999,67,0.1690,0,88,0.104,0.0,0.0 +2011,9,23,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.0,19.0,78,101282,693,1358,410,198,56,170,22530,3479,19437,7148,261,0.0,9,9,9656.0,610,0,999999999,64,0.1690,0,88,0.104,0.0,0.0 +2011,9,23,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,19.0,18.0,94,101281,859,1358,379,252,39,228,28871,2728,26263,9949,80,2.6,8,8,3219.0,30,0,999999999,58,0.1690,0,88,0.104,0.0,0.0 +2011,9,23,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,19.4,18.3,93,102056,966,1358,401,293,49,261,33777,3512,30262,11681,90,2.1,10,10,400.0,30,0,999999999,61,0.1690,0,88,0.104,0.0,0.0 +2011,9,23,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,21.0,19.0,88,101282,1008,1358,411,279,37,253,32427,2556,29574,11648,70,3.1,10,10,3219.0,549,0,999999999,64,0.1690,0,88,0.104,0.0,0.0 +2011,9,23,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,18.9,93,101966,981,1358,405,278,22,262,32094,1558,30424,11805,80,3.1,10,10,3219.0,671,0,919999999,64,0.1690,0,88,0.104,0.0,0.0 +2011,9,23,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,18.9,93,101966,888,1358,405,292,32,270,33134,2366,30819,11416,80,3.1,10,10,3219.0,671,0,919999999,64,0.1690,0,88,0.104,0.0,0.0 +2011,9,23,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,19.0,19.0,100,101281,734,1358,400,194,8,189,22058,520,21598,7970,80,2.1,10,10,2414.0,61,0,919999999,65,0.1690,0,88,0.104,0.0,0.0 +2011,9,23,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,19.0,19.0,100,101281,531,1358,400,143,2,142,15967,112,15928,5443,70,3.1,10,10,4828.0,61,0,919999999,65,0.1690,0,88,0.104,0.0,0.0 +2011,9,23,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,18.9,18.3,96,101876,292,1358,398,56,2,55,6331,33,6236,2073,80,3.6,10,10,1600.0,61,0,919999999,61,0.1690,0,88,0.104,0.0,0.0 +2011,9,23,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,18.0,18.0,100,101281,33,1358,393,12,0,12,1144,0,1152,382,80,3.1,10,10,3219.0,610,0,919999999,59,0.1690,0,88,0.104,0.0,0.0 +2011,9,23,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,18.0,18.0,100,101281,0,171,393,0,0,0,0,0,0,0,80,3.1,10,10,2414.0,61,0,919999999,59,0.1690,0,88,0.104,0.0,0.0 +2011,9,23,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,18.3,17.8,97,101826,0,0,394,0,0,0,0,0,0,0,80,3.1,10,10,1600.0,61,0,919999999,58,0.1690,0,88,0.104,5.0,0.0 +2011,9,23,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,18.0,18.0,100,101281,0,0,393,0,0,0,0,0,0,0,70,3.1,10,10,3219.0,61,0,919999999,59,0.1690,0,88,0.104,5.0,0.0 +2011,9,23,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,18.0,18.0,100,101281,0,0,393,0,0,0,0,0,0,0,70,4.1,10,10,3219.0,366,0,919999999,59,0.1690,0,88,0.104,5.0,0.0 +2011,9,23,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,19.4,18.3,93,101706,0,0,401,0,0,0,0,0,0,0,70,3.6,10,10,800.0,366,0,919999999,60,0.1690,0,88,0.104,5.0,0.0 +2011,9,23,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,18.3,17.8,97,101606,0,0,394,0,0,0,0,0,0,0,90,3.6,10,10,805.0,61,0,919999999,58,0.1690,0,88,0.104,2.9,0.0 +2011,9,24,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,18.3,17.8,97,101546,0,0,394,0,0,0,0,0,0,0,90,3.6,10,10,805.0,61,0,919999999,58,0.1670,0,88,0.104,0.0,0.0 +2011,9,24,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,18.3,17.8,97,101546,0,0,394,0,0,0,0,0,0,0,90,3.6,10,10,800.0,61,0,919999999,58,0.1670,0,88,0.104,0.0,0.0 +2011,9,24,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,19.0,19.0,100,101281,0,0,400,0,0,0,0,0,0,0,110,3.1,10,10,805.0,427,0,919999999,65,0.1670,0,88,0.104,0.0,0.0 +2011,9,24,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.0,19.0,94,101281,0,0,405,0,0,0,0,0,0,0,130,1.5,10,10,805.0,853,0,919999999,65,0.1670,0,88,0.104,0.0,0.0 +2011,9,24,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,20.6,97,101436,0,0,413,0,0,0,0,0,0,0,190,4.1,10,10,805.0,853,0,919999999,76,0.1670,0,88,0.104,0.0,0.0 +2011,9,24,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.0,20.0,94,101282,0,0,401,0,0,0,0,0,0,0,200,3.1,9,9,805.0,77777,0,919999999,71,0.1670,0,88,0.104,0.0,0.0 +2011,9,24,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.0,20.0,94,101282,230,1199,401,39,24,35,4462,0,4013,1339,190,4.1,9,9,805.0,305,0,919999999,71,0.1670,0,88,0.104,0.0,0.0 +2011,9,24,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,20.0,93,101536,476,1359,412,108,39,96,12274,1654,10951,3871,200,2.6,10,10,805.0,305,0,919999999,71,0.1670,0,88,0.104,0.0,0.0 +2011,9,24,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,20.6,85,101667,688,1359,426,152,25,143,17490,1392,16527,6244,210,5.1,10,10,805.0,518,0,919999999,76,0.1670,0,88,0.104,0.0,0.0 +2011,9,24,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,20.6,87,101677,854,1359,423,229,45,201,26406,2853,23298,9029,180,3.1,10,10,805.0,518,0,919999999,76,0.1670,0,88,0.104,0.0,0.0 +2011,9,24,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.8,20.6,87,101677,961,1359,423,152,1,151,18227,56,18188,7523,180,3.1,10,10,805.0,518,0,919999999,76,0.1670,0,88,0.104,0.0,0.0 +2011,9,24,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,20.6,77,101617,1002,1359,436,229,10,222,26820,637,26142,10505,240,3.1,10,10,805.0,853,0,919999999,75,0.1670,0,88,0.104,0.0,0.0 +2011,9,24,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,20.6,72,101567,975,1359,442,346,64,299,39414,4695,34272,12912,250,4.1,10,10,805.0,732,0,919999999,75,0.1670,0,88,0.104,0.0,0.0 +2011,9,24,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,26.1,20.6,72,101567,882,1359,442,258,21,243,29438,1440,27884,10564,250,4.1,10,10,805.0,732,0,919999999,75,0.1670,0,88,0.104,0.0,0.0 +2011,9,24,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.0,21.0,74,101282,728,1359,442,298,121,232,33204,8407,25996,9107,240,1.5,10,10,805.0,1097,0,919999999,78,0.1670,0,88,0.104,0.0,0.0 +2011,9,24,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,20.6,77,101537,524,1359,424,228,86,189,24773,5525,20646,6420,240,1.5,9,9,805.0,3658,0,919999999,75,0.1670,0,88,0.104,0.0,0.0 +2011,9,24,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.0,20.6,77,101537,284,1359,436,145,105,110,15388,3653,11730,3158,242,1.8,10,10,805.0,3658,0,919999999,75,0.1670,0,88,0.104,0.0,0.0 +2011,9,24,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,20.0,76,101667,25,1359,431,54,68,34,5352,0,3388,396,210,2.1,10,10,805.0,6096,0,919999999,71,0.1670,0,88,0.104,0.0,0.0 +2011,9,24,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,20.0,79,101667,0,130,428,0,0,0,0,0,0,0,210,2.1,10,10,805.0,6706,0,919999999,71,0.1670,0,88,0.104,0.0,0.0 +2011,9,24,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.9,20.0,79,101667,0,0,428,0,0,0,0,0,0,0,210,2.1,10,10,805.0,6706,9,999999999,71,0.1670,0,88,0.104,0.0,0.0 +2011,9,24,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,20.6,91,101736,0,0,419,0,0,0,0,0,0,0,200,1.5,10,10,805.0,6096,9,999999999,76,0.1670,0,88,0.104,5.0,0.0 +2011,9,24,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,20.6,91,101766,0,0,419,0,0,0,0,0,0,0,230,3.6,10,10,805.0,7620,9,999999999,76,0.1670,0,88,0.104,5.0,0.0 +2011,9,24,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,20.6,91,101766,0,0,408,0,0,0,0,0,0,0,230,3.6,9,9,805.0,7620,9,999999999,76,0.1670,0,88,0.104,0.9,0.0 +2011,9,24,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,20.6,87,101687,0,0,388,0,0,0,0,0,0,0,290,3.1,5,5,805.0,77777,9,999999999,76,0.1670,0,88,0.104,0.0,0.0 +2011,9,25,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,20.6,91,101687,0,0,408,0,0,0,0,0,0,0,260,1.5,9,9,805.0,3658,9,999999999,76,0.1660,0,88,0.104,0.0,0.0 +2011,9,25,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,20.6,91,101687,0,0,419,0,0,0,0,0,0,0,260,1.5,10,10,805.0,3658,9,999999999,76,0.1660,0,88,0.104,0.0,0.0 +2011,9,25,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,19.4,87,101736,0,0,415,0,0,0,0,0,0,0,220,2.1,10,10,805.0,3353,9,999999999,67,0.1660,0,88,0.104,0.0,0.0 +2011,9,25,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,19.4,84,101717,0,0,418,0,0,0,0,0,0,0,260,1.5,10,10,805.0,3353,9,999999999,67,0.1660,0,88,0.104,0.0,0.0 +2011,9,25,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,19.4,84,101717,0,0,418,0,0,0,0,0,0,0,260,1.5,10,10,805.0,3353,9,999999999,67,0.1660,0,88,0.104,0.0,0.0 +2011,9,25,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,18.9,82,101756,0,0,406,0,0,0,0,0,0,0,300,3.6,9,9,805.0,4267,9,999999999,64,0.1660,0,88,0.104,0.0,0.0 +2011,9,25,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,18.9,82,101786,226,1175,406,3,0,3,291,0,293,133,354,2.1,9,9,805.0,4267,9,999999999,64,0.1660,0,88,0.104,0.0,0.0 +2011,9,25,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,18.9,82,101786,471,1360,406,34,0,34,3365,0,3393,1567,352,2.1,9,9,805.0,4267,9,999999999,64,0.1660,0,88,0.104,0.0,0.0 +2011,9,25,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,19.4,76,101857,683,1360,416,195,121,134,22561,6726,15569,5910,10,2.1,9,9,805.0,4267,9,999999999,67,0.1660,0,88,0.104,0.0,0.0 +2011,9,25,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,20.0,74,101847,849,1360,423,377,320,185,43747,19845,21574,8442,350,2.6,9,9,805.0,7500,9,999999999,71,0.1660,0,88,0.104,0.0,0.0 +2011,9,25,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.0,20.0,74,101847,955,1360,423,512,369,272,58620,26328,31328,11956,350,2.6,9,9,805.0,7500,9,999999999,71,0.1660,0,88,0.104,0.0,0.0 +2011,9,25,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,20.6,82,101747,997,1360,417,570,392,291,65282,28180,33534,12817,140,4.1,9,9,805.0,4500,9,999999999,75,0.1660,0,88,0.104,0.0,0.0 +2011,9,25,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.0,19.0,83,101282,969,1360,405,488,220,331,55173,17441,37664,13742,130,2.6,9,9,805.0,77777,9,999999999,64,0.1660,0,88,0.104,0.0,0.0 +2011,9,25,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.0,19.0,83,101716,875,1360,416,436,193,309,48815,15318,34814,12313,140,3.1,10,10,805.0,77777,9,999999999,65,0.1660,0,88,0.104,0.0,0.0 +2011,9,25,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,19.4,84,101657,721,1360,418,345,145,259,38109,11008,28779,9658,140,2.1,10,10,805.0,6706,9,999999999,67,0.1660,0,88,0.104,0.0,0.0 +2011,9,25,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,19.4,87,101636,517,1360,415,271,180,187,29458,11745,20436,6316,130,2.1,10,10,805.0,6096,9,999999999,67,0.1660,0,88,0.104,0.0,0.0 +2011,9,25,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,19.4,87,101636,277,1360,415,142,87,106,15096,2968,11322,3048,130,2.1,10,10,805.0,6096,9,999999999,67,0.1660,0,88,0.104,0.0,0.0 +2011,9,25,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,18.9,87,101646,17,1360,411,40,17,35,3918,0,3448,253,264,0.0,10,10,805.0,6706,9,999999999,64,0.1660,0,88,0.104,0.0,0.0 +2011,9,25,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,18.3,81,101616,0,90,414,0,0,0,0,0,0,0,227,0.0,10,10,805.0,6096,9,999999999,60,0.1660,0,88,0.104,0.0,0.0 +2011,9,25,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,18.3,81,101616,0,0,414,0,0,0,0,0,0,0,248,0.0,10,10,805.0,6096,9,999999999,60,0.1660,0,88,0.104,0.0,0.0 +2011,9,25,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,18.3,84,101606,0,0,399,0,0,0,0,0,0,0,180,1.5,9,9,805.0,6706,9,999999999,60,0.1660,0,88,0.104,0.0,0.0 +2011,9,25,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,18.3,84,101596,0,0,399,0,0,0,0,0,0,0,273,0.0,9,9,805.0,7620,9,999999999,60,0.1660,0,88,0.104,0.0,0.0 +2011,9,25,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,18.3,84,101596,0,0,399,0,0,0,0,0,0,0,275,0.0,9,9,805.0,7620,9,999999999,60,0.1660,0,88,0.104,0.0,0.0 +2011,9,25,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,18.3,90,101576,0,0,393,0,0,0,0,0,0,0,284,0.0,9,9,805.0,7620,9,999999999,60,0.1660,0,88,0.104,0.0,0.0 +2011,9,26,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,18.9,87,101596,0,0,356,0,0,0,0,0,0,0,301,0.0,0,0,805.0,77777,9,999999999,64,0.1650,0,88,0.104,0.0,0.0 +2011,9,26,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,18.9,87,101596,0,0,377,0,0,0,0,0,0,0,319,0.0,5,5,805.0,77777,9,999999999,64,0.1650,0,88,0.104,0.0,0.0 +2011,9,26,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,18.9,84,101467,0,0,381,0,0,0,0,0,0,0,300,2.1,5,5,805.0,77777,9,999999999,64,0.1650,0,88,0.104,0.0,0.0 +2011,9,26,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,18.3,81,101517,0,0,380,0,0,0,0,0,0,0,320,2.1,5,5,805.0,77777,9,999999999,60,0.1650,0,88,0.104,0.0,0.0 +2011,9,26,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,18.3,81,101517,0,0,380,0,0,0,0,0,0,0,320,2.1,5,5,805.0,77777,9,999999999,60,0.1650,0,88,0.104,0.0,0.0 +2011,9,26,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,16.7,76,101546,0,0,397,0,0,0,0,0,0,0,300,3.6,9,9,805.0,7620,9,999999999,51,0.1650,0,88,0.104,0.0,0.0 +2011,9,26,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,16.1,70,101606,221,1151,377,55,170,31,6353,0,3587,1197,290,3.1,5,5,805.0,77777,9,999999999,48,0.1650,0,88,0.104,0.0,0.0 +2011,9,26,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,16.1,70,101606,466,1361,377,197,469,57,23360,17048,6775,2493,290,3.1,5,5,805.0,77777,9,999999999,48,0.1650,0,88,0.104,0.0,0.0 +2011,9,26,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,15.6,62,101587,679,1361,385,321,454,133,37252,26884,15498,5855,90,2.1,5,5,805.0,77777,9,999999999,46,0.1650,0,88,0.104,0.0,0.0 +2011,9,26,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,15.6,62,101557,844,1361,408,422,363,215,48541,25684,24860,9433,80,3.1,9,9,805.0,6096,9,999999999,46,0.1650,0,88,0.104,0.0,0.0 +2011,9,26,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.3,15.6,62,101557,950,1361,408,513,385,262,59097,28797,30356,11603,80,3.1,9,9,805.0,6096,9,999999999,46,0.1650,0,88,0.104,0.0,0.0 +2011,9,26,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,15.0,60,101537,991,1361,407,564,387,292,64852,30167,33778,12806,80,2.6,9,9,805.0,6096,9,999999999,43,0.1650,0,88,0.104,0.0,0.0 +2011,9,26,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,15.0,60,101457,963,1361,407,577,403,290,66097,31603,33420,12549,80,2.6,9,9,805.0,6096,9,999999999,43,0.1650,0,88,0.104,0.0,0.0 +2011,9,26,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,23.3,15.0,60,101457,868,1361,418,538,413,263,61175,31930,30078,11055,80,2.6,10,10,805.0,6096,9,999999999,43,0.1650,0,88,0.104,0.0,0.0 +2011,9,26,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,15.0,61,101367,714,1361,416,465,456,202,52560,32449,22950,8208,130,2.6,10,10,805.0,6096,9,999999999,43,0.1650,0,88,0.104,0.0,0.0 +2011,9,26,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,15.6,64,101317,509,1361,405,362,540,128,40679,30054,14445,4947,130,2.6,9,9,805.0,7620,9,999999999,46,0.1650,0,88,0.104,0.0,0.0 +2011,9,26,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.8,15.6,64,101317,269,1361,382,208,448,84,22573,12604,9153,2669,130,2.6,5,5,805.0,7620,9,999999999,46,0.1650,0,88,0.104,0.0,0.0 +2011,9,26,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,16.1,73,101347,10,1361,374,70,196,26,6993,0,2611,335,150,2.6,5,5,805.0,77777,9,999999999,48,0.1650,0,88,0.104,0.0,0.0 +2011,9,26,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,16.7,76,101356,0,50,369,0,0,0,0,0,0,0,130,2.1,3,3,805.0,77777,9,999999999,51,0.1650,0,88,0.104,0.0,0.0 +2011,9,26,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,16.7,76,101356,0,0,354,0,0,0,0,0,0,0,130,2.1,0,0,805.0,77777,9,999999999,51,0.1650,0,88,0.104,0.0,0.0 +2011,9,26,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,16.7,81,101366,0,0,364,0,0,0,0,0,0,0,120,1.5,3,3,805.0,77777,9,999999999,51,0.1650,0,88,0.104,0.0,0.0 +2011,9,26,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,16.7,81,101376,0,0,364,0,0,0,0,0,0,0,140,1.5,3,3,805.0,77777,9,999999999,51,0.1650,0,88,0.104,0.0,0.0 +2011,9,26,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,16.7,81,101376,0,0,369,0,0,0,0,0,0,0,140,1.5,5,5,805.0,77777,9,999999999,51,0.1650,0,88,0.104,0.0,0.0 +2011,9,26,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,17.2,84,101346,0,0,364,0,0,0,0,0,0,0,323,0.0,3,3,805.0,77777,9,999999999,54,0.1650,0,88,0.104,0.0,0.0 +2011,9,27,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,17.2,87,101356,0,0,361,0,0,0,0,0,0,0,351,0.0,3,3,805.0,77777,9,999999999,54,0.1630,0,88,0.104,0.0,0.0 +2011,9,27,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,17.2,87,101356,0,0,361,0,0,0,0,0,0,0,10,0.0,3,3,805.0,77777,9,999999999,54,0.1630,0,88,0.104,0.0,0.0 +2011,9,27,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,16.7,90,101396,0,0,355,0,0,0,0,0,0,0,29,0.0,3,3,805.0,77777,9,999999999,51,0.1630,0,88,0.104,0.0,0.0 +2011,9,27,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,16.1,87,101396,0,0,355,0,0,0,0,0,0,0,44,0.0,3,3,805.0,77777,9,999999999,48,0.1630,0,88,0.104,0.0,0.0 +2011,9,27,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,16.1,87,101396,0,0,355,0,0,0,0,0,0,0,52,0.0,3,3,805.0,77777,9,999999999,48,0.1630,0,88,0.104,0.0,0.0 +2011,9,27,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,18.3,16.7,90,101466,0,0,355,0,0,0,0,0,0,0,360,2.1,3,3,8047.0,77777,9,999999999,51,0.1630,0,88,0.104,0.0,0.0 +2011,9,27,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,16.7,84,101496,216,1127,361,57,192,30,6585,0,3472,1158,360,2.1,3,3,8047.0,77777,9,999999999,51,0.1630,0,88,0.104,0.0,0.0 +2011,9,27,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,16.7,84,101496,461,1361,388,187,407,68,21835,15550,7962,2891,360,2.1,9,9,8047.0,77777,9,999999999,51,0.1630,0,88,0.104,0.0,0.0 +2011,9,27,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,17.2,78,101556,674,1361,409,351,590,99,41589,30572,11770,4570,41,0.0,10,10,8047.0,305,9,999999999,54,0.1630,0,88,0.104,0.0,0.0 +2011,9,27,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.0,17.0,78,101282,838,1361,375,500,690,118,60140,38689,14247,5780,130,2.1,5,5,8047.0,77777,9,999999999,53,0.1630,0,88,0.104,0.0,0.0 +2011,9,27,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,17.2,78,101586,945,1361,375,612,745,128,74357,42393,15614,6477,120,2.1,5,5,8047.0,77777,9,999999999,54,0.1630,0,88,0.104,0.0,0.0 +2011,9,27,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,15.6,68,101567,985,1361,377,671,762,137,81695,45146,16749,6970,80,6.7,5,5,8047.0,77777,9,999999999,46,0.1630,0,88,0.104,0.0,0.0 +2011,9,27,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,16.7,73,101537,957,1361,378,674,753,143,81386,44543,17341,7164,90,6.2,5,5,8047.0,77777,9,999999999,51,0.1630,0,88,0.104,0.0,0.0 +2011,9,27,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,16.7,73,101537,862,1361,378,617,704,152,73076,42905,18082,7248,90,6.2,5,5,8047.0,77777,9,999999999,51,0.1630,0,88,0.104,0.0,0.0 +2011,9,27,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,16.7,78,101576,707,1361,394,474,521,176,54026,34095,20157,7401,80,4.6,9,9,8047.0,7620,9,999999999,51,0.1630,0,88,0.104,0.0,0.0 +2011,9,27,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.0,17.0,78,101282,502,1361,408,275,228,171,30081,14614,18800,5893,70,5.1,10,10,8047.0,488,9,999999999,53,0.1630,0,88,0.104,0.0,0.0 +2011,9,27,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,16.7,81,101576,262,1361,391,202,349,95,21609,10875,10208,2791,80,4.1,9,9,8047.0,488,9,999999999,51,0.1630,0,88,0.104,0.0,0.0 +2011,9,27,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,16.7,84,101626,366,1361,399,61,115,34,5877,0,3296,2,90,4.1,10,10,8047.0,427,9,999999999,51,0.1630,0,88,0.104,0.0,0.0 +2011,9,27,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,16.7,84,101686,0,9,399,0,0,0,0,0,0,0,130,2.6,10,10,8047.0,427,9,999999999,51,0.1630,0,88,0.104,0.0,0.0 +2011,9,27,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,19.4,16.7,84,101686,0,0,399,0,0,0,0,0,0,0,130,2.6,10,10,8047.0,427,9,999999999,51,0.1630,0,88,0.104,0.0,0.0 +2011,9,27,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.0,17.0,88,101281,0,0,397,0,0,0,0,0,0,0,80,2.6,10,10,8047.0,945,9,999999999,53,0.1630,0,88,0.104,0.0,0.0 +2011,9,27,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.0,17.0,88,101281,0,0,397,0,0,0,0,0,0,0,80,3.1,10,10,8047.0,1219,9,999999999,53,0.1630,0,88,0.104,0.0,0.0 +2011,9,27,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.9,16.7,87,101786,0,0,396,0,0,0,0,0,0,0,70,3.1,10,10,8047.0,1219,9,999999999,52,0.1630,0,88,0.104,0.0,0.0 +2011,9,27,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.0,17.0,88,101281,0,0,386,0,0,0,0,0,0,0,80,2.6,9,9,8047.0,914,9,999999999,53,0.1630,0,88,0.104,0.0,0.0 +2011,9,28,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.0,17.0,94,101281,0,0,381,0,0,0,0,0,0,0,90,3.1,9,9,8047.0,152,9,999999999,53,0.1620,0,88,0.104,0.0,0.0 +2011,9,28,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.3,16.7,90,101756,0,0,382,0,0,0,0,0,0,0,90,3.6,9,9,8047.0,152,9,999999999,52,0.1620,0,88,0.104,0.0,0.0 +2011,9,28,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,16.1,87,101756,0,0,381,0,0,0,0,0,0,0,90,3.6,9,9,8047.0,1219,9,999999999,49,0.1620,0,88,0.104,0.0,0.0 +2011,9,28,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,15.6,87,101776,0,0,378,0,0,0,0,0,0,0,90,3.6,9,9,8047.0,1219,9,999999999,46,0.1620,0,88,0.104,0.0,0.0 +2011,9,28,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,15.6,87,101776,0,0,378,0,0,0,0,0,0,0,90,3.6,9,9,8047.0,1219,9,999999999,46,0.1620,0,88,0.104,0.0,0.0 +2011,9,28,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,14.4,84,101846,0,0,353,0,0,0,0,0,0,0,90,2.6,5,5,8047.0,77777,9,999999999,41,0.1620,0,88,0.104,0.0,0.0 +2011,9,28,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,15.0,81,101886,212,1103,359,59,205,31,6793,0,3576,1183,80,2.6,5,5,8047.0,77777,9,999999999,44,0.1620,0,88,0.104,0.0,0.0 +2011,9,28,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,15.0,81,101886,457,1362,359,180,369,71,20949,14821,8287,2985,80,2.6,5,5,8047.0,77777,9,999999999,44,0.1620,0,88,0.104,0.0,0.0 +2011,9,28,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,15.6,76,101906,669,1362,362,350,569,98,41516,30186,11664,4517,70,5.1,3,3,8047.0,77777,9,999999999,46,0.1620,0,88,0.104,0.0,0.0 +2011,9,28,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,16.1,75,101886,833,1362,372,516,747,105,62605,41159,12784,5205,70,5.1,5,5,8047.0,77777,9,999999999,48,0.1620,0,88,0.104,0.0,0.0 +2011,9,28,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,16.1,75,101886,939,1362,372,636,834,97,69368,86801,13600,2328,70,5.1,5,5,8047.0,77777,9,999999999,48,0.1620,0,88,0.104,0.0,0.0 +2011,9,28,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,16.1,75,101856,979,1362,372,700,865,97,76348,90199,13503,2485,80,5.7,5,5,8047.0,77777,9,999999999,48,0.1620,0,88,0.104,0.0,0.0 +2011,9,28,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,17.2,81,101766,951,1362,373,703,863,98,76953,90176,13713,2378,80,7.2,5,5,8047.0,77777,9,999999999,54,0.1620,0,88,0.104,0.0,0.0 +2011,9,28,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,17.2,81,101766,855,1362,373,647,835,99,79050,44488,12137,4984,80,7.2,5,5,8047.0,77777,9,999999999,54,0.1620,0,88,0.104,0.0,0.0 +2011,9,28,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,16.7,81,101716,700,1362,369,538,783,96,64223,40846,11498,4513,100,7.2,5,5,8047.0,77777,9,999999999,51,0.1620,0,88,0.104,0.0,0.0 +2011,9,28,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,16.1,81,101686,495,1362,366,388,686,87,44799,30997,10078,3636,100,7.2,5,5,8047.0,77777,9,999999999,48,0.1620,0,88,0.104,0.0,0.0 +2011,9,28,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,16.1,81,101686,254,1362,387,214,489,69,23462,9517,7592,2299,100,7.2,9,9,8047.0,77777,9,999999999,48,0.1620,0,88,0.104,0.0,0.0 +2011,9,28,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,15.6,87,101686,0,1331,357,0,0,0,0,0,0,0,100,5.1,5,5,8047.0,77777,9,999999999,46,0.1620,0,88,0.104,0.0,0.0 +2011,9,28,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.0,16.0,88,101281,0,0,390,0,0,0,0,0,0,0,90,5.1,10,10,8047.0,823,9,999999999,48,0.1620,0,88,0.104,0.0,0.0 +2011,9,28,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.3,15.6,84,101696,0,0,392,0,0,0,0,0,0,0,100,5.7,10,10,8047.0,823,9,999999999,46,0.1620,0,88,0.104,4.0,0.0 +2011,9,28,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,15.6,84,101636,0,0,392,0,0,0,0,0,0,0,90,5.1,10,10,8047.0,762,9,999999999,46,0.1620,0,88,0.104,4.0,0.0 +2011,9,28,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,15.0,87,101556,0,0,385,0,0,0,0,0,0,0,80,5.1,10,10,8047.0,640,9,999999999,44,0.1620,0,88,0.104,4.0,0.0 +2011,9,28,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.2,15.0,87,101556,0,0,385,0,0,0,0,0,0,0,80,5.1,10,10,8047.0,640,9,999999999,44,0.1620,0,88,0.104,0.7,0.0 +2011,9,28,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.0,16.0,88,101281,0,0,390,0,0,0,0,0,0,0,80,5.1,10,10,8047.0,427,9,999999999,48,0.1620,0,88,0.104,0.0,0.0 +2011,9,29,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,16.1,90,101326,0,0,390,0,0,0,0,0,0,0,100,5.1,10,10,8047.0,305,9,999999999,48,0.1610,0,88,0.104,0.0,0.0 +2011,9,29,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,16.1,90,101326,0,0,390,0,0,0,0,0,0,0,100,5.1,10,10,8047.0,305,0,919999999,48,0.1610,0,88,0.104,0.0,0.0 +2011,9,29,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,18.0,16.0,88,101281,0,0,390,0,0,0,0,0,0,0,100,6.2,10,10,8047.0,305,0,919999999,48,0.1610,0,88,0.104,0.0,0.0 +2011,9,29,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,18.0,17.0,94,101281,0,0,392,0,0,0,0,0,0,0,90,4.6,10,10,4023.0,183,0,919999999,53,0.1610,0,88,0.104,0.0,0.0 +2011,9,29,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,16.7,93,101106,0,0,390,0,0,0,0,0,0,0,110,4.1,10,10,4023.0,183,0,919999999,51,0.1610,0,88,0.104,0.0,0.0 +2011,9,29,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,18.3,17.2,93,100986,0,0,394,0,0,0,0,0,0,0,100,3.6,10,10,8047.0,183,0,919999999,54,0.1610,0,88,0.104,0.0,0.0 +2011,9,29,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,18.9,17.2,90,100936,207,1079,397,1,0,1,97,0,98,44,100,5.1,10,10,9656.0,183,0,919999999,54,0.1610,0,88,0.104,0.0,0.0 +2011,9,29,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,18.9,17.2,90,100936,452,1363,397,14,0,14,1386,0,1397,666,100,5.1,10,10,9000.0,183,0,919999999,54,0.1610,0,88,0.104,0.0,0.0 +2011,9,29,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,18.0,17.0,94,101281,664,1363,392,97,0,97,9777,0,9862,4463,100,4.1,10,10,2414.0,122,0,919999999,53,0.1610,0,88,0.104,0.0,0.0 +2011,9,29,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,18.3,17.8,97,100816,828,1363,394,168,7,164,19650,432,19271,7577,100,4.1,10,10,805.0,61,0,919999999,57,0.1610,0,88,0.104,0.0,0.0 +2011,9,29,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,18.3,17.8,97,100816,934,1363,394,210,9,204,24559,593,23980,9520,100,4.1,10,10,800.0,61,0,919999999,57,0.1610,0,88,0.104,0.0,0.0 +2011,9,29,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,20.0,18.9,93,100647,973,1363,405,152,5,149,18303,288,18021,7464,110,3.6,10,10,805.0,122,0,919999999,64,0.1610,0,88,0.104,0.0,0.0 +2011,9,29,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,19.0,18.0,94,101281,944,1363,398,157,2,156,18773,119,18738,7678,100,3.6,10,10,2414.0,122,0,919999999,58,0.1610,0,88,0.104,0.0,0.0 +2011,9,29,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,20.0,18.9,93,100557,849,1363,405,192,6,188,22269,382,21914,8539,120,3.6,10,10,3200.0,122,0,919999999,64,0.1610,0,88,0.104,0.0,0.0 +2011,9,29,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,18.0,88,101281,693,1363,404,268,116,209,30004,8094,23523,8235,100,5.1,10,10,3200.0,579,0,919999999,58,0.1610,0,88,0.104,0.0,0.0 +2011,9,29,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,18.0,88,101281,487,1363,371,223,185,157,24454,11033,17300,5498,40,2.6,5,5,3200.0,122,0,919999999,58,0.1610,0,88,0.104,0.0,0.0 +2011,9,29,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,18.9,93,100237,246,1363,394,141,192,97,14930,5491,10319,2694,80,2.6,9,9,3200.0,77777,0,919999999,63,0.1610,0,88,0.104,0.0,0.0 +2011,9,29,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,22.0,19.0,83,101282,0,1291,416,0,0,0,0,0,0,0,230,14.4,10,10,2816.0,975,0,019999999,64,0.1610,0,88,0.104,0.0,0.0 +2011,9,29,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.0,16.0,83,101281,0,0,385,0,0,0,0,0,0,0,200,2.6,9,9,2816.0,3048,0,019999999,48,0.1610,0,88,0.104,0.0,0.0 +2011,9,29,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,19.4,17.2,87,100217,0,0,389,0,0,0,0,0,0,0,200,3.6,9,9,2816.0,3048,9,999999999,54,0.1610,0,88,0.101,6.0,0.0 +2011,9,29,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,16.7,87,100197,0,0,364,0,0,0,0,0,0,0,220,5.7,5,5,2816.0,77777,9,999999999,51,0.1610,0,88,0.101,5.2,0.0 +2011,9,29,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,16.1,81,100257,0,0,366,0,0,0,0,0,0,0,240,4.6,5,5,2816.0,77777,9,999999999,48,0.1610,0,88,0.101,0.0,0.0 +2011,9,29,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,16.1,81,100257,0,0,345,0,0,0,0,0,0,0,240,4.6,0,0,2816.0,77777,9,999999999,48,0.1610,0,88,0.101,0.0,0.0 +2011,9,29,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,14.4,86,100326,0,0,331,0,0,0,0,0,0,0,240,4.6,0,0,2816.0,77777,9,999999999,41,0.1610,0,88,0.101,0.0,0.0 +2011,9,30,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,14.4,90,100386,0,0,328,0,0,0,0,0,0,0,230,5.7,0,0,2816.0,77777,9,999999999,41,0.1590,0,88,0.101,0.0,0.0 +2011,9,30,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,14.4,90,100386,0,0,328,0,0,0,0,0,0,0,230,5.7,0,0,2816.0,77777,9,999999999,41,0.1590,0,88,0.101,0.0,0.0 +2011,9,30,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,13.9,90,100466,0,0,325,0,0,0,0,0,0,0,230,5.1,0,0,2816.0,77777,9,999999999,39,0.1590,0,88,0.101,0.0,0.0 +2011,9,30,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,13.3,90,100516,0,0,322,0,0,0,0,0,0,0,230,6.2,0,0,2816.0,77777,9,999999999,37,0.1590,0,88,0.101,0.0,0.0 +2011,9,30,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,13.3,90,100516,0,0,336,0,0,0,0,0,0,0,230,6.2,3,3,2816.0,77777,9,999999999,37,0.1590,0,88,0.101,0.0,0.0 +2011,9,30,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,12.2,87,100546,0,0,332,0,0,0,0,0,0,0,240,3.6,3,3,2816.0,77777,9,999999999,33,0.1590,0,88,0.101,0.0,0.0 +2011,9,30,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,12.8,87,100566,202,1054,335,56,222,27,6502,0,3140,1041,220,6.2,3,3,2816.0,77777,9,999999999,35,0.1590,0,88,0.101,0.0,0.0 +2011,9,30,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,12.8,87,100566,447,1364,335,190,467,59,22414,17799,6977,2533,220,6.2,3,3,2816.0,77777,9,999999999,35,0.1590,0,88,0.101,0.0,0.0 +2011,9,30,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,11.7,61,100647,659,1364,355,358,650,88,42844,35169,10564,4091,220,5.1,3,3,2816.0,77777,9,999999999,31,0.1590,0,88,0.101,0.0,0.0 +2011,9,30,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,12.8,59,100647,823,1364,364,505,726,111,61042,42548,13465,5438,200,4.6,3,3,2816.0,77777,9,999999999,34,0.1590,0,88,0.101,0.0,0.0 +2011,9,30,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,12.8,59,100647,928,1364,364,620,801,109,76276,46720,13457,5581,200,4.6,3,3,2816.0,77777,9,999999999,34,0.1590,0,88,0.101,0.0,0.0 +2011,9,30,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,12.8,50,100537,967,1364,384,681,832,109,84262,48449,13535,5653,210,6.7,5,5,2816.0,77777,9,999999999,34,0.1590,0,88,0.101,0.0,0.0 +2011,9,30,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,13.9,52,100477,938,1364,388,681,821,114,83564,47702,14040,5829,190,6.7,5,5,2816.0,77777,9,999999999,38,0.1590,0,88,0.101,0.0,0.0 +2011,9,30,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,13.9,52,100477,842,1364,388,623,779,120,75036,46004,14508,5870,190,6.7,5,5,2816.0,77777,9,999999999,38,0.1590,0,88,0.101,0.0,0.0 +2011,9,30,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,13.9,54,100467,686,1364,386,515,720,116,60548,41595,13689,5256,190,7.7,5,5,2816.0,77777,9,999999999,38,0.1590,0,88,0.101,0.0,0.0 +2011,9,30,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,15.0,60,100457,480,1364,384,347,530,112,39154,27273,12688,4357,200,6.2,5,5,2816.0,77777,9,999999999,43,0.1590,0,88,0.101,0.0,0.0 +2011,9,30,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.3,15.0,60,100457,239,1364,407,192,392,74,20817,8192,8054,2321,200,6.2,9,9,2816.0,77777,9,999999999,43,0.1590,0,88,0.101,0.0,0.0 +2011,9,30,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,14.4,66,100507,0,1251,394,0,0,0,0,0,0,0,180,3.6,9,9,2816.0,7620,9,999999999,40,0.1590,0,88,0.101,0.0,0.0 +2011,9,30,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.5,15.8,79,100703,0,0,389,0,0,0,0,0,0,0,145,2.7,9,9,2816.0,7620,9,999999999,47,0.1590,0,88,0.101,0.0,0.0 +2011,9,30,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,19.2,16.2,83,100681,0,0,367,0,0,0,0,0,0,0,147,2.6,5,5,2816.0,7620,9,999999999,49,0.1590,0,88,0.101,0.0,0.0 +2011,9,30,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.7,16.7,88,100869,0,0,363,0,0,0,0,0,0,0,147,1.8,5,5,2816.0,77777,9,999999999,51,0.1590,0,88,0.101,5.0,0.0 +2011,9,30,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.2,17.9,87,101070,0,0,386,0,0,0,0,0,0,0,162,3.5,9,9,2816.0,7620,9,999999999,58,0.1590,0,88,0.101,5.0,0.0 +2011,9,30,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,18.8,84,100914,0,0,396,0,0,0,0,0,0,0,172,4.9,10,10,2816.0,7620,9,999999999,63,0.1590,0,88,0.101,0.2,0.0 +2011,9,30,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.2,19.9,81,101126,0,0,392,0,0,0,0,0,0,0,184,6.6,10,10,2816.0,274,0,019999999,70,0.1590,0,88,0.101,0.0,0.0 +2010,10,1,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.9,20.9,79,100927,0,0,436,0,0,0,0,0,0,0,197,9.0,10,10,400.0,975,9,999999999,77,0.1580,0,88,0.093,0.0,0.0 +2010,10,1,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,24.7,20.9,80,100728,0,0,436,0,0,0,0,0,0,0,195,9.3,10,10,400.0,975,9,999999999,77,0.1580,0,88,0.093,0.0,0.0 +2010,10,1,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.6,20.9,80,100656,0,0,436,0,0,0,0,0,0,0,192,9.7,10,10,400.0,823,0,919999999,77,0.1580,0,88,0.093,0.0,0.0 +2010,10,1,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.5,21.0,80,100656,0,0,421,0,0,0,0,0,0,0,187,9.8,9,9,400.0,1676,0,919999999,78,0.1580,0,88,0.093,0.0,0.0 +2010,10,1,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,24.7,20.8,79,100614,0,0,421,0,0,0,0,0,0,0,185,10.2,9,9,400.0,1676,0,919999999,76,0.1580,0,88,0.093,0.0,0.0 +2010,10,1,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.1,20.7,76,100546,0,0,432,0,0,0,0,0,0,0,185,11.1,10,10,400.0,884,0,919999999,75,0.1580,0,88,0.093,0.0,0.0 +2010,10,1,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,21.0,78,101282,197,1030,424,39,55,32,4425,0,3639,1191,180,9.8,9,9,400.0,1433,0,919999999,78,0.1580,0,88,0.093,0.0,0.0 +2010,10,1,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,25.0,20.6,77,100318,442,1365,424,142,192,85,16146,7112,9698,3409,180,11.3,9,9,400.0,1433,0,919999999,75,0.1580,0,88,0.093,0.0,0.0 +2010,10,1,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.1,20.6,72,100218,654,1365,442,156,61,138,17874,3333,15881,5916,190,13.4,10,10,400.0,914,0,919999999,74,0.1580,0,88,0.093,0.0,0.0 +2010,10,1,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,26.0,21.0,74,101282,818,1365,430,204,30,186,23502,1839,21536,8311,200,11.8,9,9,400.0,853,0,919999999,78,0.1580,0,88,0.093,0.0,0.0 +2010,10,1,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,27.2,20.0,65,100168,923,1365,435,179,4,175,21100,240,20728,8369,200,12.9,9,9,400.0,853,0,919999999,70,0.1580,0,88,0.093,0.0,0.0 +2010,10,1,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,25.6,21.1,76,99958,961,1365,440,121,4,118,14768,205,14458,6057,180,12.9,10,10,9656.0,1006,0,919999999,78,0.1580,0,88,0.093,0.0,0.0 +2010,10,1,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,24.0,21.0,83,101282,932,1365,430,142,1,141,17025,54,16978,7005,190,11.3,10,10,8047.0,853,0,919999999,78,0.1580,0,88,0.093,0.0,0.0 +2010,10,1,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.8,20.6,87,100017,835,1365,423,98,0,98,9978,0,10071,4896,230,5.7,10,10,8047.0,853,0,919999999,75,0.1580,0,88,0.093,0.0,0.0 +2010,10,1,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.0,18.0,83,101282,679,1365,409,128,1,127,14873,56,14816,5634,330,4.1,10,10,8047.0,488,0,919999999,58,0.1580,0,88,0.093,0.0,0.0 +2010,10,1,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,19.0,18.0,94,101281,473,1365,398,47,0,47,4656,0,4695,2108,320,6.7,10,10,2414.0,244,0,919999999,58,0.1580,0,88,0.093,0.0,0.0 +2010,10,1,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,17.2,15.6,90,100156,231,1365,386,45,0,45,4377,0,4410,1635,320,7.2,10,10,8000.0,244,0,919999999,46,0.1580,0,88,0.093,0.0,0.0 +2010,10,1,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,16.1,14.4,90,100256,0,1212,378,0,0,0,0,0,0,0,320,7.2,10,10,6437.0,427,0,919999999,41,0.1580,0,88,0.093,0.0,0.0 +2010,10,1,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,16.0,14.0,88,101281,0,0,377,0,0,0,0,0,0,0,320,6.2,10,10,8047.0,488,0,919999999,39,0.1580,0,88,0.093,0.0,0.0 +2010,10,1,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,15.6,13.9,90,100326,0,0,375,0,0,0,0,0,0,0,320,7.7,10,10,4000.0,488,0,919999999,39,0.1580,0,88,0.093,4.0,0.0 +2010,10,1,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.0,13.0,82,101281,0,0,376,0,0,0,0,0,0,0,340,6.2,10,10,4000.0,732,0,919999999,36,0.1580,0,88,0.093,4.0,0.0 +2010,10,1,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,13.0,88,101281,0,0,371,0,0,0,0,0,0,0,330,6.7,10,10,4000.0,975,0,919999999,36,0.1580,0,88,0.093,0.9,0.0 +2010,10,1,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.0,12.8,87,100306,0,0,371,0,0,0,0,0,0,0,340,7.2,10,10,4000.0,975,0,919999999,35,0.1580,0,88,0.093,0.0,0.0 +2010,10,1,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,12.2,83,100346,0,0,370,0,0,0,0,0,0,0,320,5.1,10,10,4000.0,1524,0,919999999,33,0.1580,0,88,0.093,0.0,0.0 +2010,10,2,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,12.2,83,100436,0,0,370,0,0,0,0,0,0,0,320,5.7,10,10,4000.0,1829,0,919999999,33,0.1570,0,88,0.093,0.0,0.0 +2010,10,2,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.0,12.2,83,100436,0,0,370,0,0,0,0,0,0,0,320,5.7,10,10,4000.0,1829,0,919999999,33,0.1570,0,88,0.093,0.0,0.0 +2010,10,2,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,9.4,74,100566,0,0,332,0,0,0,0,0,0,0,300,6.2,5,5,4000.0,77777,0,919999999,25,0.1570,0,88,0.093,0.0,0.0 +2010,10,2,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,9.4,77,100646,0,0,310,0,0,0,0,0,0,0,300,6.7,0,0,4000.0,77777,0,919999999,25,0.1570,0,88,0.093,0.0,0.0 +2010,10,2,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,9.4,77,100646,0,0,310,0,0,0,0,0,0,0,300,6.7,0,0,4000.0,77777,0,919999999,25,0.1570,0,88,0.093,0.0,0.0 +2010,10,2,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,8.3,77,100845,0,0,323,0,0,0,0,0,0,0,300,5.7,5,5,4000.0,77777,0,919999999,22,0.1570,0,88,0.093,0.0,0.0 +2010,10,2,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,7.2,67,100946,192,1005,326,58,295,23,6810,0,2704,897,320,6.2,5,5,4000.0,77777,0,919999999,20,0.1570,0,88,0.093,0.0,0.0 +2010,10,2,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,7.2,67,100946,437,1365,321,201,581,46,24180,21641,5544,2022,320,6.2,3,3,4000.0,77777,0,919999999,20,0.1570,0,88,0.093,0.0,0.0 +2010,10,2,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,5.6,53,101146,649,1365,327,380,784,64,40810,77618,9584,1450,320,6.7,3,3,4000.0,77777,0,919999999,17,0.1570,0,88,0.093,0.0,0.0 +2010,10,2,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,5.0,48,101176,812,1365,332,538,873,74,57568,88120,10725,1796,330,5.7,3,3,4000.0,77777,0,919999999,16,0.1570,0,88,0.093,0.0,0.0 +2010,10,2,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,5.0,48,101176,917,1365,332,654,917,80,69844,93212,11344,2090,330,5.7,3,3,4000.0,77777,0,919999999,16,0.1570,0,88,0.093,0.0,0.0 +2010,10,2,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,6.1,46,101196,955,1365,341,716,935,83,76526,95365,11670,2236,300,3.6,3,3,4000.0,77777,0,919999999,18,0.1570,0,88,0.093,0.0,0.0 +2010,10,2,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,5.0,41,101226,925,1365,342,718,934,83,76597,94959,11729,2147,300,3.6,3,3,4000.0,77777,0,919999999,16,0.1570,0,88,0.093,0.0,0.0 +2010,10,2,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,5.0,41,101226,828,1365,342,660,914,82,70414,92315,11786,1894,300,3.6,3,3,4000.0,77777,0,919999999,16,0.1570,0,88,0.093,0.0,0.0 +2010,10,2,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,4.4,38,101306,671,1365,344,548,870,76,66679,48792,9272,3618,270,3.6,3,3,4000.0,77777,0,919999999,15,0.1570,0,88,0.093,0.0,0.0 +2010,10,2,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,3.9,36,101336,465,1365,346,392,787,67,46176,36318,7913,2860,350,3.6,3,3,4000.0,77777,0,919999999,14,0.1570,0,88,0.093,0.0,0.0 +2010,10,2,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,3.9,36,101336,224,1365,346,212,615,50,23740,8317,5615,1746,350,3.6,3,3,4000.0,77777,0,919999999,14,0.1570,0,88,0.093,0.0,0.0 +2010,10,2,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,4.4,44,101506,0,1172,334,0,0,0,0,0,0,0,10,4.6,3,3,4000.0,77777,0,919999999,15,0.1570,0,88,0.093,0.0,0.0 +2010,10,2,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,5.0,51,101625,0,0,313,0,0,0,0,0,0,0,10,4.1,0,0,4000.0,77777,0,919999999,16,0.1570,0,88,0.093,0.0,0.0 +2010,10,2,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,5.0,51,101625,0,0,313,0,0,0,0,0,0,0,10,4.1,0,0,4000.0,77777,9,999999999,16,0.1570,0,88,0.093,0.0,0.0 +2010,10,2,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,3.9,53,101765,0,0,305,0,0,0,0,0,0,0,350,3.6,0,0,4000.0,77777,9,999999999,14,0.1570,0,88,0.093,0.0,0.0 +2010,10,2,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,3.9,59,101825,0,0,298,0,0,0,0,0,0,0,350,3.1,0,0,4000.0,77777,9,999999999,15,0.1570,0,88,0.093,0.0,0.0 +2010,10,2,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,3.9,59,101825,0,0,298,0,0,0,0,0,0,0,350,3.1,0,0,4000.0,77777,9,999999999,15,0.1570,0,88,0.093,0.0,0.0 +2010,10,2,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,3.3,61,101885,0,0,293,0,0,0,0,0,0,0,340,4.1,0,0,4000.0,77777,9,999999999,14,0.1570,0,88,0.093,0.0,0.0 +2010,10,3,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,3.9,66,101945,0,0,291,0,0,0,0,0,0,0,350,4.1,0,0,4000.0,77777,9,999999999,15,0.1560,0,88,0.093,0.0,0.0 +2010,10,3,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,3.9,66,101945,0,0,303,0,0,0,0,0,0,0,350,4.1,3,3,4000.0,77777,9,999999999,15,0.1560,0,88,0.093,0.0,0.0 +2010,10,3,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,5.0,74,101944,0,0,302,0,0,0,0,0,0,0,360,3.6,3,3,4000.0,77777,9,999999999,16,0.1560,0,88,0.093,0.0,0.0 +2010,10,3,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,4.4,73,102004,0,0,299,0,0,0,0,0,0,0,340,3.1,3,3,4000.0,77777,9,999999999,15,0.1560,0,88,0.093,0.0,0.0 +2010,10,3,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,4.4,73,102004,0,0,299,0,0,0,0,0,0,0,340,3.1,3,3,4000.0,77777,9,999999999,15,0.1560,0,88,0.093,0.0,0.0 +2010,10,3,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,5.0,77,102054,0,0,304,0,0,0,0,0,0,0,10,4.6,5,5,4000.0,77777,9,999999999,16,0.1560,0,88,0.093,0.0,0.0 +2010,10,3,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,4.4,71,102124,188,980,306,52,246,22,6120,0,2592,858,10,4.6,5,5,4000.0,77777,9,999999999,15,0.1560,0,88,0.093,0.0,0.0 +2010,10,3,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,4.4,71,102124,432,1366,324,131,230,68,15287,10110,7957,2822,10,4.6,9,9,4000.0,77777,9,999999999,15,0.1560,0,88,0.093,0.0,0.0 +2010,10,3,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,6.1,66,102235,644,1366,339,221,158,152,25332,10819,17498,6313,10,6.2,9,9,4000.0,6096,9,999999999,18,0.1560,0,88,0.093,0.0,0.0 +2010,10,3,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,7.2,67,102235,807,1366,346,352,252,220,40344,19583,25346,9336,30,5.7,9,9,4000.0,6096,9,999999999,20,0.1560,0,88,0.093,0.0,0.0 +2010,10,3,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,7.2,67,102235,911,1366,355,381,159,281,43570,13323,32321,11868,30,5.7,10,10,4000.0,6096,9,999999999,20,0.1560,0,88,0.093,0.0,0.0 +2010,10,3,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,6.7,64,102235,949,1366,355,323,89,266,37332,7229,30918,11699,50,6.2,10,10,4000.0,914,9,999999999,19,0.1560,0,88,0.093,0.0,0.0 +2010,10,3,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,6.7,62,102175,919,1366,358,277,26,259,31929,2107,30021,11277,30,7.7,10,10,4000.0,914,9,999999999,19,0.1560,0,88,0.093,0.0,0.0 +2010,10,3,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.9,6.7,62,102175,822,1366,348,283,83,230,32409,6568,26479,9733,30,7.7,9,9,4000.0,914,9,999999999,19,0.1560,0,88,0.093,0.0,0.0 +2010,10,3,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,6.7,62,102095,664,1366,348,321,165,230,35716,13526,25729,8477,40,7.7,9,9,4000.0,4267,9,999999999,19,0.1560,0,88,0.093,0.0,0.0 +2010,10,3,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,5.6,57,102105,458,1366,347,194,188,130,21619,11457,14549,4705,30,7.7,9,9,4000.0,3962,9,999999999,17,0.1560,0,88,0.093,0.0,0.0 +2010,10,3,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.9,5.6,57,102105,216,1366,347,123,381,51,13698,4603,5697,1747,30,7.7,9,9,4000.0,3962,9,999999999,17,0.1560,0,88,0.093,0.0,0.0 +2010,10,3,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,5.6,62,102165,0,1133,351,0,0,0,0,0,0,0,30,5.7,10,10,4000.0,3353,9,999999999,17,0.1560,0,88,0.093,0.0,0.0 +2010,10,3,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,6.1,64,102145,0,0,342,0,0,0,0,0,0,0,40,6.7,9,9,4000.0,3353,9,999999999,18,0.1560,0,88,0.093,0.0,0.0 +2010,10,3,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.8,6.1,64,102145,0,0,342,0,0,0,0,0,0,0,40,6.7,9,9,4000.0,3353,9,999999999,18,0.1560,0,88,0.093,0.0,0.0 +2010,10,3,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,6.7,64,102255,0,0,355,0,0,0,0,0,0,0,40,5.7,10,10,4000.0,3353,9,999999999,19,0.1560,0,88,0.093,0.0,0.0 +2010,10,3,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,6.7,64,102255,0,0,355,0,0,0,0,0,0,0,40,7.7,10,10,4000.0,3658,9,999999999,19,0.1560,0,88,0.093,0.0,0.0 +2010,10,3,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,6.7,64,102255,0,0,345,0,0,0,0,0,0,0,40,7.7,9,9,4000.0,3658,9,999999999,19,0.1560,0,88,0.093,0.0,0.0 +2010,10,3,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,7.8,67,102205,0,0,359,0,0,0,0,0,0,0,40,9.8,10,10,4000.0,3353,9,999999999,21,0.1560,0,88,0.093,0.0,0.0 +2010,10,4,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,8.3,74,102255,0,0,354,0,0,0,0,0,0,0,50,8.2,10,10,4000.0,2896,0,919999999,23,0.1540,0,88,0.093,0.0,0.0 +2010,10,4,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.8,8.3,74,102255,0,0,354,0,0,0,0,0,0,0,50,8.2,10,10,4000.0,2896,0,919999999,23,0.1540,0,88,0.093,0.0,0.0 +2010,10,4,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,8.9,83,102175,0,0,350,0,0,0,0,0,0,0,40,9.8,10,10,4000.0,1829,0,919999999,24,0.1540,0,88,0.093,6.0,0.0 +2010,10,4,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,11.1,8.9,86,102235,0,0,347,0,0,0,0,0,0,0,30,9.8,10,10,9656.0,1524,0,919999999,24,0.1540,0,88,0.093,6.0,0.0 +2010,10,4,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,11.1,8.9,86,102235,0,0,347,0,0,0,0,0,0,0,30,9.8,10,10,9000.0,1524,0,919999999,24,0.1540,0,88,0.093,0.4,0.0 +2010,10,4,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,11.1,9.4,89,102175,0,0,347,0,0,0,0,0,0,0,40,10.3,10,10,9656.0,1524,0,919999999,25,0.1540,0,88,0.093,0.0,0.0 +2010,10,4,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,9.4,89,102275,183,955,347,2,0,2,195,0,196,87,30,8.8,10,10,9656.0,2591,0,919999999,25,0.1540,0,88,0.093,0.0,0.0 +2010,10,4,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.1,9.4,89,102275,427,1367,347,40,0,40,3975,0,4007,1771,30,8.7,10,10,9656.0,2591,0,919999999,25,0.1540,0,88,0.093,0.0,0.0 +2010,10,4,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,10.0,86,102255,638,1367,353,118,6,115,13788,358,13487,5059,50,8.2,10,10,9656.0,549,0,919999999,27,0.1540,0,88,0.093,0.0,0.0 +2010,10,4,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.0,10.0,88,101280,801,1367,352,171,6,167,19984,411,19605,7562,40,10.3,10,10,9656.0,427,0,919999999,27,0.1540,0,88,0.093,0.0,0.0 +2010,10,4,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.8,10.0,83,102245,905,1367,356,192,6,188,22611,422,22246,8789,40,9.3,10,10,9656.0,427,0,919999999,27,0.1540,0,88,0.093,0.0,0.0 +2010,10,4,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,10.6,80,102175,943,1367,363,216,10,209,25369,722,24672,9734,40,7.7,10,10,9656.0,488,0,919999999,28,0.1540,0,88,0.093,0.0,0.0 +2010,10,4,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,10.6,75,102105,912,1367,368,258,20,244,29790,1543,28328,10762,50,9.3,10,10,9656.0,549,0,919999999,28,0.1540,0,88,0.093,0.0,0.0 +2010,10,4,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.0,10.6,75,102105,815,1367,368,241,23,227,27541,1764,26079,9594,50,9.3,10,10,9656.0,549,0,919999999,28,0.1540,0,88,0.093,0.0,0.0 +2010,10,4,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.0,9.0,72,101280,657,1367,361,235,72,200,26380,5443,22565,7728,50,9.8,10,10,9656.0,1433,0,919999999,24,0.1540,0,88,0.093,0.0,0.0 +2010,10,4,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,8.9,75,101965,450,1367,357,217,264,130,24099,15595,14500,4659,40,8.8,10,10,9656.0,579,0,919999999,24,0.1540,0,88,0.093,0.0,0.0 +2010,10,4,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,8.9,75,101965,209,1367,357,63,5,61,6879,73,6684,1930,40,8.7,10,10,9656.0,579,0,919999999,24,0.1540,0,88,0.093,0.0,0.0 +2010,10,4,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,9.4,77,101995,0,1094,358,0,0,0,0,0,0,0,50,7.2,10,10,9656.0,640,0,919999999,25,0.1540,0,88,0.093,0.0,0.0 +2010,10,4,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,12.2,10.6,90,102015,0,0,354,0,0,0,0,0,0,0,50,10.3,10,10,8047.0,762,0,919999999,28,0.1540,0,88,0.093,0.0,0.0 +2010,10,4,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,12.2,10.6,90,102015,0,0,354,0,0,0,0,0,0,0,50,10.3,10,10,8000.0,762,0,919999999,28,0.1540,0,88,0.093,1.0,0.0 +2010,10,4,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,12.0,11.0,94,101280,0,0,353,0,0,0,0,0,0,0,50,8.2,10,10,6437.0,366,0,919999999,29,0.1540,0,88,0.093,0.0,0.0 +2010,10,4,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,12.0,11.0,94,101280,0,0,353,0,0,0,0,0,0,0,40,7.7,10,10,9656.0,366,0,919999999,29,0.1540,0,88,0.093,0.0,0.0 +2010,10,4,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,10.0,80,101945,0,0,359,0,0,0,0,0,0,0,50,8.7,10,10,9656.0,366,0,919999999,27,0.1540,0,88,0.093,0.0,0.0 +2010,10,4,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.0,11.0,88,101280,0,0,358,0,0,0,0,0,0,0,40,7.7,10,10,9656.0,427,0,919999999,29,0.1540,0,88,0.093,0.0,0.0 +2010,10,5,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,12.2,11.1,93,101825,0,0,355,0,0,0,0,0,0,0,30,8.2,10,10,8047.0,305,0,919999999,30,0.1530,0,88,0.093,0.0,0.0 +2010,10,5,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,12.2,11.1,93,101825,0,0,355,0,0,0,0,0,0,0,30,8.2,10,10,8000.0,305,0,919999999,30,0.1530,0,88,0.093,0.0,0.0 +2010,10,5,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,11.1,89,101755,0,0,358,0,0,0,0,0,0,0,40,6.7,10,10,8000.0,366,0,919999999,30,0.1530,0,88,0.093,0.0,0.0 +2010,10,5,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.0,11.0,88,101280,0,0,358,0,0,0,0,0,0,0,50,7.2,10,10,8000.0,244,0,919999999,29,0.1530,0,88,0.093,0.0,0.0 +2010,10,5,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.8,11.1,89,101735,0,0,358,0,0,0,0,0,0,0,50,8.2,10,10,8000.0,244,0,919999999,30,0.1530,0,88,0.093,0.0,0.0 +2010,10,5,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,11.1,89,101755,0,0,358,0,0,0,0,0,0,0,50,7.7,10,10,8000.0,244,0,919999999,30,0.1530,0,88,0.093,0.0,0.0 +2010,10,5,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.0,11.0,88,101280,178,930,358,7,0,7,680,0,685,296,50,6.7,10,10,8000.0,305,0,919999999,29,0.1530,0,88,0.093,0.0,0.0 +2010,10,5,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,11.1,87,101855,422,1368,360,15,0,15,1488,0,1500,702,50,7.2,10,10,8000.0,305,0,919999999,30,0.1530,0,88,0.093,0.0,0.0 +2010,10,5,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.3,12.2,93,101845,633,1368,361,29,0,29,2927,0,2952,1451,60,7.7,10,10,3219.0,244,0,919999999,33,0.1530,0,88,0.093,0.0,0.0 +2010,10,5,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.0,12.0,94,101280,796,1368,360,53,0,53,5422,0,5471,2738,50,7.7,10,10,4023.0,305,0,919999999,32,0.1530,0,88,0.093,0.0,0.0 +2010,10,5,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,13.3,12.2,93,101865,900,1368,361,78,0,78,8047,0,8121,4071,50,6.7,10,10,4000.0,305,0,919999999,33,0.1530,0,88,0.093,0.0,0.0 +2010,10,5,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,14.0,13.0,94,101280,937,1368,366,118,1,117,14452,59,14383,5957,40,6.2,10,10,4023.0,305,0,919999999,36,0.1530,0,88,0.093,0.0,0.0 +2010,10,5,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.0,12.0,94,101280,906,1368,360,162,2,161,19286,131,19253,7746,40,8.2,10,10,4023.0,183,0,919999999,32,0.1530,0,88,0.093,0.0,0.0 +2010,10,5,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,13.3,13.3,100,101735,808,1368,363,188,4,184,21783,275,21422,8184,40,7.7,10,10,3200.0,183,0,919999999,37,0.1530,0,88,0.093,0.0,0.0 +2010,10,5,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.9,12.8,93,101685,650,1368,365,148,2,146,16979,127,16822,6153,50,7.2,10,10,3219.0,183,0,919999999,35,0.1530,0,88,0.093,0.0,0.0 +2010,10,5,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.9,12.8,93,101695,443,1368,365,192,278,104,21624,13769,11758,3967,50,6.7,10,10,3219.0,183,0,919999999,35,0.1530,0,88,0.093,0.0,0.0 +2010,10,5,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,13.9,12.8,93,101695,201,1368,365,118,278,69,12676,4320,7442,2022,50,6.7,10,10,3200.0,183,0,919999999,35,0.1530,0,88,0.093,0.0,0.0 +2010,10,5,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.9,13.9,100,101765,0,1055,366,0,0,0,0,0,0,0,60,6.2,10,10,3219.0,122,0,919999999,39,0.1530,0,88,0.093,0.0,0.0 +2010,10,5,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,14.4,13.9,97,101805,0,0,369,0,0,0,0,0,0,0,70,6.2,10,10,4023.0,122,0,919999999,39,0.1530,0,88,0.093,0.0,0.0 +2010,10,5,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,14.4,13.9,97,101805,0,0,369,0,0,0,0,0,0,0,70,6.2,10,10,4000.0,122,0,919999999,39,0.1530,0,88,0.093,5.0,0.0 +2010,10,5,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,14.4,14.0,97,101785,0,0,369,0,0,0,0,0,0,0,50,6.2,10,10,3219.0,122,0,919999999,40,0.1530,0,88,0.093,4.9,0.0 +2010,10,5,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,14.0,14.0,100,101280,0,0,367,0,0,0,0,0,0,0,60,6.2,10,10,1609.0,122,0,919999999,40,0.1530,0,88,0.093,0.0,0.0 +2010,10,5,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,13.9,13.9,100,101825,0,0,366,0,0,0,0,0,0,0,60,6.7,10,10,1600.0,122,0,919999999,39,0.1530,0,88,0.093,0.0,0.0 +2010,10,5,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,14.4,13.0,91,101825,0,0,368,0,0,0,0,0,0,0,70,5.7,10,10,1207.0,122,0,919999999,36,0.1530,0,88,0.093,0.0,0.0 +2010,10,6,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,14.4,14.0,97,101825,0,0,369,0,0,0,0,0,0,0,70,5.7,10,10,1207.0,122,0,919999999,40,0.1520,0,88,0.093,0.0,0.0 +2010,10,6,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,14.4,14.0,97,101825,0,0,369,0,0,0,0,0,0,0,70,5.7,10,10,1200.0,122,0,919999999,40,0.1520,0,88,0.093,0.0,0.0 +2010,10,6,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,14.0,14.0,100,101280,0,0,367,0,0,0,0,0,0,0,60,6.2,10,10,1609.0,91,0,919999999,40,0.1520,0,88,0.093,0.0,0.0 +2010,10,6,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.9,13.0,94,101645,0,0,365,0,0,0,0,0,0,0,50,7.7,10,10,1609.0,91,0,919999999,36,0.1520,0,88,0.093,0.0,0.0 +2010,10,6,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,13.9,13.0,94,101645,0,0,365,0,0,0,0,0,0,0,50,7.7,10,10,1600.0,91,0,919999999,36,0.1520,0,88,0.093,0.0,0.0 +2010,10,6,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.0,12.0,94,101280,0,0,360,0,0,0,0,0,0,0,50,6.2,10,10,1609.0,366,0,919999999,32,0.1520,0,88,0.093,0.0,0.0 +2010,10,6,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.0,13.0,100,101280,173,905,361,7,0,7,679,0,684,295,50,6.2,10,10,6437.0,244,0,919999999,36,0.1520,0,88,0.093,0.0,0.0 +2010,10,6,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,13.9,13.3,96,101635,417,1369,366,32,0,32,3169,0,3194,1435,70,5.7,10,10,4800.0,244,0,919999999,37,0.1520,0,88,0.093,0.0,0.0 +2010,10,6,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,14.4,13.9,97,101565,628,1369,369,16,0,16,1612,0,1626,814,60,5.1,10,10,6437.0,183,0,919999999,39,0.1520,0,88,0.093,0.0,0.0 +2010,10,6,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,14.4,13.9,97,101385,790,1369,369,73,0,73,7454,0,7521,3679,50,7.2,10,10,8047.0,244,0,919999999,39,0.1520,0,88,0.093,0.0,0.0 +2010,10,6,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,14.4,13.9,97,101385,894,1369,369,63,0,63,6488,0,6548,3330,50,7.2,10,10,8000.0,244,0,919999999,39,0.1520,0,88,0.093,0.0,0.0 +2010,10,6,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.9,13.3,96,101036,931,1369,366,58,0,58,5994,0,6050,3114,60,10.3,10,10,4828.0,244,0,919999999,37,0.1520,0,88,0.093,0.0,0.0 +2010,10,6,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,14.0,13.0,94,101280,899,1369,366,116,4,113,14163,235,13846,5695,50,10.8,10,10,3219.0,244,0,919999999,36,0.1520,0,88,0.093,0.0,0.0 +2010,10,6,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,13.9,13.3,96,100756,801,1369,366,159,4,156,18640,259,18369,7156,50,11.3,10,10,4800.0,244,0,919999999,37,0.1520,0,88,0.093,0.0,0.0 +2010,10,6,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.0,13.0,100,101280,643,1369,361,38,0,38,3836,0,3869,1884,30,7.2,10,10,1207.0,213,0,919999999,36,0.1520,0,88,0.093,0.0,0.0 +2010,10,6,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.9,13.3,96,100546,436,1369,366,13,0,13,1289,0,1300,615,10,5.1,10,10,2012.0,183,0,919999999,37,0.1520,0,88,0.093,0.0,0.0 +2010,10,6,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,13.9,13.3,96,100546,193,1369,366,89,258,44,9889,0,4903,1508,10,5.1,10,10,2000.0,183,0,919999999,37,0.1520,0,88,0.093,0.0,0.0 +2010,10,6,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.3,12.8,97,100426,0,1016,362,0,0,0,0,0,0,0,300,4.1,10,10,3219.0,183,0,919999999,35,0.1520,0,88,0.093,0.0,0.0 +2010,10,6,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.0,12.0,94,101280,0,0,360,0,0,0,0,0,0,0,280,4.6,10,10,9656.0,183,0,919999999,32,0.1520,0,88,0.093,0.0,0.0 +2010,10,6,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,12.8,12.2,96,100406,0,0,359,0,0,0,0,0,0,0,280,4.6,10,10,9000.0,183,0,919999999,33,0.1520,0,88,0.093,5.0,0.0 +2010,10,6,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,11.7,11.1,96,100356,0,0,352,0,0,0,0,0,0,0,240,5.7,10,10,9656.0,183,0,919999999,30,0.1520,0,88,0.093,5.0,0.0 +2010,10,6,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,10.6,93,100296,0,0,352,0,0,0,0,0,0,0,230,5.1,10,10,9656.0,183,0,919999999,28,0.1520,0,88,0.093,5.0,0.0 +2010,10,6,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,10.6,93,100296,0,0,352,0,0,0,0,0,0,0,230,5.1,10,10,9656.0,183,0,919999999,28,0.1520,0,88,0.093,5.0,0.0 +2010,10,6,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.0,10.0,88,101280,0,0,323,0,0,0,0,0,0,0,250,5.1,5,5,9656.0,77777,0,919999999,27,0.1520,0,88,0.093,5.0,0.0 +2010,10,7,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,9.4,89,100146,0,0,301,0,0,0,0,0,0,0,220,4.6,0,0,9656.0,77777,0,919999999,25,0.1500,0,88,0.093,0.1,0.0 +2010,10,7,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,9.4,89,100146,0,0,347,0,0,0,0,0,0,0,220,4.6,10,10,9656.0,77777,0,919999999,25,0.1500,0,88,0.093,0.0,0.0 +2010,10,7,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,10.0,93,100066,0,0,348,0,0,0,0,0,0,0,230,5.7,10,10,9656.0,2743,0,919999999,26,0.1500,0,88,0.093,0.0,0.0 +2010,10,7,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,9.4,89,99936,0,0,314,0,0,0,0,0,0,0,220,5.7,3,3,9656.0,77777,0,919999999,25,0.1500,0,88,0.093,0.0,0.0 +2010,10,7,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,9.4,89,99936,0,0,319,0,0,0,0,0,0,0,220,5.7,5,5,9656.0,77777,0,919999999,25,0.1500,0,88,0.093,0.0,0.0 +2010,10,7,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,8.9,93,99825,0,0,296,0,0,0,0,0,0,0,220,5.7,0,0,9656.0,77777,0,919999999,24,0.1500,0,88,0.093,0.0,0.0 +2010,10,7,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,8.9,89,99836,168,880,335,42,167,22,4887,0,2564,838,230,7.7,9,9,9656.0,2134,0,919999999,24,0.1500,0,88,0.093,0.0,0.0 +2010,10,7,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.6,8.9,89,99836,412,1369,344,104,85,79,11906,3684,9072,3124,230,7.7,10,10,9656.0,2134,0,919999999,24,0.1500,0,88,0.093,0.0,0.0 +2010,10,7,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,9.4,80,99876,623,1369,356,134,13,129,15469,811,14952,5477,240,6.7,10,10,9656.0,488,0,919999999,25,0.1500,0,88,0.093,0.0,0.0 +2010,10,7,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.0,9.0,77,101280,785,1369,356,207,30,193,23855,2194,22350,8352,240,6.2,10,10,9656.0,1250,0,919999999,24,0.1500,0,88,0.093,0.0,0.0 +2010,10,7,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.9,9.4,74,99836,888,1369,361,264,37,242,30395,2891,28014,10531,240,7.2,10,10,9656.0,1250,0,919999999,25,0.1500,0,88,0.093,0.0,0.0 +2010,10,7,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,8.9,64,99806,925,1369,369,222,12,215,25958,891,25268,9851,270,9.8,10,10,9656.0,1006,0,919999999,23,0.1500,0,88,0.093,0.0,0.0 +2010,10,7,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,8.3,58,99767,893,1369,364,518,548,163,61594,37407,19468,7775,270,8.8,9,9,9656.0,1006,0,919999999,22,0.1500,0,88,0.093,0.0,0.0 +2010,10,7,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.7,8.3,58,99767,794,1369,343,578,748,130,68833,47956,15542,6133,270,8.7,5,5,9656.0,1006,0,919999999,22,0.1500,0,88,0.093,0.0,0.0 +2010,10,7,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,7.8,50,99877,636,1369,350,427,616,110,50085,36891,12948,4867,300,10.3,5,5,9656.0,77777,0,919999999,21,0.1500,0,88,0.093,0.0,0.0 +2010,10,7,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,7.8,50,99977,428,1369,345,277,536,97,31340,26761,11014,3710,290,5.7,3,3,9656.0,77777,0,919999999,21,0.1500,0,88,0.093,0.0,0.0 +2010,10,7,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,7.8,50,99977,186,1369,345,181,556,47,19995,2014,5208,1554,290,5.7,3,3,9656.0,77777,0,919999999,21,0.1500,0,88,0.093,0.0,0.0 +2010,10,7,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,4.4,44,100206,0,977,334,0,0,0,0,0,0,0,270,4.6,3,3,9656.0,77777,0,919999999,15,0.1500,0,88,0.093,0.0,0.0 +2010,10,7,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,5.6,50,100346,0,0,332,0,0,0,0,0,0,0,260,4.1,3,3,9656.0,77777,0,919999999,17,0.1500,0,88,0.093,0.0,0.0 +2010,10,7,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,5.6,50,100346,0,0,332,0,0,0,0,0,0,0,260,4.1,3,3,9656.0,77777,9,999999999,17,0.1500,0,88,0.096,0.0,0.0 +2010,10,7,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,5.6,53,100496,0,0,352,0,0,0,0,0,0,0,280,5.7,9,9,9656.0,3048,9,999999999,17,0.1500,0,88,0.096,0.0,0.0 +2010,10,7,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,5.6,53,100596,0,0,327,0,0,0,0,0,0,0,280,7.2,3,3,9656.0,77777,9,999999999,17,0.1500,0,88,0.096,0.0,0.0 +2010,10,7,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,5.6,53,100596,0,0,327,0,0,0,0,0,0,0,280,7.2,3,3,9656.0,77777,9,999999999,17,0.1500,0,88,0.096,0.0,0.0 +2010,10,7,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,5.6,57,100746,0,0,322,0,0,0,0,0,0,0,270,4.6,3,3,9656.0,77777,9,999999999,17,0.1500,0,88,0.096,0.0,0.0 +2010,10,8,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,5.0,57,100826,0,0,319,0,0,0,0,0,0,0,260,4.6,3,3,9656.0,77777,9,999999999,16,0.1490,0,88,0.096,0.0,0.0 +2010,10,8,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,5.0,57,100826,0,0,319,0,0,0,0,0,0,0,260,4.6,3,3,9656.0,77777,9,999999999,16,0.1490,0,88,0.096,0.0,0.0 +2010,10,8,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,5.0,66,100795,0,0,309,0,0,0,0,0,0,0,230,5.1,3,3,9656.0,77777,9,999999999,16,0.1490,0,88,0.096,0.0,0.0 +2010,10,8,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,4.4,63,100785,0,0,296,0,0,0,0,0,0,0,230,6.2,0,0,9656.0,77777,9,999999999,15,0.1490,0,88,0.096,0.0,0.0 +2010,10,8,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,4.4,63,100785,0,0,309,0,0,0,0,0,0,0,230,6.2,3,3,9656.0,77777,9,999999999,15,0.1490,0,88,0.096,0.0,0.0 +2010,10,8,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,5.0,66,100905,0,0,296,0,0,0,0,0,0,0,250,5.7,0,0,9656.0,77777,9,999999999,16,0.1490,0,88,0.096,0.0,0.0 +2010,10,8,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,5.0,59,100925,163,854,304,45,266,18,5314,0,2128,700,260,6.2,0,0,9656.0,77777,9,999999999,16,0.1490,0,88,0.096,0.0,0.0 +2010,10,8,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,5.0,59,100925,407,1370,304,177,550,40,21372,18533,4837,1747,260,6.2,0,0,9656.0,77777,9,999999999,16,0.1490,0,88,0.096,0.0,0.0 +2010,10,8,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,6.1,51,100956,617,1370,319,346,758,59,37260,74660,8915,1368,250,6.7,0,0,9656.0,77777,9,999999999,18,0.1490,0,88,0.096,0.0,0.0 +2010,10,8,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,6.7,48,100856,779,1370,327,498,844,70,53517,85154,10238,1695,250,8.2,0,0,9656.0,77777,9,999999999,19,0.1490,0,88,0.096,0.0,0.0 +2010,10,8,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,6.7,48,100856,882,1370,327,607,884,77,65081,89903,11018,1963,250,8.2,0,0,9656.0,77777,9,999999999,19,0.1490,0,88,0.096,0.0,0.0 +2010,10,8,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,5.0,36,100657,918,1370,338,664,899,81,70886,91366,11481,2097,280,6.2,0,0,9656.0,77777,9,999999999,16,0.1490,0,88,0.096,0.0,0.0 +2010,10,8,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,6.1,36,100517,886,1370,344,663,896,82,70879,91020,11682,2025,250,6.2,0,0,9656.0,77777,9,999999999,18,0.1490,0,88,0.096,0.0,0.0 +2010,10,8,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,6.1,36,100517,787,1370,344,605,875,78,64744,88197,11325,1773,250,6.2,0,0,9656.0,77777,9,999999999,18,0.1490,0,88,0.096,0.0,0.0 +2010,10,8,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.8,5.6,33,100377,629,1370,349,495,830,72,59951,44593,8743,3369,270,8.8,0,0,9656.0,77777,9,999999999,17,0.1490,0,88,0.096,0.0,0.0 +2010,10,8,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,5.6,34,100397,421,1370,346,346,746,61,40577,30284,7172,2551,260,6.7,0,0,9656.0,77777,9,999999999,17,0.1490,0,88,0.096,0.0,0.0 +2010,10,8,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,5.6,34,100397,179,1370,346,175,559,43,19422,470,4786,1439,260,6.7,0,0,9656.0,77777,9,999999999,17,0.1490,0,88,0.096,0.0,0.0 +2010,10,8,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,7.2,43,100507,0,938,338,0,0,0,0,0,0,0,240,6.2,0,0,9656.0,77777,9,999999999,20,0.1490,0,88,0.096,0.0,0.0 +2010,10,8,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,7.2,45,100557,0,0,335,0,0,0,0,0,0,0,250,4.6,0,0,9656.0,77777,9,999999999,20,0.1490,0,88,0.096,0.0,0.0 +2010,10,8,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,7.2,45,100557,0,0,335,0,0,0,0,0,0,0,250,4.6,0,0,9656.0,77777,9,999999999,20,0.1490,0,88,0.096,0.0,0.0 +2010,10,8,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,7.8,52,100606,0,0,328,0,0,0,0,0,0,0,240,5.1,0,0,9656.0,77777,9,999999999,21,0.1490,0,88,0.096,0.0,0.0 +2010,10,8,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,7.2,52,100656,0,0,325,0,0,0,0,0,0,0,270,4.1,0,0,9656.0,77777,9,999999999,20,0.1490,0,88,0.096,0.0,0.0 +2010,10,8,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,7.2,52,100656,0,0,325,0,0,0,0,0,0,0,270,4.1,0,0,9656.0,77777,9,999999999,20,0.1490,0,88,0.096,0.0,0.0 +2010,10,8,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,7.8,62,100746,0,0,316,0,0,0,0,0,0,0,340,1.5,0,0,9656.0,77777,9,999999999,21,0.1490,0,88,0.096,0.0,0.0 +2010,10,9,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,7.8,65,100756,0,0,327,0,0,0,0,0,0,0,290,3.1,3,3,9656.0,77777,9,999999999,21,0.1480,0,88,0.096,0.0,0.0 +2010,10,9,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,7.8,65,100756,0,0,327,0,0,0,0,0,0,0,290,3.1,3,3,9656.0,77777,9,999999999,21,0.1480,0,88,0.096,0.0,0.0 +2010,10,9,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,7.8,67,100766,0,0,325,0,0,0,0,0,0,0,290,4.6,3,3,9656.0,77777,9,999999999,21,0.1480,0,88,0.096,0.0,0.0 +2010,10,9,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,7.8,69,100786,0,0,309,0,0,0,0,0,0,0,300,3.1,0,0,9656.0,77777,9,999999999,21,0.1480,0,88,0.096,0.0,0.0 +2010,10,9,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,7.8,69,100786,0,0,322,0,0,0,0,0,0,0,300,3.1,3,3,9656.0,77777,9,999999999,21,0.1480,0,88,0.096,0.0,0.0 +2010,10,9,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,6.1,62,100916,0,0,325,0,0,0,0,0,0,0,310,3.1,5,5,9656.0,77777,9,999999999,18,0.1480,0,88,0.096,0.0,0.0 +2010,10,9,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,5.0,55,100986,158,829,327,41,226,15,4898,0,1793,592,320,6.2,5,5,9656.0,77777,9,999999999,16,0.1480,0,88,0.096,0.0,0.0 +2010,10,9,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,5.0,55,100986,402,1371,327,175,522,38,21184,17005,4607,1663,320,6.2,5,5,9656.0,77777,9,999999999,16,0.1480,0,88,0.096,0.0,0.0 +2010,10,9,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,1.1,37,101076,612,1371,325,354,785,59,37841,76704,8913,1360,310,8.2,3,3,9656.0,77777,9,999999999,11,0.1480,0,88,0.096,0.0,0.0 +2010,10,9,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,-0.6,32,101096,774,1371,325,513,883,70,54560,88204,10233,1685,310,6.2,3,3,9656.0,77777,9,999999999,9,0.1480,0,88,0.096,0.0,0.0 +2010,10,9,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,-0.6,32,101096,876,1371,325,629,933,75,66796,93987,10744,1926,310,6.2,3,3,9656.0,77777,9,999999999,9,0.1480,0,88,0.096,0.0,0.0 +2010,10,9,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,-4.4,22,101006,912,1371,326,691,955,77,73062,96095,10941,2032,300,9.8,3,3,9656.0,77777,9,999999999,6,0.1480,0,88,0.096,0.0,0.0 +2010,10,9,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,-7.2,17,100996,879,1371,322,692,956,76,73035,95822,10864,1946,300,9.3,3,3,9656.0,77777,9,999999999,5,0.1480,0,88,0.096,0.0,0.0 +2010,10,9,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,-7.2,17,100996,780,1371,322,632,936,74,66722,93040,10765,1731,300,9.3,3,3,9656.0,77777,9,999999999,5,0.1480,0,88,0.096,0.0,0.0 +2010,10,9,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,-5.6,19,101036,622,1371,324,517,890,68,54682,86509,10173,1421,330,6.7,3,3,9656.0,77777,9,999999999,6,0.1480,0,88,0.096,0.0,0.0 +2010,10,9,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,-3.9,23,101066,414,1371,324,360,803,59,42360,34090,6959,2465,300,8.8,3,3,9656.0,77777,9,999999999,7,0.1480,0,88,0.096,0.0,0.0 +2010,10,9,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,-3.9,23,101066,171,1371,329,180,610,42,19997,1108,4679,1393,300,8.7,5,5,9656.0,77777,9,999999999,7,0.1480,0,88,0.096,0.0,0.0 +2010,10,9,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,-3.9,28,101175,0,900,316,0,0,0,0,0,0,0,320,7.2,5,5,9656.0,77777,9,999999999,7,0.1480,0,88,0.096,0.0,0.0 +2010,10,9,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,-2.8,33,101215,0,0,308,0,0,0,0,0,0,0,340,4.1,3,3,9656.0,77777,9,999999999,7,0.1480,0,88,0.096,0.0,0.0 +2010,10,9,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,-2.8,33,101215,0,0,295,0,0,0,0,0,0,0,340,4.1,0,0,9656.0,77777,9,999999999,7,0.1480,0,88,0.096,0.0,0.0 +2010,10,9,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,-1.1,44,101355,0,0,288,0,0,0,0,0,0,0,340,5.1,0,0,9656.0,77777,9,999999999,9,0.1480,0,88,0.096,0.0,0.0 +2010,10,9,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,-0.6,47,101395,0,0,286,0,0,0,0,0,0,0,310,4.6,0,0,9656.0,77777,9,999999999,9,0.1480,0,88,0.096,0.0,0.0 +2010,10,9,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,-0.6,47,101395,0,0,286,0,0,0,0,0,0,0,310,4.6,0,0,9656.0,77777,9,999999999,9,0.1480,0,88,0.096,0.0,0.0 +2010,10,9,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,0.0,54,101385,0,0,282,0,0,0,0,0,0,0,290,4.6,0,0,9656.0,77777,9,999999999,10,0.1480,0,88,0.096,0.0,0.0 +2010,10,10,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,-0.6,51,101345,0,0,282,0,0,0,0,0,0,0,290,4.6,0,0,9656.0,77777,9,999999999,9,0.1460,0,88,0.096,0.0,0.0 +2010,10,10,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,-0.6,51,101345,0,0,282,0,0,0,0,0,0,0,290,4.6,0,0,9656.0,77777,9,999999999,9,0.1460,0,88,0.096,0.0,0.0 +2010,10,10,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,0.0,56,101285,0,0,280,0,0,0,0,0,0,0,280,4.6,0,0,9656.0,77777,9,999999999,10,0.1460,0,88,0.096,0.0,0.0 +2010,10,10,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,0.0,58,101244,0,0,278,0,0,0,0,0,0,0,290,5.7,0,0,9656.0,77777,9,999999999,10,0.1460,0,88,0.096,0.0,0.0 +2010,10,10,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,0.0,58,101244,0,0,278,0,0,0,0,0,0,0,290,5.7,0,0,9656.0,77777,9,999999999,10,0.1460,0,88,0.096,0.0,0.0 +2010,10,10,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,0.0,58,101234,0,0,290,0,0,0,0,0,0,0,290,4.6,3,3,9656.0,77777,9,999999999,10,0.1460,0,88,0.096,0.0,0.0 +2010,10,10,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,-0.6,51,101245,153,803,294,39,221,15,4655,0,1792,589,300,4.6,3,3,9656.0,77777,9,999999999,9,0.1460,0,88,0.096,0.0,0.0 +2010,10,10,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,-0.6,51,101245,397,1372,294,169,508,38,20463,17250,4608,1657,300,4.6,3,3,9656.0,77777,9,999999999,9,0.1460,0,88,0.096,0.0,0.0 +2010,10,10,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,0.6,48,101175,606,1372,305,343,766,59,36639,74712,8919,1352,240,5.1,3,3,9656.0,77777,9,999999999,10,0.1460,0,88,0.096,0.0,0.0 +2010,10,10,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,-0.6,39,101085,768,1372,311,498,861,69,52985,85958,10105,1665,280,3.1,3,3,9656.0,77777,9,999999999,9,0.1460,0,88,0.096,0.0,0.0 +2010,10,10,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,-0.6,39,101085,870,1372,311,609,903,76,64646,90915,10891,1924,280,3.1,3,3,9656.0,77777,9,999999999,9,0.1460,0,88,0.096,0.0,0.0 +2010,10,10,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,-0.6,32,100876,906,1372,325,668,922,79,70834,93022,11228,2040,250,5.1,3,3,9656.0,77777,9,999999999,9,0.1460,0,88,0.096,0.0,0.0 +2010,10,10,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,-2.8,25,100696,873,1372,325,669,923,79,70776,92737,11287,1962,250,5.7,3,3,9656.0,77777,9,999999999,7,0.1460,0,88,0.096,0.0,0.0 +2010,10,10,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,-2.8,25,100696,773,1372,325,607,895,78,64207,89142,11333,1744,250,5.7,3,3,9656.0,77777,9,999999999,7,0.1460,0,88,0.096,0.0,0.0 +2010,10,10,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,-3.3,21,100487,614,1372,335,495,846,73,59867,47685,8851,3382,270,5.1,3,3,9656.0,77777,9,999999999,7,0.1460,0,88,0.096,0.0,0.0 +2010,10,10,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,-2.2,24,100426,406,1372,333,342,755,62,39995,31911,7269,2554,240,7.2,3,3,9656.0,77777,9,999999999,8,0.1460,0,88,0.096,0.0,0.0 +2010,10,10,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,-2.2,24,100426,164,1372,333,166,535,43,18328,354,4762,1391,240,7.2,3,3,9656.0,77777,9,999999999,8,0.1460,0,88,0.096,0.0,0.0 +2010,10,10,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,0.6,35,100406,0,862,327,0,0,0,0,0,0,0,230,4.6,3,3,9656.0,77777,9,999999999,10,0.1460,0,88,0.096,0.0,0.0 +2010,10,10,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,1.1,40,100416,0,0,306,0,0,0,0,0,0,0,230,4.1,0,0,9656.0,77777,9,999999999,11,0.1460,0,88,0.096,0.0,0.0 +2010,10,10,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,1.1,40,100416,0,0,320,0,0,0,0,0,0,0,230,4.1,3,3,9656.0,77777,9,999999999,11,0.1460,0,88,0.096,0.0,0.0 +2010,10,10,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,1.7,42,100426,0,0,320,0,0,0,0,0,0,0,240,6.2,3,3,9656.0,77777,9,999999999,11,0.1460,0,88,0.096,0.0,0.0 +2010,10,10,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,2.2,47,100466,0,0,316,0,0,0,0,0,0,0,250,3.6,3,3,9656.0,77777,9,999999999,12,0.1460,0,88,0.096,0.0,0.0 +2010,10,10,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,2.2,47,100466,0,0,303,0,0,0,0,0,0,0,250,3.6,0,0,9656.0,77777,9,999999999,12,0.1460,0,88,0.096,0.0,0.0 +2010,10,10,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,2.8,47,100466,0,0,306,0,0,0,0,0,0,0,280,4.6,0,0,9656.0,77777,9,999999999,13,0.1460,0,88,0.096,0.0,0.0 +2010,10,11,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,3.3,52,100476,0,0,302,0,0,0,0,0,0,0,280,3.1,0,0,9656.0,77777,9,999999999,14,0.1450,0,88,0.096,0.0,0.0 +2010,10,11,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,3.3,52,100476,0,0,315,0,0,0,0,0,0,0,280,3.1,3,3,9656.0,77777,9,999999999,14,0.1450,0,88,0.096,0.0,0.0 +2010,10,11,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,3.9,53,100506,0,0,342,0,0,0,0,0,0,0,280,3.6,9,9,9656.0,2743,9,999999999,14,0.1450,0,88,0.096,0.0,0.0 +2010,10,11,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,3.9,55,100546,0,0,339,0,0,0,0,0,0,0,290,4.1,9,9,9656.0,2591,9,999999999,14,0.1450,0,88,0.096,0.0,0.0 +2010,10,11,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.8,3.9,55,100546,0,0,316,0,0,0,0,0,0,0,290,4.1,3,3,9656.0,2591,9,999999999,14,0.1450,0,88,0.096,0.0,0.0 +2010,10,11,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,4.4,59,100655,0,0,313,0,0,0,0,0,0,0,280,4.6,3,3,9656.0,77777,9,999999999,15,0.1450,0,88,0.096,0.0,0.0 +2010,10,11,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,5.0,57,100716,148,777,324,35,187,16,4139,0,1894,620,280,3.6,5,5,9656.0,77777,9,999999999,16,0.1450,0,88,0.096,0.0,0.0 +2010,10,11,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,5.0,57,100716,391,1373,343,102,121,72,11716,5027,8294,2844,280,3.6,9,9,9656.0,77777,9,999999999,16,0.1450,0,88,0.096,0.0,0.0 +2010,10,11,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,5.6,50,100716,601,1373,357,278,455,102,32598,26701,12001,4464,290,5.7,9,9,9656.0,7620,9,999999999,17,0.1450,0,88,0.096,0.0,0.0 +2010,10,11,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,5.6,45,100696,762,1373,366,428,610,132,50676,40068,15690,6100,280,6.2,9,9,9656.0,7620,9,999999999,17,0.1450,0,88,0.096,0.0,0.0 +2010,10,11,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,5.6,45,100696,864,1373,366,444,406,221,51360,31545,25697,9704,280,6.2,9,9,9656.0,7620,9,999999999,17,0.1450,0,88,0.096,0.0,0.0 +2010,10,11,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,5.0,41,100676,899,1373,368,454,275,282,51817,23464,32372,11769,290,4.1,9,9,9656.0,6096,9,999999999,16,0.1450,0,88,0.096,0.0,0.0 +2010,10,11,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,4.4,37,100637,866,1373,372,449,258,285,50936,22405,32519,11566,270,6.2,9,9,9656.0,6096,9,999999999,15,0.1450,0,88,0.096,0.0,0.0 +2010,10,11,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,19.4,4.4,37,100637,767,1373,372,432,327,241,48830,27104,27388,9594,270,6.2,9,9,9656.0,6096,9,999999999,15,0.1450,0,88,0.096,0.0,0.0 +2010,10,11,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,5.0,37,100657,607,1373,376,411,601,133,47266,39106,15357,5535,290,2.1,9,9,9656.0,9449,9,999999999,16,0.1450,0,88,0.096,0.0,0.0 +2010,10,11,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,5.0,39,100677,399,1373,373,319,697,72,36717,29393,8312,2865,307,0.0,9,9,9656.0,9449,9,999999999,16,0.1450,0,88,0.096,0.0,0.0 +2010,10,11,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,19.4,5.0,39,100677,156,1373,373,143,359,49,15520,407,5336,1474,316,0.0,9,9,9656.0,9449,9,999999999,16,0.1450,0,88,0.096,0.0,0.0 +2010,10,11,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,8.9,70,100786,0,824,353,0,0,0,0,0,0,0,60,2.6,9,9,9656.0,9449,9,999999999,24,0.1450,0,88,0.096,0.0,0.0 +2010,10,11,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,10.0,75,100846,0,0,334,0,0,0,0,0,0,0,100,1.5,5,5,9656.0,77777,9,999999999,26,0.1450,0,88,0.096,0.0,0.0 +2010,10,11,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,10.0,75,100846,0,0,364,0,0,0,0,0,0,0,100,1.5,10,10,9656.0,77777,9,999999999,26,0.1450,0,88,0.096,0.0,0.0 +2010,10,11,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,10.0,77,100906,0,0,332,0,0,0,0,0,0,0,120,2.6,5,5,9656.0,77777,9,999999999,26,0.1450,0,88,0.096,0.0,0.0 +2010,10,11,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,11.1,83,100916,0,0,363,0,0,0,0,0,0,0,90,3.1,10,10,9656.0,1829,9,999999999,30,0.1450,0,88,0.096,1.0,0.0 +2010,10,11,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.9,11.1,83,100916,0,0,363,0,0,0,0,0,0,0,90,3.1,10,10,9656.0,1829,9,999999999,30,0.1450,0,88,0.096,0.3,0.0 +2010,10,11,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,8.3,67,100836,0,0,362,0,0,0,0,0,0,0,100,3.6,10,10,9656.0,1524,9,999999999,22,0.1450,0,88,0.096,0.0,0.0 +2010,10,12,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,9.4,72,100786,0,0,364,0,0,0,0,0,0,0,90,3.6,10,10,9656.0,1524,9,999999999,25,0.1440,0,88,0.096,0.0,0.0 +2010,10,12,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,14.4,9.4,72,100786,0,0,364,0,0,0,0,0,0,0,90,3.6,10,10,9656.0,1524,0,919999999,25,0.1440,0,88,0.096,0.0,0.0 +2010,10,12,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.0,10.0,88,101280,0,0,352,0,0,0,0,0,0,0,40,5.7,10,10,9656.0,884,0,919999999,27,0.1440,0,88,0.096,0.0,0.0 +2010,10,12,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,9.4,83,100735,0,0,353,0,0,0,0,0,0,0,30,3.6,10,10,9656.0,701,0,919999999,25,0.1440,0,88,0.096,0.0,0.0 +2010,10,12,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.2,9.4,83,100735,0,0,353,0,0,0,0,0,0,0,30,3.6,10,10,9656.0,701,0,919999999,25,0.1440,0,88,0.096,0.0,0.0 +2010,10,12,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,8.9,89,100715,0,0,344,0,0,0,0,0,0,0,340,2.6,10,10,9656.0,579,0,919999999,24,0.1440,0,88,0.096,0.0,0.0 +2010,10,12,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,8.3,86,100755,143,751,343,16,0,16,1553,0,1564,616,360,2.6,10,10,9656.0,579,0,919999999,22,0.1440,0,88,0.096,0.0,0.0 +2010,10,12,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.6,8.3,86,100755,386,1373,343,66,8,64,7630,297,7419,2574,360,2.6,10,10,9656.0,579,0,919999999,22,0.1440,0,88,0.096,0.0,0.0 +2010,10,12,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,7.8,77,100785,595,1373,339,260,346,120,30036,21122,13916,5065,320,3.1,9,9,9656.0,579,0,919999999,21,0.1440,0,88,0.096,0.0,0.0 +2010,10,12,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.0,8.0,72,101280,756,1373,345,358,377,183,41229,27314,21176,7862,360,2.6,9,9,9656.0,77777,0,919999999,22,0.1440,0,88,0.096,0.0,0.0 +2010,10,12,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.9,8.3,69,100756,858,1373,330,565,759,120,68371,47567,14575,5896,360,1.5,5,5,9656.0,77777,0,919999999,22,0.1440,0,88,0.096,0.0,0.0 +2010,10,12,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,10.0,75,100726,893,1373,354,632,831,109,77391,50040,13394,5497,80,4.6,9,9,9656.0,975,0,919999999,26,0.1440,0,88,0.096,0.0,0.0 +2010,10,12,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,9.4,72,100706,860,1373,364,349,227,204,40526,16696,23807,9116,60,5.1,10,10,9656.0,975,0,919999999,25,0.1440,0,88,0.096,0.0,0.0 +2010,10,12,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,14.4,9.4,72,100706,760,1373,354,374,239,239,42154,19196,27085,9484,60,5.1,9,9,9656.0,975,0,919999999,25,0.1440,0,88,0.096,0.0,0.0 +2010,10,12,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,9.4,74,100796,600,1373,351,291,170,201,32249,12935,22390,7273,110,5.1,9,9,9656.0,1341,0,919999999,25,0.1440,0,88,0.096,0.0,0.0 +2010,10,12,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,9.4,77,100856,392,1373,348,177,87,138,19238,5134,15069,4396,90,4.6,9,9,9656.0,1829,0,919999999,25,0.1440,0,88,0.096,0.0,0.0 +2010,10,12,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,9.4,77,100856,149,1373,348,65,10,62,6871,73,6581,1589,90,4.6,9,9,9656.0,1829,0,919999999,25,0.1440,0,88,0.096,0.0,0.0 +2010,10,12,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,9.4,80,100995,0,786,346,0,0,0,0,0,0,0,47,0.0,9,9,9656.0,2438,0,919999999,25,0.1440,0,88,0.096,0.0,0.0 +2010,10,12,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,8.9,77,101035,0,0,345,0,0,0,0,0,0,0,10,1.5,9,9,9656.0,2438,0,919999999,24,0.1440,0,88,0.096,0.0,0.0 +2010,10,12,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.8,8.9,77,101035,0,0,321,0,0,0,0,0,0,0,10,1.5,3,3,9656.0,2438,9,999999999,24,0.1440,0,88,0.096,0.0,0.0 +2010,10,12,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,3.3,54,101115,0,0,299,0,0,0,0,0,0,0,330,3.6,0,0,9656.0,77777,9,999999999,14,0.1440,0,88,0.096,0.0,0.0 +2010,10,12,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,2.2,54,101145,0,0,294,0,0,0,0,0,0,0,310,4.1,0,0,9656.0,77777,9,999999999,12,0.1440,0,88,0.096,0.0,0.0 +2010,10,12,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,2.2,54,101145,0,0,294,0,0,0,0,0,0,0,310,4.1,0,0,9656.0,77777,9,999999999,12,0.1440,0,88,0.096,0.0,0.0 +2010,10,12,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,0.6,54,101225,0,0,285,0,0,0,0,0,0,0,320,5.1,0,0,9656.0,77777,9,999999999,10,0.1440,0,88,0.096,0.0,0.0 +2010,10,13,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,0.0,54,101305,0,0,282,0,0,0,0,0,0,0,320,5.1,0,0,9656.0,77777,9,999999999,10,0.1430,0,88,0.096,0.0,0.0 +2010,10,13,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,0.0,54,101305,0,0,282,0,0,0,0,0,0,0,320,5.1,0,0,9656.0,77777,9,999999999,10,0.1430,0,88,0.096,0.0,0.0 +2010,10,13,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,0.6,63,101354,0,0,276,0,0,0,0,0,0,0,310,3.6,0,0,9656.0,77777,9,999999999,10,0.1430,0,88,0.096,0.0,0.0 +2010,10,13,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,1.1,65,101394,0,0,289,0,0,0,0,0,0,0,330,3.6,3,3,9656.0,77777,9,999999999,11,0.1430,0,88,0.096,0.0,0.0 +2010,10,13,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,1.1,65,101394,0,0,277,0,0,0,0,0,0,0,330,3.6,0,0,9656.0,77777,9,999999999,11,0.1430,0,88,0.096,0.0,0.0 +2010,10,13,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,1.1,65,101484,0,0,277,0,0,0,0,0,0,0,320,4.1,0,0,9656.0,77777,9,999999999,11,0.1430,0,88,0.096,0.0,0.0 +2010,10,13,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,1.7,63,101544,138,725,282,33,198,14,3925,0,1666,544,330,3.6,0,0,9656.0,77777,9,999999999,12,0.1430,0,88,0.096,0.0,0.0 +2010,10,13,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,1.7,63,101544,381,1374,282,160,500,37,19318,15584,4474,1600,330,3.6,0,0,9656.0,77777,9,999999999,12,0.1430,0,88,0.096,0.0,0.0 +2010,10,13,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,2.8,51,101625,590,1374,301,329,757,57,35267,73751,8655,1315,340,2.6,0,0,9656.0,77777,9,999999999,13,0.1430,0,88,0.096,0.0,0.0 +2010,10,13,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,2.2,45,101605,751,1374,305,481,854,66,51408,85365,9721,1608,340,2.1,0,0,9656.0,77777,9,999999999,12,0.1430,0,88,0.096,0.0,0.0 +2010,10,13,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,2.2,45,101605,852,1374,305,591,901,71,63069,90900,10250,1827,340,2.1,0,0,9656.0,77777,9,999999999,12,0.1430,0,88,0.096,0.0,0.0 +2010,10,13,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,5.0,53,101545,887,1374,324,649,922,74,69465,93565,10604,1933,140,4.6,3,3,9656.0,77777,9,999999999,16,0.1430,0,88,0.096,0.0,0.0 +2010,10,13,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,5.0,53,101485,853,1374,329,649,922,74,69457,93341,10663,1864,120,3.6,5,5,9656.0,77777,9,999999999,16,0.1430,0,88,0.096,0.0,0.0 +2010,10,13,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,5.0,53,101485,753,1374,329,590,902,71,63180,90472,10418,1656,120,3.6,5,5,9656.0,77777,9,999999999,16,0.1430,0,88,0.096,0.0,0.0 +2010,10,13,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,5.0,49,101446,593,1374,329,479,856,66,51295,83606,9945,1363,110,3.6,3,3,9656.0,77777,9,999999999,16,0.1430,0,88,0.096,0.0,0.0 +2010,10,13,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,6.1,59,101465,385,1374,323,326,762,56,38106,27157,6562,2302,110,5.1,3,3,9656.0,77777,9,999999999,18,0.1430,0,88,0.096,0.0,0.0 +2010,10,13,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,6.1,59,101465,142,1374,323,155,560,37,17072,0,4087,1191,110,5.1,3,3,9656.0,77777,9,999999999,18,0.1430,0,88,0.096,0.0,0.0 +2010,10,13,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,6.1,66,101595,0,748,315,0,0,0,0,0,0,0,140,5.1,3,3,9656.0,77777,9,999999999,18,0.1430,0,88,0.096,0.0,0.0 +2010,10,13,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,6.1,68,101625,0,0,313,0,0,0,0,0,0,0,150,3.6,3,3,9656.0,77777,9,999999999,18,0.1430,0,88,0.096,0.0,0.0 +2010,10,13,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,6.1,68,101625,0,0,313,0,0,0,0,0,0,0,150,3.6,3,3,9656.0,77777,9,999999999,18,0.1430,0,88,0.096,0.0,0.0 +2010,10,13,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,6.7,77,101665,0,0,309,0,0,0,0,0,0,0,200,2.1,3,3,9656.0,77777,9,999999999,19,0.1430,0,88,0.096,0.0,0.0 +2010,10,13,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,7.2,79,101665,0,0,309,0,0,0,0,0,0,0,190,3.1,3,3,9656.0,77777,9,999999999,20,0.1430,0,88,0.096,0.0,0.0 +2010,10,13,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,7.2,79,101665,0,0,297,0,0,0,0,0,0,0,190,3.1,0,0,9656.0,77777,9,999999999,20,0.1430,0,88,0.096,0.0,0.0 +2010,10,13,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,6.7,80,101635,0,0,306,0,0,0,0,0,0,0,191,0.0,3,3,9656.0,77777,9,999999999,19,0.1430,0,88,0.096,0.0,0.0 +2010,10,14,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,6.7,80,101655,0,0,294,0,0,0,0,0,0,0,198,0.0,0,0,9656.0,77777,9,999999999,19,0.1410,0,88,0.096,0.0,0.0 +2010,10,14,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,6.7,80,101655,0,0,294,0,0,0,0,0,0,0,201,0.0,0,0,9656.0,77777,9,999999999,19,0.1410,0,88,0.096,0.0,0.0 +2010,10,14,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,6.1,89,101584,0,0,284,0,0,0,0,0,0,0,202,0.0,0,0,9656.0,77777,9,999999999,18,0.1410,0,88,0.096,0.0,0.0 +2010,10,14,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,6.7,90,101594,0,0,287,0,0,0,0,0,0,0,200,0.0,0,0,9656.0,77777,9,999999999,19,0.1410,0,88,0.096,0.0,0.0 +2010,10,14,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,6.7,90,101594,0,0,287,0,0,0,0,0,0,0,193,0.0,0,0,9656.0,77777,9,999999999,19,0.1410,0,88,0.096,0.0,0.0 +2010,10,14,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,6.7,86,101595,0,0,289,0,0,0,0,0,0,0,184,0.0,0,0,9656.0,77777,9,999999999,19,0.1410,0,88,0.096,0.0,0.0 +2010,10,14,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,8.3,86,101635,132,698,298,31,176,15,3648,0,1767,575,173,0.0,0,0,9656.0,77777,9,999999999,23,0.1410,0,88,0.096,0.0,0.0 +2010,10,14,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,8.3,86,101635,376,1375,315,119,264,60,13786,9207,6969,2417,164,0.0,5,5,9656.0,77777,9,999999999,23,0.1410,0,88,0.096,0.0,0.0 +2010,10,14,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,8.9,80,101625,584,1375,342,237,358,126,27193,21996,14515,5211,140,2.6,9,9,9656.0,914,9,999999999,24,0.1410,0,88,0.096,0.0,0.0 +2010,10,14,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,8.9,70,101575,745,1375,353,397,520,144,46472,34277,16926,6478,130,3.1,9,9,9656.0,6096,9,999999999,24,0.1410,0,88,0.096,0.0,0.0 +2010,10,14,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,14.4,8.9,70,101575,846,1375,353,478,513,194,55604,37269,22678,8697,130,3.1,9,9,9656.0,6096,9,999999999,24,0.1410,0,88,0.096,0.0,0.0 +2010,10,14,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,8.3,69,101445,880,1375,350,487,381,250,55855,30489,28831,10699,100,7.2,9,9,9656.0,1372,9,999999999,22,0.1410,0,88,0.096,0.0,0.0 +2010,10,14,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,7.8,65,101355,846,1375,352,342,167,237,39181,13227,27298,10075,110,7.2,9,9,9656.0,1372,9,999999999,21,0.1410,0,88,0.096,0.0,0.0 +2010,10,14,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,14.4,7.8,65,101355,746,1375,352,365,195,255,40846,16379,28697,9738,110,7.2,9,9,9656.0,1372,9,999999999,21,0.1410,0,88,0.096,0.0,0.0 +2010,10,14,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,7.8,67,101255,586,1375,349,249,92,203,27507,7127,22542,7185,110,6.2,9,9,9656.0,1524,9,999999999,21,0.1410,0,88,0.096,0.0,0.0 +2010,10,14,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,8.3,69,101155,378,1375,360,164,69,138,17758,4079,15013,4275,100,6.2,10,10,9656.0,1676,9,999999999,22,0.1410,0,88,0.096,0.0,0.0 +2010,10,14,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.9,8.3,69,101155,135,1375,360,77,48,67,8017,514,7008,1484,100,6.2,10,10,9656.0,1676,9,999999999,22,0.1410,0,88,0.096,0.0,0.0 +2010,10,14,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,8.9,72,101076,0,711,360,0,0,0,0,0,0,0,120,5.7,10,10,9656.0,1981,9,999999999,24,0.1410,0,88,0.096,0.0,0.0 +2010,10,14,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,8.3,69,100976,0,0,350,0,0,0,0,0,0,0,110,7.2,9,9,9656.0,1067,9,999999999,22,0.1410,0,88,0.096,0.0,0.0 +2010,10,14,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.9,8.3,69,100976,0,0,350,0,0,0,0,0,0,0,110,7.2,9,9,9656.0,1067,9,999999999,22,0.1410,0,88,0.096,0.0,0.0 +2010,10,14,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,9.4,77,100726,0,0,348,0,0,0,0,0,0,0,90,8.8,9,9,9656.0,1219,9,999999999,25,0.1410,0,88,0.096,0.0,0.0 +2010,10,14,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,10.0,80,100596,0,0,359,0,0,0,0,0,0,0,80,9.3,10,10,9656.0,1128,0,919999999,26,0.1410,0,88,0.096,5.0,0.0 +2010,10,14,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,10.0,80,100596,0,0,359,0,0,0,0,0,0,0,80,9.3,10,10,9656.0,1128,0,919999999,26,0.1410,0,88,0.096,5.0,0.0 +2010,10,14,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,12.0,11.0,94,101280,0,0,353,0,0,0,0,0,0,0,70,9.8,10,10,6437.0,853,0,919999999,29,0.1410,0,88,0.096,5.0,0.0 +2010,10,15,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,12.0,11.0,94,101280,0,0,353,0,0,0,0,0,0,0,50,8.2,10,10,4828.0,1006,0,019999999,29,0.1400,0,88,0.096,5.0,0.0 +2010,10,15,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,11.7,10.6,93,101280,0,0,352,0,0,0,0,0,0,0,50,11.8,10,10,6000.0,1006,0,019999999,28,0.1400,0,88,0.096,5.0,0.0 +2010,10,15,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.0,11.0,94,101280,0,0,353,0,0,0,0,0,0,0,30,12.9,10,10,6000.0,335,0,019999999,29,0.1400,0,88,0.096,5.0,0.0 +2010,10,15,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,12.0,11.0,94,101280,0,0,353,0,0,0,0,0,0,0,40,10.8,10,10,9656.0,244,0,019999999,29,0.1400,0,88,0.096,5.0,0.0 +2010,10,15,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,12.2,11.7,97,99036,0,0,355,0,0,0,0,0,0,0,20,6.7,10,10,4000.0,244,0,019999999,31,0.1400,0,88,0.096,0.6,0.0 +2010,10,15,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,11.0,10.0,94,101280,0,0,347,0,0,0,0,0,0,0,290,10.3,10,10,4023.0,244,0,019999999,27,0.1400,0,88,0.096,0.0,0.0 +2010,10,15,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,10.0,8.0,87,101280,127,672,340,1,0,1,97,0,98,43,290,10.8,10,10,4828.0,427,0,019999999,22,0.1400,0,88,0.096,0.0,0.0 +2010,10,15,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,10.0,7.8,86,98686,370,1376,340,26,0,26,2573,0,2593,1151,290,10.3,10,10,4800.0,427,0,019999999,21,0.1400,0,88,0.096,0.0,0.0 +2010,10,15,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,6.0,76,101280,579,1376,338,78,0,78,7862,0,7927,3507,280,10.3,10,10,4800.0,1128,0,019999999,18,0.1400,0,88,0.096,0.0,0.0 +2010,10,15,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,6.0,76,101280,739,1376,338,181,27,168,20935,1922,19520,7278,260,11.8,10,10,4800.0,610,0,019999999,18,0.1400,0,88,0.096,0.0,0.0 +2010,10,15,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.0,5.0,71,98786,840,1376,337,365,191,253,41596,15831,28992,10480,260,10.8,10,10,4800.0,610,0,019999999,16,0.1400,0,88,0.096,0.0,0.0 +2010,10,15,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,4.4,61,98756,874,1376,344,349,127,272,39778,10787,31178,11272,250,13.9,10,10,4800.0,1036,0,019999999,15,0.1400,0,88,0.096,0.0,0.0 +2010,10,15,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,3.9,59,98696,840,1376,344,329,99,268,37336,8457,30586,10882,270,11.3,10,10,4800.0,1097,0,019999999,14,0.1400,0,88,0.096,0.0,0.0 +2010,10,15,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,3.9,59,98696,739,1376,334,241,77,200,27513,5941,22945,8268,270,11.3,9,9,4800.0,1097,0,019999999,14,0.1400,0,88,0.096,0.0,0.0 +2010,10,15,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,3.3,59,98696,579,1376,340,261,388,99,30557,22667,11629,4287,270,9.3,10,10,4800.0,1219,0,019999999,13,0.1400,0,88,0.096,0.0,0.0 +2010,10,15,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,3.3,59,98696,371,1376,331,153,98,126,16694,5619,13809,4032,270,8.8,9,9,4800.0,1524,0,019999999,13,0.1400,0,88,0.096,0.0,0.0 +2010,10,15,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.1,3.3,59,98696,128,1376,340,78,73,65,8123,801,6800,1408,270,8.7,10,10,4800.0,1524,0,019999999,13,0.1400,0,88,0.096,0.0,0.0 +2010,10,15,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,5.0,74,98816,0,674,334,0,0,0,0,0,0,0,270,9.8,10,10,4800.0,1219,0,019999999,16,0.1400,0,88,0.096,0.0,0.0 +2010,10,15,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,3.9,76,98866,0,0,325,0,0,0,0,0,0,0,250,12.4,10,10,4800.0,1676,0,019999999,14,0.1400,0,88,0.096,0.0,0.0 +2010,10,15,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.8,3.9,76,98866,0,0,325,0,0,0,0,0,0,0,250,12.3,10,10,4800.0,1676,0,919999999,14,0.1400,0,88,0.099,0.0,0.0 +2010,10,15,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,3.9,80,98995,0,0,322,0,0,0,0,0,0,0,260,9.3,10,10,4800.0,945,0,919999999,14,0.1400,0,88,0.099,1.0,0.0 +2010,10,15,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.0,4.0,81,101279,0,0,322,0,0,0,0,0,0,0,260,9.3,10,10,4800.0,884,0,919999999,15,0.1400,0,88,0.099,0.0,0.0 +2010,10,15,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.7,3.9,82,99055,0,0,320,0,0,0,0,0,0,0,260,9.3,10,10,4800.0,884,0,919999999,14,0.1400,0,88,0.099,0.0,0.0 +2010,10,15,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,2.8,76,99185,0,0,319,0,0,0,0,0,0,0,280,7.7,10,10,4800.0,2438,0,919999999,13,0.1400,0,88,0.099,0.0,0.0 +2010,10,16,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,2.8,76,99265,0,0,319,0,0,0,0,0,0,0,290,9.3,10,10,4800.0,1981,0,919999999,13,0.1390,0,88,0.099,0.0,0.0 +2010,10,16,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.7,2.8,76,99265,0,0,310,0,0,0,0,0,0,0,290,9.3,9,9,4800.0,1981,0,919999999,13,0.1390,0,88,0.099,0.0,0.0 +2010,10,16,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,2.2,68,99375,0,0,314,0,0,0,0,0,0,0,300,7.2,9,9,4800.0,2286,0,919999999,12,0.1390,0,88,0.099,0.0,0.0 +2010,10,16,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,2.2,70,99455,0,0,312,0,0,0,0,0,0,0,300,7.2,9,9,4800.0,2591,0,919999999,12,0.1390,0,88,0.099,0.0,0.0 +2010,10,16,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.2,2.2,70,99455,0,0,290,0,0,0,0,0,0,0,300,7.2,3,3,4800.0,2591,0,919999999,12,0.1390,0,88,0.099,0.0,0.0 +2010,10,16,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,2.2,68,99635,0,0,314,0,0,0,0,0,0,0,300,7.2,9,9,4800.0,3048,0,919999999,12,0.1390,0,88,0.099,0.0,0.0 +2010,10,16,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,2.2,65,99745,122,645,299,27,151,14,3182,0,1651,534,300,6.2,5,5,4800.0,77777,0,919999999,12,0.1390,0,88,0.099,0.0,0.0 +2010,10,16,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,2.2,65,99745,365,1377,299,146,447,40,17443,13422,4787,1695,300,6.2,5,5,4800.0,77777,0,919999999,12,0.1390,0,88,0.099,0.0,0.0 +2010,10,16,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,2.2,56,99926,573,1377,309,308,694,65,37213,35862,7872,2979,320,9.8,5,5,4800.0,77777,0,919999999,12,0.1390,0,88,0.099,0.0,0.0 +2010,10,16,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,2.2,52,99956,733,1377,332,322,339,181,37032,25357,20914,7660,320,11.8,9,9,4800.0,2438,0,919999999,12,0.1390,0,88,0.099,0.0,0.0 +2010,10,16,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,2.2,52,99956,833,1377,332,503,615,147,59816,42506,17553,6919,320,11.8,9,9,4800.0,2438,0,919999999,12,0.1390,0,88,0.099,0.0,0.0 +2010,10,16,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,2.2,45,99996,867,1377,323,590,756,125,71422,49869,15188,6129,320,11.3,5,5,4800.0,77777,0,919999999,12,0.1390,0,88,0.099,0.0,0.0 +2010,10,16,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,2.2,45,100056,833,1377,323,624,880,89,66140,88479,12731,1928,310,11.8,5,5,4800.0,77777,0,919999999,12,0.1390,0,88,0.099,0.0,0.0 +2010,10,16,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,2.2,45,100056,732,1377,323,565,859,84,68943,50865,10279,4064,310,11.8,5,5,4800.0,77777,0,919999999,12,0.1390,0,88,0.099,0.0,0.0 +2010,10,16,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,2.2,45,100216,572,1377,323,454,808,76,54191,43540,9096,3414,310,10.8,5,5,4800.0,77777,0,919999999,12,0.1390,0,88,0.099,0.0,0.0 +2010,10,16,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,1.7,47,100336,363,1377,318,303,706,64,34886,26632,7389,2517,320,10.8,5,5,4800.0,77777,0,919999999,11,0.1390,0,88,0.099,0.0,0.0 +2010,10,16,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,1.7,47,100336,121,1377,318,137,479,40,14816,0,4340,1164,320,10.8,5,5,4800.0,77777,0,919999999,11,0.1390,0,88,0.099,0.0,0.0 +2010,10,16,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,1.7,52,100635,0,637,310,0,0,0,0,0,0,0,320,9.3,5,5,4800.0,77777,0,919999999,12,0.1390,0,88,0.099,0.0,0.0 +2010,10,16,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,2.2,56,100705,0,0,304,0,0,0,0,0,0,0,320,5.1,3,3,4800.0,77777,0,919999999,12,0.1390,0,88,0.099,0.0,0.0 +2010,10,16,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,2.2,56,100705,0,0,304,0,0,0,0,0,0,0,320,5.1,3,3,4800.0,77777,9,999999999,12,0.1390,0,88,0.099,0.0,0.0 +2010,10,16,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,3.3,63,100785,0,0,303,0,0,0,0,0,0,0,300,8.2,3,3,4800.0,77777,9,999999999,14,0.1390,0,88,0.099,0.0,0.0 +2010,10,16,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,3.9,66,100815,0,0,291,0,0,0,0,0,0,0,300,7.2,0,0,4800.0,77777,9,999999999,14,0.1390,0,88,0.099,0.0,0.0 +2010,10,16,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,3.9,66,100815,0,0,291,0,0,0,0,0,0,0,300,7.2,0,0,4800.0,77777,9,999999999,14,0.1390,0,88,0.099,0.0,0.0 +2010,10,16,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,2.8,66,100845,0,0,285,0,0,0,0,0,0,0,290,5.7,0,0,4800.0,77777,9,999999999,13,0.1390,0,88,0.099,0.0,0.0 +2010,10,17,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,2.2,65,100855,0,0,282,0,0,0,0,0,0,0,290,5.7,0,0,4800.0,77777,9,999999999,12,0.1380,0,88,0.099,0.0,0.0 +2010,10,17,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,2.2,65,100855,0,0,282,0,0,0,0,0,0,0,290,5.7,0,0,4800.0,77777,9,999999999,12,0.1380,0,88,0.099,0.0,0.0 +2010,10,17,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,2.2,68,100845,0,0,280,0,0,0,0,0,0,0,280,3.1,0,0,4800.0,77777,9,999999999,12,0.1380,0,88,0.099,0.0,0.0 +2010,10,17,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,2.2,68,100845,0,0,280,0,0,0,0,0,0,0,260,3.1,0,0,4800.0,77777,9,999999999,12,0.1380,0,88,0.099,0.0,0.0 +2010,10,17,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,2.2,68,100845,0,0,280,0,0,0,0,0,0,0,260,3.1,0,0,4800.0,77777,9,999999999,12,0.1380,0,88,0.099,0.0,0.0 +2010,10,17,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,2.2,68,100875,0,0,280,0,0,0,0,0,0,0,270,3.1,0,0,4800.0,77777,9,999999999,12,0.1380,0,88,0.099,0.0,0.0 +2010,10,17,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,2.2,65,100895,117,619,294,27,164,13,3190,0,1537,497,260,4.6,3,3,4800.0,77777,9,999999999,12,0.1380,0,88,0.099,0.0,0.0 +2010,10,17,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,2.2,65,100895,359,1377,299,112,256,58,12979,9010,6738,2315,260,4.6,5,5,4800.0,77777,9,999999999,12,0.1380,0,88,0.099,0.0,0.0 +2010,10,17,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,2.8,58,100825,568,1377,328,150,156,119,17268,9733,13751,4916,280,5.7,9,9,4800.0,3962,9,999999999,13,0.1380,0,88,0.099,0.0,0.0 +2010,10,17,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,2.8,53,100755,727,1377,317,387,520,122,45847,33841,14507,5594,270,6.2,5,5,4800.0,77777,9,999999999,13,0.1380,0,88,0.099,0.0,0.0 +2010,10,17,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,2.8,53,100755,827,1377,335,406,332,223,46670,26480,25767,9518,270,6.2,9,9,4800.0,77777,9,999999999,13,0.1380,0,88,0.099,0.0,0.0 +2010,10,17,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,3.9,46,100596,861,1377,353,525,552,193,61362,41214,22666,8733,280,6.2,9,9,4800.0,7620,9,999999999,14,0.1380,0,88,0.099,0.0,0.0 +2010,10,17,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,5.0,44,100466,826,1377,342,608,819,113,73612,51787,13729,5512,260,5.7,5,5,4800.0,77777,9,999999999,16,0.1380,0,88,0.099,0.0,0.0 +2010,10,17,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,5.0,44,100466,725,1377,342,548,793,108,65464,49119,12946,5043,260,5.7,5,5,4800.0,77777,9,999999999,16,0.1380,0,88,0.099,0.0,0.0 +2010,10,17,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,5.0,43,100406,565,1377,365,230,200,117,26479,12214,13520,4843,280,8.8,9,9,4800.0,7620,9,999999999,16,0.1380,0,88,0.099,0.0,0.0 +2010,10,17,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,5.6,45,100396,356,1377,345,209,413,93,23266,18582,10391,3286,290,6.2,5,5,4800.0,77777,9,999999999,17,0.1380,0,88,0.099,0.0,0.0 +2010,10,17,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,5.6,45,100396,114,1377,345,125,352,50,13179,0,5293,1232,290,6.2,5,5,4800.0,77777,9,999999999,17,0.1380,0,88,0.099,0.0,0.0 +2010,10,17,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,5.0,48,100566,0,601,357,0,0,0,0,0,0,0,310,4.6,9,9,4800.0,1829,9,999999999,16,0.1380,0,88,0.099,0.0,0.0 +2010,10,17,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,3.3,45,100636,0,0,349,0,0,0,0,0,0,0,320,4.6,9,9,4800.0,1981,9,999999999,13,0.1380,0,88,0.099,0.0,0.0 +2010,10,17,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.0,3.3,45,100636,0,0,349,0,0,0,0,0,0,0,320,4.6,9,9,4800.0,1981,9,999999999,13,0.1380,0,88,0.099,0.0,0.0 +2010,10,17,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,2.8,47,100786,0,0,324,0,0,0,0,0,0,0,290,3.6,5,5,4800.0,77777,9,999999999,13,0.1380,0,88,0.099,0.0,0.0 +2010,10,17,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,2.8,49,100806,0,0,303,0,0,0,0,0,0,0,270,4.1,0,0,4800.0,77777,9,999999999,13,0.1380,0,88,0.099,0.0,0.0 +2010,10,17,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,2.8,49,100806,0,0,317,0,0,0,0,0,0,0,270,4.1,3,3,4800.0,77777,9,999999999,13,0.1380,0,88,0.099,0.0,0.0 +2010,10,17,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,2.8,54,100795,0,0,310,0,0,0,0,0,0,0,250,5.1,3,3,4800.0,77777,9,999999999,13,0.1380,0,88,0.099,0.0,0.0 +2010,10,18,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,2.2,54,100815,0,0,294,0,0,0,0,0,0,0,260,6.7,0,0,4800.0,77777,9,999999999,12,0.1370,0,88,0.099,0.0,0.0 +2010,10,18,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,2.2,54,100815,0,0,294,0,0,0,0,0,0,0,260,6.7,0,0,4800.0,77777,9,999999999,12,0.1370,0,88,0.099,0.0,0.0 +2010,10,18,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,2.2,58,100885,0,0,289,0,0,0,0,0,0,0,270,6.2,0,0,4800.0,77777,9,999999999,12,0.1370,0,88,0.099,0.0,0.0 +2010,10,18,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,2.2,61,100955,0,0,299,0,0,0,0,0,0,0,290,5.7,3,3,4800.0,77777,9,999999999,12,0.1370,0,88,0.099,0.0,0.0 +2010,10,18,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,2.2,61,100955,0,0,299,0,0,0,0,0,0,0,290,5.7,3,3,4800.0,77777,9,999999999,12,0.1370,0,88,0.099,0.0,0.0 +2010,10,18,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,2.2,63,101025,0,0,302,0,0,0,0,0,0,0,300,4.1,5,5,4800.0,77777,9,999999999,12,0.1370,0,88,0.099,0.0,0.0 +2010,10,18,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,2.8,63,101075,112,592,300,25,148,14,2927,0,1640,526,280,5.1,3,3,4800.0,77777,9,999999999,13,0.1370,0,88,0.099,0.0,0.0 +2010,10,18,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,2.8,63,101075,354,1378,300,145,460,40,17266,13099,4771,1680,280,5.1,3,3,4800.0,77777,9,999999999,13,0.1370,0,88,0.099,0.0,0.0 +2010,10,18,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,0.0,44,101175,562,1378,306,308,714,64,37190,36892,7746,2918,290,6.2,3,3,4800.0,77777,9,999999999,10,0.1370,0,88,0.099,0.0,0.0 +2010,10,18,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,-2.8,33,101125,721,1378,313,459,819,80,56169,49012,9816,3869,300,4.6,5,5,4800.0,77777,9,999999999,7,0.1370,0,88,0.099,0.0,0.0 +2010,10,18,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,-2.8,33,101125,821,1378,313,570,868,90,60053,86726,12883,1897,300,4.6,5,5,4800.0,77777,9,999999999,7,0.1370,0,88,0.099,0.0,0.0 +2010,10,18,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,-2.8,30,100986,855,1378,318,627,892,93,66005,89353,13215,1999,280,5.7,5,5,4800.0,77777,9,999999999,7,0.1370,0,88,0.099,0.0,0.0 +2010,10,18,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,-2.2,31,100906,820,1378,321,573,724,138,68387,50090,16535,6516,280,7.7,5,5,4800.0,77777,9,999999999,8,0.1370,0,88,0.099,0.0,0.0 +2010,10,18,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,-2.2,31,100906,719,1378,321,569,891,79,60168,88138,11573,1630,280,7.7,5,5,4800.0,77777,9,999999999,8,0.1370,0,88,0.099,0.0,0.0 +2010,10,18,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,-1.7,32,100876,558,1378,321,451,810,80,53516,44834,9520,3535,270,9.3,5,5,4800.0,77777,9,999999999,8,0.1370,0,88,0.099,0.0,0.0 +2010,10,18,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,-1.1,34,100926,349,1378,322,247,421,90,27571,19282,10082,3182,290,5.7,5,5,4800.0,77777,9,999999999,9,0.1370,0,88,0.099,0.0,0.0 +2010,10,18,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,-1.1,34,100926,107,1378,341,98,178,50,10304,0,5279,1178,290,5.7,9,9,4800.0,77777,9,999999999,9,0.1370,0,88,0.099,0.0,0.0 +2010,10,18,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,-0.6,38,100975,0,565,336,0,0,0,0,0,0,0,260,3.6,9,9,4800.0,2286,9,999999999,9,0.1370,0,88,0.099,0.0,0.0 +2010,10,18,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,0.6,42,101025,0,0,338,0,0,0,0,0,0,0,270,3.6,9,9,4800.0,6096,9,999999999,10,0.1370,0,88,0.099,0.0,0.0 +2010,10,18,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,0.6,42,101025,0,0,319,0,0,0,0,0,0,0,270,3.6,5,5,4800.0,6096,9,999999999,10,0.1370,0,88,0.099,0.0,0.0 +2010,10,18,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,-0.6,44,101145,0,0,308,0,0,0,0,0,0,0,290,4.6,5,5,4800.0,77777,9,999999999,9,0.1370,0,88,0.099,0.0,0.0 +2010,10,18,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,-1.7,42,101185,0,0,288,0,0,0,0,0,0,0,290,4.1,0,0,4800.0,77777,9,999999999,8,0.1370,0,88,0.099,0.0,0.0 +2010,10,18,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,-1.7,42,101185,0,0,300,0,0,0,0,0,0,0,290,4.1,3,3,4800.0,77777,9,999999999,8,0.1370,0,88,0.099,0.0,0.0 +2010,10,18,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,-1.1,49,101235,0,0,293,0,0,0,0,0,0,0,290,4.6,3,3,4800.0,77777,9,999999999,9,0.1370,0,88,0.099,0.0,0.0 +2010,10,19,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,-1.7,48,101255,0,0,312,0,0,0,0,0,0,0,290,4.6,9,9,4800.0,7620,9,999999999,8,0.1360,0,88,0.099,0.0,0.0 +2010,10,19,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.3,-1.7,48,101255,0,0,312,0,0,0,0,0,0,0,290,4.6,9,9,4800.0,7620,9,999999999,8,0.1360,0,88,0.099,0.0,0.0 +2010,10,19,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,-1.1,55,101194,0,0,308,0,0,0,0,0,0,0,280,3.6,9,9,4800.0,7620,9,999999999,9,0.1360,0,88,0.099,0.0,0.0 +2010,10,19,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-1.1,57,101194,0,0,315,0,0,0,0,0,0,0,300,2.6,10,10,4800.0,6096,9,999999999,9,0.1360,0,88,0.099,0.0,0.0 +2010,10,19,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.7,-1.1,57,101194,0,0,315,0,0,0,0,0,0,0,300,2.6,10,10,4800.0,6096,9,999999999,9,0.1360,0,88,0.099,0.0,0.0 +2010,10,19,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-1.1,57,101214,0,0,315,0,0,0,0,0,0,0,290,3.6,10,10,4800.0,4267,9,999999999,9,0.1360,0,88,0.099,0.0,0.0 +2010,10,19,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,-1.1,55,101294,107,565,317,6,0,6,583,0,587,242,290,3.6,10,10,4800.0,4267,9,999999999,9,0.1360,0,88,0.099,0.0,0.0 +2010,10,19,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.2,-1.1,55,101294,349,1379,317,77,93,54,8952,3133,6293,2160,290,3.6,10,10,4800.0,4267,9,999999999,9,0.1360,0,88,0.099,0.0,0.0 +2010,10,19,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,0.0,54,101305,556,1379,299,259,489,71,30989,25862,8517,3185,290,4.6,5,5,4800.0,77777,9,999999999,10,0.1360,0,88,0.099,0.0,0.0 +2010,10,19,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,-0.6,47,101285,715,1379,303,387,555,130,45563,37408,15364,5850,250,1.5,5,5,4800.0,77777,9,999999999,9,0.1360,0,88,0.099,0.0,0.0 +2010,10,19,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,-0.6,47,101285,815,1379,299,564,879,82,59718,88019,11815,1846,250,1.5,3,3,4800.0,77777,9,999999999,9,0.1360,0,88,0.099,0.0,0.0 +2010,10,19,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,-2.2,33,101125,848,1379,316,621,902,85,65585,90422,12154,1942,300,5.1,5,5,4800.0,77777,9,999999999,8,0.1360,0,88,0.099,0.0,0.0 +2010,10,19,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,-1.7,33,101046,813,1379,319,619,900,85,65395,89985,12224,1857,270,5.7,5,5,4800.0,77777,9,999999999,8,0.1360,0,88,0.099,0.0,0.0 +2010,10,19,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,-1.7,33,101046,712,1379,319,558,877,81,68090,52244,9911,3894,270,5.7,5,5,4800.0,77777,9,999999999,8,0.1360,0,88,0.099,0.0,0.0 +2010,10,19,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,-1.1,35,101056,551,1379,320,404,663,105,46855,39940,12220,4399,280,5.1,5,5,4800.0,77777,9,999999999,9,0.1360,0,88,0.099,0.0,0.0 +2010,10,19,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,-0.6,38,101085,343,1379,318,250,541,94,27742,25138,10470,3240,280,4.6,5,5,4800.0,77777,9,999999999,9,0.1360,0,88,0.099,0.0,0.0 +2010,10,19,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,-0.6,38,101085,100,1379,313,124,434,39,13251,0,4183,1045,280,4.6,3,3,4800.0,77777,9,999999999,9,0.1360,0,88,0.099,0.0,0.0 +2010,10,19,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,0.6,43,101185,0,529,317,0,0,0,0,0,0,0,290,3.1,5,5,4800.0,77777,9,999999999,10,0.1360,0,88,0.099,0.0,0.0 +2010,10,19,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,0.6,45,101235,0,0,314,0,0,0,0,0,0,0,280,2.6,5,5,4800.0,77777,9,999999999,10,0.1360,0,88,0.099,0.0,0.0 +2010,10,19,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,0.6,45,101235,0,0,309,0,0,0,0,0,0,0,280,2.6,3,3,4800.0,77777,9,999999999,10,0.1360,0,88,0.099,0.0,0.0 +2010,10,19,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,3.9,66,101285,0,0,308,0,0,0,0,0,0,0,150,2.1,5,5,4800.0,77777,9,999999999,15,0.1360,0,88,0.099,0.0,0.0 +2010,10,19,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,2.8,68,101315,0,0,300,0,0,0,0,0,0,0,210,1.5,5,5,4800.0,77777,9,999999999,13,0.1360,0,88,0.099,0.0,0.0 +2010,10,19,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,2.8,68,101315,0,0,295,0,0,0,0,0,0,0,210,1.5,3,3,4800.0,77777,9,999999999,13,0.1360,0,88,0.099,0.0,0.0 +2010,10,19,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,2.8,68,101305,0,0,300,0,0,0,0,0,0,0,220,3.6,5,5,4800.0,77777,9,999999999,13,0.1360,0,88,0.099,0.0,0.0 +2010,10,20,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,3.9,74,101285,0,0,301,0,0,0,0,0,0,0,210,3.1,5,5,4800.0,77777,9,999999999,15,0.1340,0,88,0.099,0.0,0.0 +2010,10,20,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,3.9,74,101285,0,0,301,0,0,0,0,0,0,0,210,3.1,5,5,4800.0,77777,9,999999999,15,0.1340,0,88,0.099,0.0,0.0 +2010,10,20,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,5.0,82,101274,0,0,317,0,0,0,0,0,0,0,220,2.1,9,9,4800.0,2743,9,999999999,16,0.1340,0,88,0.099,0.0,0.0 +2010,10,20,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,5.6,83,101265,0,0,329,0,0,0,0,0,0,0,220,2.6,10,10,4800.0,2743,9,999999999,17,0.1340,0,88,0.099,0.0,0.0 +2010,10,20,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,5.6,86,101264,0,0,318,0,0,0,0,0,0,0,230,1.5,9,9,4800.0,2743,9,999999999,17,0.1340,0,88,0.099,0.0,0.0 +2010,10,20,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,6.1,86,101275,0,0,321,0,0,0,0,0,0,0,210,2.1,9,9,4800.0,2591,9,999999999,18,0.1340,0,88,0.099,0.0,0.0 +2010,10,20,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,6.1,83,101295,101,538,324,9,0,9,871,0,877,350,257,0.0,9,9,4800.0,1829,9,999999999,18,0.1340,0,88,0.099,0.0,0.0 +2010,10,20,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.9,6.1,83,101295,343,1380,333,46,0,46,4546,0,4580,1879,253,0.0,10,10,4800.0,1829,9,999999999,18,0.1340,0,88,0.099,0.0,0.0 +2010,10,20,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,6.1,71,101305,551,1380,334,160,90,124,18266,5554,14212,4994,235,0.0,9,9,4800.0,7620,9,999999999,18,0.1340,0,88,0.099,0.0,0.0 +2010,10,20,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,7.2,69,101245,709,1380,343,366,496,119,43227,31050,14107,5419,140,2.6,9,9,4800.0,7620,9,999999999,20,0.1340,0,88,0.099,0.0,0.0 +2010,10,20,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.8,7.2,69,101245,809,1380,324,483,593,153,56909,40341,18104,7050,140,2.6,5,5,4800.0,7620,9,999999999,20,0.1340,0,88,0.099,0.0,0.0 +2010,10,20,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,6.7,58,101106,842,1380,353,497,494,205,57557,37246,23860,9030,140,4.6,9,9,4800.0,7620,9,999999999,19,0.1340,0,88,0.099,0.0,0.0 +2010,10,20,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,4.4,47,101006,806,1380,364,476,442,214,54661,34568,24700,9102,200,4.1,10,10,4800.0,6096,9,999999999,15,0.1340,0,88,0.099,0.0,0.0 +2010,10,20,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.6,4.4,47,101006,705,1380,364,361,236,230,40471,19440,25923,8780,200,4.1,10,10,4800.0,6096,9,999999999,15,0.1340,0,88,0.099,0.0,0.0 +2010,10,20,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,2.2,39,100936,544,1380,363,297,268,180,32895,20156,20034,6360,230,4.6,10,10,4800.0,6401,9,999999999,12,0.1340,0,88,0.099,0.0,0.0 +2010,10,20,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,2.2,42,100886,336,1380,358,169,125,120,18319,6759,13066,3668,210,4.1,10,10,4800.0,6401,9,999999999,12,0.1340,0,88,0.099,0.0,0.0 +2010,10,20,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.0,2.2,42,100886,93,1380,358,61,27,53,6308,0,5506,1052,210,4.1,10,10,4800.0,6401,9,999999999,12,0.1340,0,88,0.099,0.0,0.0 +2010,10,20,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,6.7,62,100896,0,493,358,0,0,0,0,0,0,0,190,4.6,10,10,4800.0,4267,9,999999999,19,0.1340,0,88,0.099,0.0,0.0 +2010,10,20,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,6.7,66,100885,0,0,352,0,0,0,0,0,0,0,200,4.1,10,10,4800.0,4267,9,999999999,19,0.1340,0,88,0.099,0.0,0.0 +2010,10,20,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.8,6.7,66,100885,0,0,343,0,0,0,0,0,0,0,200,4.1,9,9,4800.0,4267,9,999999999,19,0.1340,0,88,0.099,0.0,0.0 +2010,10,20,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,6.7,71,100885,0,0,337,0,0,0,0,0,0,0,210,3.1,9,9,4800.0,6706,9,999999999,19,0.1340,0,88,0.099,0.0,0.0 +2010,10,20,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,6.7,77,100855,0,0,314,0,0,0,0,0,0,0,210,2.1,5,5,4800.0,77777,9,999999999,19,0.1340,0,88,0.099,0.0,0.0 +2010,10,20,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,6.7,77,100855,0,0,309,0,0,0,0,0,0,0,210,2.1,3,3,4800.0,77777,9,999999999,19,0.1340,0,88,0.099,0.0,0.0 +2010,10,20,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,6.7,83,100695,0,0,291,0,0,0,0,0,0,0,220,2.1,0,0,4800.0,77777,9,999999999,19,0.1340,0,88,0.099,0.0,0.0 +2010,10,21,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,5.6,80,100645,0,0,288,0,0,0,0,0,0,0,230,2.6,0,0,4800.0,77777,9,999999999,17,0.1330,0,88,0.099,0.0,0.0 +2010,10,21,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,5.6,80,100645,0,0,288,0,0,0,0,0,0,0,230,2.6,0,0,4800.0,77777,9,999999999,17,0.1330,0,88,0.099,0.0,0.0 +2010,10,21,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,5.6,83,100485,0,0,286,0,0,0,0,0,0,0,210,1.5,0,0,4800.0,77777,9,999999999,17,0.1330,0,88,0.099,0.0,0.0 +2010,10,21,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,5.0,82,100425,0,0,295,0,0,0,0,0,0,0,200,2.6,3,3,4800.0,77777,9,999999999,16,0.1330,0,88,0.099,0.0,0.0 +2010,10,21,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,5.0,82,100425,0,0,295,0,0,0,0,0,0,0,200,2.6,3,3,4800.0,77777,9,999999999,16,0.1330,0,88,0.099,0.0,0.0 +2010,10,21,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,6.1,89,100315,0,0,301,0,0,0,0,0,0,0,200,2.6,5,5,4800.0,77777,9,999999999,18,0.1330,0,88,0.099,0.0,0.0 +2010,10,21,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,8.9,7.8,93,100295,96,510,290,8,0,8,773,0,779,313,180,5.1,0,0,8047.0,77777,9,999999999,21,0.1330,0,88,0.099,0.0,0.0 +2010,10,21,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,8.9,7.8,93,100295,338,1381,303,48,0,48,4737,0,4773,1938,180,5.1,3,3,8000.0,77777,9,999999999,21,0.1330,0,88,0.099,0.0,0.0 +2010,10,21,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,8.3,77,100156,545,1381,304,105,9,101,12157,500,11735,4242,190,5.7,0,0,8000.0,77777,9,999999999,22,0.1330,0,88,0.099,0.0,0.0 +2010,10,21,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,8.3,72,100076,703,1381,328,220,84,178,25129,6038,20428,7388,200,6.2,5,5,8000.0,77777,9,999999999,22,0.1330,0,88,0.099,0.0,0.0 +2010,10,21,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,8.3,72,100076,802,1381,357,242,47,218,27683,3622,25067,9193,200,6.2,10,10,8000.0,77777,9,999999999,22,0.1330,0,88,0.099,0.0,0.0 +2010,10,21,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,8.9,67,99896,835,1381,366,185,11,178,21618,776,20897,8072,220,4.6,10,10,8000.0,1524,9,999999999,23,0.1330,0,88,0.099,0.0,0.0 +2010,10,21,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.0,9.0,77,101280,800,1381,356,189,17,179,21944,1206,20881,7937,240,7.7,10,10,8000.0,853,0,919999999,24,0.1330,0,88,0.099,0.0,0.0 +2010,10,21,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,9.4,77,99826,698,1381,348,271,116,211,30487,8918,23860,8264,240,6.7,9,9,8000.0,853,0,919999999,25,0.1330,0,88,0.099,0.0,0.0 +2010,10,21,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,3.9,61,99906,538,1381,341,160,72,124,18229,4487,14183,4935,290,10.3,10,10,8000.0,1829,0,919999999,14,0.1330,0,88,0.099,0.0,0.0 +2010,10,21,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,5.0,68,99936,329,1381,312,178,191,125,19166,10394,13521,3677,270,8.8,5,5,8000.0,77777,0,919999999,16,0.1330,0,88,0.099,0.0,0.0 +2010,10,21,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,5.0,68,99936,86,1381,312,83,220,54,8511,0,5564,970,270,8.7,5,5,8000.0,77777,0,919999999,16,0.1330,0,88,0.099,0.0,0.0 +2010,10,21,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,3.9,63,100155,0,458,311,0,0,0,0,0,0,0,280,7.2,5,5,8000.0,77777,0,919999999,14,0.1330,0,88,0.099,0.0,0.0 +2010,10,21,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,2.8,58,100225,0,0,305,0,0,0,0,0,0,0,270,8.2,3,3,8000.0,77777,0,919999999,13,0.1330,0,88,0.099,0.0,0.0 +2010,10,21,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,2.8,58,100225,0,0,305,0,0,0,0,0,0,0,270,8.2,3,3,8000.0,77777,9,999999999,13,0.1330,0,88,0.099,0.0,0.0 +2010,10,21,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,1.7,59,100395,0,0,298,0,0,0,0,0,0,0,270,8.2,3,3,8000.0,77777,9,999999999,12,0.1330,0,88,0.099,0.0,0.0 +2010,10,21,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,1.1,60,100455,0,0,293,0,0,0,0,0,0,0,280,5.7,3,3,8000.0,77777,9,999999999,11,0.1330,0,88,0.099,0.5,0.0 +2010,10,21,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,1.1,60,100455,0,0,293,0,0,0,0,0,0,0,280,5.7,3,3,8000.0,77777,9,999999999,11,0.1330,0,88,0.099,0.0,0.0 +2010,10,21,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,0.6,60,100555,0,0,291,0,0,0,0,0,0,0,280,4.6,3,3,8000.0,77777,9,999999999,10,0.1330,0,88,0.099,0.0,0.0 +2010,10,22,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,0.0,60,100595,0,0,292,0,0,0,0,0,0,0,280,5.1,5,5,8000.0,77777,9,999999999,10,0.1320,0,88,0.099,0.0,0.0 +2010,10,22,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,0.0,60,100595,0,0,288,0,0,0,0,0,0,0,280,5.1,3,3,8000.0,77777,9,999999999,10,0.1320,0,88,0.099,0.0,0.0 +2010,10,22,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,0.6,73,100624,0,0,268,0,0,0,0,0,0,0,240,2.1,0,0,8000.0,77777,9,999999999,10,0.1320,0,88,0.099,0.0,0.0 +2010,10,22,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,0.0,67,100724,0,0,302,0,0,0,0,0,0,0,290,3.1,9,9,8000.0,1463,9,999999999,10,0.1320,0,88,0.099,0.0,0.0 +2010,10,22,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.6,0.0,67,100724,0,0,281,0,0,0,0,0,0,0,290,3.1,3,3,8000.0,1463,9,999999999,10,0.1320,0,88,0.099,0.0,0.0 +2010,10,22,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,0.0,67,100864,0,0,302,0,0,0,0,0,0,0,270,5.7,9,9,8000.0,1981,9,999999999,10,0.1320,0,88,0.099,0.0,0.0 +2010,10,22,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-1.1,61,100944,91,483,301,20,154,11,2354,0,1296,413,270,6.2,9,9,8000.0,2134,9,999999999,9,0.1320,0,88,0.099,0.0,0.0 +2010,10,22,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.6,-1.1,61,100944,332,1381,301,91,201,55,10512,6451,6369,2156,270,6.2,9,9,8000.0,2134,9,999999999,9,0.1320,0,88,0.099,0.0,0.0 +2010,10,22,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,-4.4,42,101084,539,1381,287,274,628,69,32764,33147,8272,3073,280,8.2,5,5,8000.0,77777,9,999999999,6,0.1320,0,88,0.099,0.0,0.0 +2010,10,22,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,-5.6,35,101075,697,1381,286,426,743,80,51929,44599,9778,3822,300,8.2,3,3,8000.0,77777,9,999999999,6,0.1320,0,88,0.099,0.0,0.0 +2010,10,22,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,-5.6,35,101075,796,1381,291,451,563,163,52951,41494,19221,7360,300,8.2,5,5,8000.0,77777,9,999999999,6,0.1320,0,88,0.099,0.0,0.0 +2010,10,22,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,-6.1,31,101005,829,1381,295,617,934,75,65181,93280,10830,1819,300,8.8,5,5,8000.0,77777,9,999999999,5,0.1320,0,88,0.099,0.0,0.0 +2010,10,22,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,-6.7,29,100985,793,1381,294,517,597,171,60454,44847,20085,7628,280,9.8,5,5,8000.0,77777,9,999999999,5,0.1320,0,88,0.099,0.0,0.0 +2010,10,22,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,-6.7,29,100985,692,1381,311,300,167,205,33954,13604,23317,8058,280,9.8,9,9,8000.0,77777,9,999999999,5,0.1320,0,88,0.099,0.0,0.0 +2010,10,22,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,-6.7,32,101135,531,1381,289,275,273,165,30645,20240,18472,5938,290,9.3,5,5,8000.0,77777,9,999999999,5,0.1320,0,88,0.099,0.0,0.0 +2010,10,22,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,-6.1,33,101205,322,1381,290,136,165,95,14997,7675,10517,3151,300,9.3,5,5,8000.0,77777,9,999999999,5,0.1320,0,88,0.099,0.0,0.0 +2010,10,22,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,-6.1,33,101205,80,1381,286,49,189,35,5207,0,3733,890,300,9.3,3,3,8000.0,77777,9,999999999,5,0.1320,0,88,0.099,0.0,0.0 +2010,10,22,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-7.2,34,101344,0,424,278,0,0,0,0,0,0,0,300,5.1,3,3,8000.0,77777,9,999999999,5,0.1320,0,88,0.099,0.0,0.0 +2010,10,22,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-6.7,35,101374,0,0,279,0,0,0,0,0,0,0,270,5.1,3,3,8000.0,77777,9,999999999,5,0.1320,0,88,0.099,0.0,0.0 +2010,10,22,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-6.7,35,101374,0,0,279,0,0,0,0,0,0,0,270,5.1,3,3,8000.0,77777,9,999999999,5,0.1320,0,88,0.099,0.0,0.0 +2010,10,22,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-5.0,43,101424,0,0,278,0,0,0,0,0,0,0,260,7.7,3,3,8000.0,77777,9,999999999,6,0.1320,0,88,0.099,0.0,0.0 +2010,10,22,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-5.0,43,101454,0,0,278,0,0,0,0,0,0,0,260,7.7,3,3,8000.0,77777,9,999999999,6,0.1320,0,88,0.099,0.0,0.0 +2010,10,22,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-5.0,43,101454,0,0,278,0,0,0,0,0,0,0,260,7.7,3,3,8000.0,77777,9,999999999,6,0.1320,0,88,0.099,0.0,0.0 +2010,10,22,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-3.9,51,101494,0,0,263,0,0,0,0,0,0,0,240,3.6,0,0,8000.0,77777,9,999999999,7,0.1320,0,88,0.099,0.0,0.0 +2010,10,23,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-5.0,46,101524,0,0,262,0,0,0,0,0,0,0,260,6.2,0,0,8000.0,77777,9,999999999,6,0.1310,0,88,0.099,0.0,0.0 +2010,10,23,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-5.0,46,101524,0,0,294,0,0,0,0,0,0,0,260,6.2,9,9,8000.0,77777,9,999999999,6,0.1310,0,88,0.099,0.0,0.0 +2010,10,23,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-3.3,55,101534,0,0,294,0,0,0,0,0,0,0,220,4.6,9,9,8000.0,1463,9,999999999,7,0.1310,0,88,0.099,0.0,0.0 +2010,10,23,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-2.2,58,101594,0,0,306,0,0,0,0,0,0,0,250,4.6,10,10,8000.0,1341,9,999999999,8,0.1310,0,88,0.099,0.0,0.0 +2010,10,23,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.0,-2.2,58,101594,0,0,281,0,0,0,0,0,0,0,250,4.6,5,5,8000.0,1341,9,999999999,8,0.1310,0,88,0.099,0.0,0.0 +2010,10,23,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-1.1,64,101674,0,0,282,0,0,0,0,0,0,0,280,5.1,5,5,8000.0,77777,9,999999999,9,0.1310,0,88,0.099,0.0,0.0 +2010,10,23,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-1.1,61,101744,85,455,284,18,125,11,2111,0,1291,409,280,6.2,5,5,8000.0,77777,9,999999999,9,0.1310,0,88,0.099,0.0,0.0 +2010,10,23,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-1.1,61,101744,327,1382,284,128,437,37,15225,10927,4408,1535,280,6.2,5,5,8000.0,77777,9,999999999,9,0.1310,0,88,0.099,0.0,0.0 +2010,10,23,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,-1.1,53,101784,533,1382,293,284,693,61,34214,34600,7365,2748,290,6.2,5,5,8000.0,77777,9,999999999,9,0.1310,0,88,0.099,0.0,0.0 +2010,10,23,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,-0.6,51,101764,691,1382,299,434,816,74,53102,47072,9077,3554,290,6.2,5,5,8000.0,77777,9,999999999,9,0.1310,0,88,0.099,0.0,0.0 +2010,10,23,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,-0.6,51,101764,790,1382,294,545,877,80,57739,87608,11591,1777,290,6.2,3,3,8000.0,77777,9,999999999,9,0.1310,0,88,0.099,0.0,0.0 +2010,10,23,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,-1.7,37,101645,822,1382,312,602,902,83,63647,90268,11938,1865,300,8.2,5,5,8000.0,77777,9,999999999,8,0.1310,0,88,0.099,0.0,0.0 +2010,10,23,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,0.0,40,101575,787,1382,318,599,900,83,63431,89900,12009,1784,280,6.2,5,5,8000.0,77777,9,999999999,10,0.1310,0,88,0.099,0.0,0.0 +2010,10,23,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,0.0,40,101575,685,1382,318,537,872,79,65299,50786,9632,3756,280,6.2,5,5,8000.0,77777,9,999999999,10,0.1310,0,88,0.099,0.0,0.0 +2010,10,23,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,-1.7,32,101585,524,1382,321,424,815,72,50346,42455,8572,3156,290,9.8,5,5,8000.0,77777,9,999999999,8,0.1310,0,88,0.099,0.0,0.0 +2010,10,23,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,-2.8,30,101635,316,1382,318,272,698,58,31137,22079,6657,2209,300,8.2,5,5,8000.0,77777,9,999999999,7,0.1310,0,88,0.099,0.0,0.0 +2010,10,23,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,-2.8,30,101635,73,1382,337,109,409,34,11537,0,3612,842,300,8.2,9,9,8000.0,77777,9,999999999,7,0.1310,0,88,0.099,0.0,0.0 +2010,10,23,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,-1.1,39,101865,0,389,307,0,0,0,0,0,0,0,300,4.6,3,3,8000.0,77777,9,999999999,9,0.1310,0,88,0.099,0.0,0.0 +2010,10,23,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,1.1,48,101925,0,0,308,0,0,0,0,0,0,0,300,2.6,3,3,8000.0,77777,9,999999999,11,0.1310,0,88,0.099,0.0,0.0 +2010,10,23,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,1.1,48,101925,0,0,308,0,0,0,0,0,0,0,300,2.6,3,3,8000.0,77777,9,999999999,11,0.1310,0,88,0.098,0.0,0.0 +2010,10,23,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,-2.2,43,102014,0,0,299,0,0,0,0,0,0,0,320,3.6,5,5,8000.0,77777,9,999999999,8,0.1310,0,88,0.098,0.0,0.0 +2010,10,23,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,-1.7,47,102084,0,0,293,0,0,0,0,0,0,0,330,2.6,3,3,8000.0,77777,9,999999999,8,0.1310,0,88,0.098,0.0,0.0 +2010,10,23,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,-1.7,47,102084,0,0,293,0,0,0,0,0,0,0,330,2.6,3,3,8000.0,77777,9,999999999,8,0.1310,0,88,0.098,0.0,0.0 +2010,10,23,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,-2.8,48,102144,0,0,306,0,0,0,0,0,0,0,350,3.6,9,9,8000.0,7620,9,999999999,8,0.1310,0,88,0.098,0.0,0.0 +2010,10,24,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,-2.8,48,102164,0,0,315,0,0,0,0,0,0,0,330,3.1,10,10,8000.0,4267,9,999999999,8,0.1300,0,88,0.098,0.0,0.0 +2010,10,24,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.2,-2.8,48,102164,0,0,315,0,0,0,0,0,0,0,330,3.1,10,10,8000.0,4267,9,999999999,8,0.1300,0,88,0.098,0.0,0.0 +2010,10,24,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-2.2,52,102214,0,0,313,0,0,0,0,0,0,0,20,2.1,10,10,8000.0,3658,9,999999999,8,0.1300,0,88,0.098,0.0,0.0 +2010,10,24,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-2.2,52,102214,0,0,313,0,0,0,0,0,0,0,350,1.5,10,10,8000.0,2591,9,999999999,8,0.1300,0,88,0.098,0.0,0.0 +2010,10,24,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.7,-2.2,52,102214,0,0,313,0,0,0,0,0,0,0,350,1.5,10,10,8000.0,2591,0,919999999,8,0.1300,0,88,0.098,0.0,0.0 +2010,10,24,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-2.8,51,102224,0,0,301,0,0,0,0,0,0,0,350,2.1,9,9,8000.0,2743,0,919999999,8,0.1300,0,88,0.098,0.0,0.0 +2010,10,24,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-3.3,47,102254,80,428,312,1,0,1,97,0,98,42,320,2.1,10,10,8000.0,2134,0,919999999,7,0.1300,0,88,0.098,0.0,0.0 +2010,10,24,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.7,-3.3,47,102254,321,1383,312,16,0,16,1583,0,1595,708,320,2.1,10,10,8000.0,2134,0,919999999,7,0.1300,0,88,0.098,0.0,0.0 +2010,10,24,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,-0.6,55,102224,528,1383,320,119,62,95,13833,3538,11080,3982,21,0.0,10,10,8000.0,1372,0,919999999,9,0.1300,0,88,0.098,0.0,0.0 +2010,10,24,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,0.0,58,102174,685,1383,321,166,28,153,19181,1988,17754,6511,100,0.0,10,10,8000.0,1250,0,919999999,10,0.1300,0,88,0.098,0.0,0.0 +2010,10,24,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.8,0.0,58,102174,784,1383,321,170,16,163,19891,1158,19155,7302,135,0.0,10,10,8000.0,1250,0,919999999,10,0.1300,0,88,0.098,0.0,0.0 +2010,10,24,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,1.7,61,102134,816,1383,328,178,4,176,20805,294,20665,7906,120,1.5,10,10,8000.0,1189,0,919999999,12,0.1300,0,88,0.098,0.0,0.0 +2010,10,24,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,2.8,63,102124,780,1383,331,142,3,141,16779,205,16729,6486,138,0.0,10,10,8000.0,1189,0,919999999,13,0.1300,0,88,0.098,0.0,0.0 +2010,10,24,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,9.4,2.8,63,102124,678,1383,331,177,12,171,20228,878,19632,7031,138,0.0,10,10,8000.0,1189,0,919999999,13,0.1300,0,88,0.098,0.0,0.0 +2010,10,24,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,5.0,74,101954,518,1383,334,160,16,152,17838,1083,17023,5552,130,1.5,10,10,8000.0,3048,0,919999999,16,0.1300,0,88,0.098,0.0,0.0 +2010,10,24,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,5.6,74,101905,309,1383,338,75,8,72,8397,266,8088,2573,129,0.0,10,10,8000.0,3048,0,919999999,17,0.1300,0,88,0.098,0.0,0.0 +2010,10,24,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.0,5.6,74,101905,67,1383,338,27,0,27,2607,0,2624,737,119,0.0,10,10,8000.0,3048,0,919999999,17,0.1300,0,88,0.098,0.0,0.0 +2010,10,24,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,6.0,76,101280,0,355,338,0,0,0,0,0,0,0,70,1.5,10,10,8000.0,762,0,919999999,18,0.1300,0,88,0.098,0.0,0.0 +2010,10,24,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,6.7,80,101885,0,0,339,0,0,0,0,0,0,0,60,1.5,10,10,8000.0,701,0,919999999,19,0.1300,0,88,0.098,0.0,0.0 +2010,10,24,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.0,6.7,80,101885,0,0,339,0,0,0,0,0,0,0,60,1.5,10,10,8000.0,701,9,999999999,19,0.1300,0,88,0.098,0.0,0.0 +2010,10,24,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,6.1,74,101825,0,0,341,0,0,0,0,0,0,0,60,2.1,10,10,8000.0,640,9,999999999,18,0.1300,0,88,0.098,0.0,0.0 +2010,10,24,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,6.7,77,101875,0,0,342,0,0,0,0,0,0,0,360,2.1,10,10,8000.0,640,9,999999999,19,0.1300,0,88,0.098,0.0,0.0 +2010,10,24,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.6,6.7,77,101875,0,0,342,0,0,0,0,0,0,0,360,2.1,10,10,8000.0,640,9,999999999,19,0.1300,0,88,0.098,0.0,0.0 +2010,10,24,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,7.2,83,101785,0,0,339,0,0,0,0,0,0,0,40,2.1,10,10,8000.0,488,9,999999999,20,0.1300,0,88,0.098,0.0,0.0 +2010,10,25,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,7.8,80,101735,0,0,345,0,0,0,0,0,0,0,100,2.6,10,10,8000.0,488,9,999999999,21,0.1290,0,88,0.098,0.0,0.0 +2010,10,25,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.1,7.8,80,101735,0,0,345,0,0,0,0,0,0,0,100,2.6,10,10,8000.0,488,9,999999999,21,0.1290,0,88,0.098,0.0,0.0 +2010,10,25,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.0,8.0,82,101280,0,0,345,0,0,0,0,0,0,0,114,0.0,10,10,8000.0,427,9,999999999,22,0.1290,0,88,0.098,0.0,0.0 +2010,10,25,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,8.3,83,101635,0,0,346,0,0,0,0,0,0,0,109,0.0,10,10,8000.0,366,9,999999999,23,0.1290,0,88,0.098,0.0,0.0 +2010,10,25,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.1,8.3,83,101635,0,0,346,0,0,0,0,0,0,0,106,0.0,10,10,8000.0,366,9,999999999,23,0.1290,0,88,0.098,0.0,0.0 +2010,10,25,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,7.8,83,101625,0,0,343,0,0,0,0,0,0,0,310,2.1,10,10,8000.0,305,9,999999999,21,0.1290,0,88,0.098,0.0,0.0 +2010,10,25,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,7.0,82,101280,75,400,339,5,0,5,483,0,486,198,310,1.5,10,10,8000.0,244,9,999999999,20,0.1290,0,88,0.098,0.0,0.0 +2010,10,25,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.0,7.8,86,101645,316,1384,340,38,0,38,3743,0,3771,1556,330,1.5,10,10,8000.0,244,9,999999999,21,0.1290,0,88,0.098,0.0,0.0 +2010,10,25,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,8.3,83,101585,522,1384,346,119,44,103,13684,2426,11886,4224,110,0.0,10,10,8000.0,244,9,999999999,23,0.1290,0,88,0.098,0.0,0.0 +2010,10,25,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,8.3,83,101595,679,1384,346,155,20,145,17911,1325,16826,6221,140,2.1,10,10,8000.0,244,9,999999999,23,0.1290,0,88,0.098,0.0,0.0 +2010,10,25,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,11.7,10.0,89,101535,778,1384,351,284,133,211,32394,10037,24191,8812,130,2.1,10,10,9656.0,244,9,999999999,27,0.1290,0,88,0.098,0.0,0.0 +2010,10,25,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.0,11.0,88,101280,810,1384,349,365,201,250,41276,16096,28429,10128,90,2.1,9,9,9656.0,762,9,999999999,29,0.1290,0,88,0.098,0.0,0.0 +2010,10,25,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.0,11.0,88,101280,774,1384,349,395,268,243,44489,21385,27520,9654,80,3.1,9,9,9656.0,427,9,999999999,29,0.1290,0,88,0.098,0.0,0.0 +2010,10,25,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.2,10.6,90,101315,672,1384,354,339,227,219,37791,17691,24544,8231,100,3.6,10,10,9656.0,427,9,999999999,28,0.1290,0,88,0.098,0.0,0.0 +2010,10,25,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,12.0,11.0,94,101280,511,1384,353,212,85,172,23289,5873,18989,5922,80,3.6,10,10,4023.0,122,9,999999999,29,0.1290,0,88,0.098,0.0,0.0 +2010,10,25,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,12.0,12.0,100,101280,303,1384,355,114,24,104,12310,993,11279,3181,70,2.1,10,10,1609.0,61,9,999999999,32,0.1290,0,88,0.098,0.0,0.0 +2010,10,25,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,11.7,11.1,96,101195,60,1384,352,35,0,35,3366,0,3389,757,70,1.5,10,10,2000.0,61,9,999999999,30,0.1290,0,88,0.098,0.0,0.0 +2010,10,25,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,12.0,11.0,94,101280,0,322,353,0,0,0,0,0,0,0,80,1.5,10,10,2414.0,91,9,999999999,29,0.1290,0,88,0.098,0.0,0.0 +2010,10,25,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,12.0,11.0,94,101280,0,0,344,0,0,0,0,0,0,0,90,1.5,9,9,1207.0,30,9,999999999,29,0.1290,0,88,0.098,0.0,0.0 +2010,10,25,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,11.7,11.7,100,101165,0,0,343,0,0,0,0,0,0,0,185,0.0,9,9,4800.0,30,9,999999999,32,0.1290,0,88,0.098,0.0,0.0 +2010,10,25,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,15.0,93,101086,0,0,369,0,0,0,0,0,0,0,190,4.6,9,9,4800.0,3048,0,919999999,43,0.1290,0,88,0.098,0.0,0.0 +2010,10,25,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,15.0,90,100976,0,0,382,0,0,0,0,0,0,0,180,4.6,10,10,4800.0,2743,0,919999999,43,0.1290,0,88,0.098,0.0,0.0 +2010,10,25,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.7,15.0,90,100976,0,0,372,0,0,0,0,0,0,0,180,4.6,9,9,4800.0,2743,0,919999999,43,0.1290,0,88,0.098,0.0,0.0 +2010,10,25,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.0,16.0,88,101281,0,0,380,0,0,0,0,0,0,0,200,6.2,9,9,4800.0,549,0,919999999,48,0.1290,0,88,0.098,0.0,0.0 +2010,10,26,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,16.1,87,100846,0,0,392,0,0,0,0,0,0,0,230,5.1,10,10,4800.0,610,0,919999999,48,0.1280,0,88,0.098,0.0,0.0 +2010,10,26,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.3,16.1,87,100846,0,0,392,0,0,0,0,0,0,0,230,5.1,10,10,4800.0,610,0,919999999,48,0.1280,0,88,0.098,0.0,0.0 +2010,10,26,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.0,16.0,88,101281,0,0,390,0,0,0,0,0,0,0,200,4.6,10,10,4800.0,77777,0,919999999,48,0.1280,0,88,0.098,0.0,0.0 +2010,10,26,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,15.6,84,100866,0,0,392,0,0,0,0,0,0,0,200,5.1,10,10,4800.0,4267,0,919999999,46,0.1280,0,88,0.098,0.0,0.0 +2010,10,26,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.3,15.6,84,100866,0,0,354,0,0,0,0,0,0,0,200,5.1,3,3,4800.0,4267,0,919999999,46,0.1280,0,88,0.098,0.0,0.0 +2010,10,26,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,15.0,84,100946,0,0,356,0,0,0,0,0,0,0,220,4.6,5,5,4800.0,77777,0,919999999,43,0.1280,0,88,0.098,0.0,0.0 +2010,10,26,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,15.0,84,101006,70,372,377,12,49,10,1390,0,1159,367,230,3.1,9,9,4800.0,7620,0,919999999,43,0.1280,0,88,0.098,0.0,0.0 +2010,10,26,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,15.0,84,101006,310,1385,388,44,0,44,4310,0,4343,1754,230,3.1,10,10,4800.0,7620,0,919999999,43,0.1280,0,88,0.098,0.0,0.0 +2010,10,26,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,15.6,76,101166,516,1385,390,155,114,114,17575,5974,12977,4540,240,6.2,9,9,4800.0,975,0,919999999,46,0.1280,0,88,0.098,0.0,0.0 +2010,10,26,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.0,16.0,69,101282,673,1385,401,290,279,161,33032,17761,18423,6699,270,4.1,9,9,4800.0,853,0,919999999,48,0.1280,0,88,0.098,0.0,0.0 +2010,10,26,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.7,15.0,66,101227,771,1385,376,382,343,204,43500,24326,23350,8563,280,4.6,5,5,4800.0,853,0,919999999,43,0.1280,0,88,0.098,0.0,0.0 +2010,10,26,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,13.9,76,101226,803,1385,358,423,348,229,48029,26128,26142,9504,80,5.1,5,5,4800.0,77777,0,919999999,39,0.1280,0,88,0.098,0.0,0.0 +2010,10,26,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,13.9,81,101206,767,1385,352,502,659,135,59067,40347,15949,6210,90,4.6,5,5,4800.0,77777,0,919999999,39,0.1280,0,88,0.098,0.0,0.0 +2010,10,26,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,13.9,81,101206,665,1385,352,296,388,85,35449,20144,10210,3963,90,4.6,5,5,4800.0,77777,0,919999999,39,0.1280,0,88,0.098,0.0,0.0 +2010,10,26,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,13.3,78,101216,505,1385,372,326,533,104,37204,27489,11913,4192,70,3.1,9,9,4800.0,7315,0,919999999,37,0.1280,0,88,0.098,0.0,0.0 +2010,10,26,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,15.6,73,101246,296,1385,371,155,197,102,16682,7354,11026,3105,190,7.2,5,5,4800.0,77777,0,919999999,46,0.1280,0,88,0.098,0.0,0.0 +2010,10,26,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,15.6,73,101246,54,1385,393,72,131,38,7340,0,3892,694,190,7.2,9,9,4800.0,77777,0,919999999,46,0.1280,0,88,0.098,0.0,0.0 +2010,10,26,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,15.0,81,101286,0,289,380,0,0,0,0,0,0,0,210,3.6,9,9,4800.0,7315,0,919999999,43,0.1280,0,88,0.098,0.0,0.0 +2010,10,26,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,15.6,84,101296,0,0,381,0,0,0,0,0,0,0,190,2.6,9,9,4800.0,6706,0,919999999,46,0.1280,0,88,0.098,0.0,0.0 +2010,10,26,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.3,15.6,84,101296,0,0,392,0,0,0,0,0,0,0,190,2.6,10,10,4800.0,6706,9,999999999,46,0.1280,0,88,0.098,0.0,0.0 +2010,10,26,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.0,16.0,88,101281,0,0,390,0,0,0,0,0,0,0,180,4.1,10,10,4800.0,427,9,999999999,48,0.1280,0,88,0.098,0.0,0.0 +2010,10,26,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,16.7,90,101356,0,0,393,0,0,0,0,0,0,0,190,2.6,10,10,4800.0,366,0,919999999,51,0.1280,0,88,0.098,0.0,0.0 +2010,10,26,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.3,16.7,90,101356,0,0,393,0,0,0,0,0,0,0,190,2.6,10,10,4800.0,366,0,919999999,51,0.1280,0,88,0.098,0.0,0.0 +2010,10,26,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,16.7,90,101346,0,0,393,0,0,0,0,0,0,0,180,3.6,10,10,4800.0,213,0,919999999,51,0.1280,0,88,0.098,0.0,0.0 +2010,10,27,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,16.7,93,101316,0,0,390,0,0,0,0,0,0,0,160,2.6,10,10,4800.0,244,0,919999999,51,0.1270,0,88,0.098,0.0,0.0 +2010,10,27,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,16.7,93,101316,0,0,390,0,0,0,0,0,0,0,160,2.6,10,10,4800.0,244,0,919999999,51,0.1270,0,88,0.098,0.0,0.0 +2010,10,27,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,17.8,93,101196,0,0,398,0,0,0,0,0,0,0,180,4.6,10,10,4800.0,213,0,919999999,57,0.1270,0,88,0.098,0.0,0.0 +2010,10,27,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,17.8,93,101176,0,0,398,0,0,0,0,0,0,0,190,5.1,10,10,4800.0,213,0,919999999,57,0.1270,0,88,0.098,0.0,0.0 +2010,10,27,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,18.9,17.8,93,101176,0,0,398,0,0,0,0,0,0,0,190,5.1,10,10,4800.0,213,0,919999999,57,0.1270,0,88,0.098,0.0,0.0 +2010,10,27,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.4,17.8,90,101146,0,0,400,0,0,0,0,0,0,0,200,7.7,10,10,4800.0,274,0,919999999,57,0.1270,0,88,0.098,0.0,0.0 +2010,10,27,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.0,18.0,94,101281,64,344,398,1,0,1,96,0,96,41,200,7.2,10,10,4800.0,335,0,919999999,58,0.1270,0,88,0.098,0.0,0.0 +2010,10,27,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,19.4,18.3,93,101156,304,1385,390,10,0,10,976,0,983,447,200,7.2,9,9,4800.0,335,0,919999999,60,0.1270,0,88,0.098,0.0,0.0 +2010,10,27,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,19.0,94,101281,510,1385,405,34,2,33,4224,60,4105,1548,200,5.1,10,10,4800.0,366,0,919999999,65,0.1270,0,88,0.098,0.0,0.0 +2010,10,27,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,18.9,93,101176,667,1385,405,164,21,154,18675,1250,17616,6450,200,7.2,10,10,4800.0,305,0,919999999,64,0.1270,0,88,0.098,0.0,0.0 +2010,10,27,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,18.9,93,101176,765,1385,405,174,87,129,20453,4838,15225,5973,200,7.2,10,10,4800.0,305,0,919999999,64,0.1270,0,88,0.098,0.0,0.0 +2010,10,27,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.0,19.0,88,101282,797,1385,411,188,87,143,22039,5014,16836,6618,200,5.1,10,10,4800.0,457,0,919999999,64,0.1270,0,88,0.098,0.0,0.0 +2010,10,27,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.1,18.9,87,101017,761,1385,411,206,25,192,23446,1635,21964,8133,200,7.2,10,10,4800.0,518,0,919999999,64,0.1270,0,88,0.098,0.0,0.0 +2010,10,27,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,18.9,87,101017,659,1385,411,130,11,124,15037,595,14401,5421,200,7.2,10,10,4800.0,518,0,919999999,64,0.1270,0,88,0.098,0.0,0.0 +2010,10,27,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.0,19.0,83,101282,498,1385,416,66,0,66,6542,0,6596,2876,200,6.7,10,10,4800.0,457,0,919999999,64,0.1270,0,88,0.098,0.0,0.0 +2010,10,27,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.0,18.0,83,101282,290,1385,398,103,125,76,11313,3019,8378,2588,190,7.2,9,9,4800.0,1829,0,919999999,58,0.1270,0,88,0.098,0.0,0.0 +2010,10,27,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,21.1,18.3,84,100947,48,1385,399,52,41,44,5182,0,4409,552,190,6.7,9,9,4800.0,1829,0,919999999,60,0.1270,0,88,0.098,0.0,0.0 +2010,10,27,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,18.0,88,101281,0,256,404,0,0,0,0,0,0,0,200,6.2,10,10,4800.0,884,0,919999999,58,0.1270,0,88,0.098,0.0,0.0 +2010,10,27,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,18.0,88,101281,0,0,404,0,0,0,0,0,0,0,200,6.7,10,10,4800.0,244,0,919999999,58,0.1270,0,88,0.098,0.0,0.0 +2010,10,27,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,18.3,90,100957,0,0,404,0,0,0,0,0,0,0,200,5.1,10,10,4800.0,244,9,999999999,60,0.1270,0,88,0.098,3.0,0.0 +2010,10,27,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,18.0,88,101281,0,0,404,0,0,0,0,0,0,0,210,6.2,10,10,4800.0,488,9,999999999,58,0.1270,0,88,0.098,0.3,0.0 +2010,10,27,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,18.0,88,101281,0,0,371,0,0,0,0,0,0,0,210,5.7,5,5,4800.0,77777,9,999999999,58,0.1270,0,88,0.098,0.0,0.0 +2010,10,27,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,17.8,87,100987,0,0,371,0,0,0,0,0,0,0,210,5.1,5,5,4800.0,77777,9,999999999,57,0.1270,0,88,0.098,0.0,0.0 +2010,10,27,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,19.0,18.0,94,101281,0,0,360,0,0,0,0,0,0,0,210,3.6,3,3,4800.0,671,9,999999999,58,0.1270,0,88,0.098,0.0,0.0 +2010,10,28,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,17.2,93,100946,0,0,361,0,0,0,0,0,0,0,220,3.6,5,5,4800.0,77777,9,999999999,54,0.1260,0,88,0.098,0.0,0.0 +2010,10,28,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,17.2,93,100946,0,0,361,0,0,0,0,0,0,0,220,3.6,5,5,4800.0,77777,9,999999999,54,0.1260,0,88,0.098,0.0,0.0 +2010,10,28,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,16.1,93,100896,0,0,355,0,0,0,0,0,0,0,230,3.1,5,5,4800.0,77777,9,999999999,48,0.1260,0,88,0.098,0.0,0.0 +2010,10,28,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.2,16.1,93,100916,0,0,355,0,0,0,0,0,0,0,210,3.6,5,5,9656.0,77777,9,999999999,48,0.1260,0,88,0.098,0.0,0.0 +2010,10,28,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,17.2,16.1,93,100916,0,0,355,0,0,0,0,0,0,0,210,3.6,5,5,9000.0,77777,9,999999999,48,0.1260,0,88,0.098,0.0,0.0 +2010,10,28,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,16.1,93,100896,0,0,355,0,0,0,0,0,0,0,220,5.1,5,5,9000.0,77777,9,999999999,48,0.1260,0,88,0.098,0.0,0.0 +2010,10,28,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,16.1,90,100896,59,316,358,11,74,8,1283,0,934,296,220,5.1,5,5,9000.0,77777,9,999999999,48,0.1260,0,88,0.098,0.0,0.0 +2010,10,28,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,16.1,90,100896,299,1386,358,106,361,37,12398,4242,4336,1498,220,5.1,5,5,9000.0,77777,9,999999999,48,0.1260,0,88,0.098,0.0,0.0 +2010,10,28,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.6,16.1,75,100907,504,1386,366,246,591,66,29035,23840,7811,2888,230,6.7,3,3,9000.0,77777,9,999999999,48,0.1260,0,88,0.098,0.0,0.0 +2010,10,28,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,22.2,12.8,55,100847,661,1386,398,385,717,84,46143,37618,10098,3912,250,5.1,9,9,9000.0,4267,9,999999999,34,0.1260,0,88,0.098,0.0,0.0 +2010,10,28,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,22.2,12.8,55,100847,759,1386,398,489,786,92,59208,43488,11174,4452,250,5.1,9,9,9000.0,4267,9,999999999,34,0.1260,0,88,0.098,0.0,0.0 +2010,10,28,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,5.6,29,100647,791,1386,381,544,817,94,66336,49029,11498,4604,230,9.3,5,5,9000.0,77777,9,999999999,17,0.1260,0,88,0.098,0.0,0.0 +2010,10,28,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,4.4,26,100567,754,1386,379,543,820,92,65954,49100,11209,4442,250,8.2,5,5,9000.0,77777,9,999999999,15,0.1260,0,88,0.098,0.0,0.0 +2010,10,28,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,25.0,4.4,26,100567,652,1386,379,485,793,88,58056,45670,10566,4054,250,8.2,5,5,9000.0,77777,9,999999999,15,0.1260,0,88,0.098,0.0,0.0 +2010,10,28,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,24.4,5.6,30,100507,492,1386,400,358,646,95,41193,34471,10968,3864,250,7.2,9,9,9000.0,7620,9,999999999,17,0.1260,0,88,0.098,0.0,0.0 +2010,10,28,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,3.3,26,100527,284,1386,372,183,301,89,19970,11547,9751,2813,250,7.7,5,5,9000.0,77777,9,999999999,13,0.1260,0,88,0.098,0.0,0.0 +2010,10,28,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,23.9,3.3,26,100527,42,1386,372,86,318,30,8899,0,3118,606,250,7.7,5,5,9000.0,77777,9,999999999,13,0.1260,0,88,0.098,0.0,0.0 +2010,10,28,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,21.7,2.2,28,100707,0,224,360,0,0,0,0,0,0,0,270,6.2,5,5,9000.0,77777,9,999999999,12,0.1260,0,88,0.098,0.0,0.0 +2010,10,28,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,6.9,46,100796,0,0,347,0,0,0,0,0,0,0,260,3.1,3,3,9000.0,77777,9,999999999,19,0.1260,0,88,0.098,0.0,0.0 +2010,10,28,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.9,11.7,63,100796,0,0,352,0,0,0,0,0,0,0,260,3.1,3,3,9000.0,77777,9,999999999,31,0.1260,0,88,0.098,0.0,0.0 +2010,10,28,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,1.7,36,100966,0,0,331,0,0,0,0,0,0,0,290,7.2,3,3,9000.0,77777,9,999999999,11,0.1260,0,88,0.098,0.0,0.0 +2010,10,28,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,1.7,41,101006,0,0,323,0,0,0,0,0,0,0,290,7.2,3,3,9000.0,77777,9,999999999,12,0.1260,0,88,0.098,0.0,0.0 +2010,10,28,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,1.7,41,101006,0,0,323,0,0,0,0,0,0,0,290,7.2,3,3,9000.0,77777,9,999999999,12,0.1260,0,88,0.098,0.0,0.0 +2010,10,28,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,2.2,47,101025,0,0,316,0,0,0,0,0,0,0,300,4.6,3,3,9000.0,77777,9,999999999,12,0.1260,0,88,0.098,0.0,0.0 +2010,10,29,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,2.2,50,101045,0,0,311,0,0,0,0,0,0,0,290,3.1,3,3,9000.0,77777,9,999999999,12,0.1250,0,88,0.098,0.0,0.0 +2010,10,29,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,2.2,50,101045,0,0,311,0,0,0,0,0,0,0,290,3.1,3,3,9000.0,77777,9,999999999,12,0.1250,0,88,0.098,0.0,0.0 +2010,10,29,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,2.2,54,101015,0,0,311,0,0,0,0,0,0,0,290,3.6,5,5,9000.0,77777,9,999999999,12,0.1250,0,88,0.098,0.0,0.0 +2010,10,29,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,2.8,58,101075,0,0,309,0,0,0,0,0,0,0,300,4.1,5,5,9000.0,77777,9,999999999,13,0.1250,0,88,0.098,0.0,0.0 +2010,10,29,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,2.8,58,101075,0,0,309,0,0,0,0,0,0,0,300,4.1,5,5,9000.0,77777,9,999999999,13,0.1250,0,88,0.098,0.0,0.0 +2010,10,29,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,2.8,61,101045,0,0,307,0,0,0,0,0,0,0,300,4.1,5,5,9000.0,77777,9,999999999,13,0.1250,0,88,0.098,0.0,0.0 +2010,10,29,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,3.3,63,101085,54,288,307,10,69,8,1169,0,936,293,290,6.2,5,5,9000.0,77777,9,999999999,14,0.1250,0,88,0.098,0.0,0.0 +2010,10,29,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,3.3,63,101085,293,1387,307,107,394,34,12659,6853,4029,1385,290,6.2,5,5,9000.0,77777,9,999999999,14,0.1250,0,88,0.098,0.0,0.0 +2010,10,29,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,3.3,56,101095,499,1387,334,187,316,104,21412,17918,11951,4167,310,5.7,9,9,9000.0,2896,9,999999999,14,0.1250,0,88,0.098,0.0,0.0 +2010,10,29,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,3.3,54,101055,655,1387,336,266,242,167,30307,17507,19114,6773,300,4.1,9,9,9000.0,2896,9,999999999,14,0.1250,0,88,0.098,0.0,0.0 +2010,10,29,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.2,3.3,54,101055,753,1387,336,371,340,194,42528,25956,22347,8142,300,4.1,9,9,9000.0,2896,9,999999999,14,0.1250,0,88,0.098,0.0,0.0 +2010,10,29,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,2.8,47,100946,784,1387,343,287,158,204,32955,12276,23541,8637,310,4.6,9,9,9000.0,1341,9,999999999,13,0.1250,0,88,0.098,0.0,0.0 +2010,10,29,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,3.9,57,100915,748,1387,346,185,31,169,21418,2238,19654,7329,310,5.1,10,10,9000.0,1829,0,919999999,14,0.1250,0,88,0.098,0.0,0.0 +2010,10,29,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.2,3.9,57,100915,646,1387,337,223,108,173,25285,7907,19707,6887,310,5.1,9,9,9000.0,1829,0,919999999,14,0.1250,0,88,0.098,0.0,0.0 +2010,10,29,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,4.4,61,100885,486,1387,335,215,153,159,23698,10575,17608,5464,280,5.7,9,9,9000.0,2286,0,919999999,15,0.1250,0,88,0.098,0.0,0.0 +2010,10,29,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,3.9,55,100895,277,1387,339,170,269,93,18437,10559,10127,2839,300,5.7,9,9,9000.0,6401,0,919999999,14,0.1250,0,88,0.098,0.0,0.0 +2010,10,29,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.8,3.9,55,100895,36,1387,339,77,230,30,7911,0,3096,554,300,5.7,9,9,9000.0,6401,0,919999999,14,0.1250,0,88,0.098,0.0,0.0 +2010,10,29,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,4.4,63,101015,0,192,313,0,0,0,0,0,0,0,290,6.2,5,5,9000.0,77777,0,919999999,15,0.1250,0,88,0.098,0.0,0.0 +2010,10,29,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,3.9,63,101075,0,0,329,0,0,0,0,0,0,0,300,6.7,9,9,9000.0,2896,0,919999999,14,0.1250,0,88,0.098,0.0,0.0 +2010,10,29,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.6,3.9,63,101075,0,0,329,0,0,0,0,0,0,0,300,6.7,9,9,9000.0,2896,9,999999999,14,0.1250,0,88,0.098,0.0,0.0 +2010,10,29,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,2.8,63,101225,0,0,322,0,0,0,0,0,0,0,300,6.7,9,9,9000.0,1097,9,999999999,13,0.1250,0,88,0.098,0.0,0.0 +2010,10,29,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,-1.7,48,101285,0,0,290,0,0,0,0,0,0,0,320,8.2,3,3,9000.0,77777,9,999999999,8,0.1250,0,88,0.098,0.0,0.0 +2010,10,29,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,-1.7,48,101285,0,0,290,0,0,0,0,0,0,0,320,8.2,3,3,9000.0,77777,9,999999999,8,0.1250,0,88,0.098,0.0,0.0 +2010,10,29,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-1.7,54,101294,0,0,284,0,0,0,0,0,0,0,300,4.6,3,3,9000.0,77777,9,999999999,8,0.1250,0,88,0.098,0.0,0.0 +2010,10,30,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-1.7,54,101324,0,0,305,0,0,0,0,0,0,0,290,5.1,9,9,9000.0,4877,9,999999999,8,0.1240,0,88,0.098,0.0,0.0 +2010,10,30,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.7,-1.7,54,101324,0,0,305,0,0,0,0,0,0,0,290,5.1,9,9,9000.0,4877,9,999999999,8,0.1240,0,88,0.098,0.0,0.0 +2010,10,30,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-1.7,56,101404,0,0,303,0,0,0,0,0,0,0,270,5.1,9,9,9000.0,5486,9,999999999,8,0.1240,0,88,0.098,0.0,0.0 +2010,10,30,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-2.8,53,101454,0,0,283,0,0,0,0,0,0,0,280,4.6,5,5,9000.0,77777,9,999999999,7,0.1240,0,88,0.098,0.0,0.0 +2010,10,30,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-2.8,53,101454,0,0,278,0,0,0,0,0,0,0,280,4.6,3,3,9000.0,77777,9,999999999,7,0.1240,0,88,0.098,0.0,0.0 +2010,10,30,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-2.8,55,101544,0,0,280,0,0,0,0,0,0,0,240,6.7,5,5,9000.0,77777,9,999999999,8,0.1240,0,88,0.098,0.0,0.0 +2010,10,30,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-2.8,58,101534,48,259,303,10,0,10,967,0,973,349,240,6.2,10,10,9000.0,6706,9,999999999,8,0.1240,0,88,0.098,0.0,0.0 +2010,10,30,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,4.4,-2.8,58,101534,288,1388,303,104,378,36,12247,7233,4247,1448,240,6.2,10,10,9000.0,6706,9,999999999,8,0.1240,0,88,0.098,0.0,0.0 +2010,10,30,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,-0.6,53,101415,493,1388,322,186,326,99,21376,18431,11417,3991,240,7.2,10,10,9000.0,7620,9,999999999,9,0.1240,0,88,0.098,0.0,0.0 +2010,10,30,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,-0.6,47,101315,649,1388,330,317,443,131,36820,29702,15275,5620,240,9.3,10,10,9000.0,7620,9,999999999,9,0.1240,0,88,0.098,0.0,0.0 +2010,10,30,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.0,-0.6,47,101315,747,1388,330,406,487,164,47164,35510,19136,7154,240,9.3,10,10,9000.0,7620,9,999999999,9,0.1240,0,88,0.098,0.0,0.0 +2010,10,30,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,-1.1,38,101135,778,1388,343,467,544,171,54376,40244,20000,7541,250,7.7,10,10,9000.0,7620,9,999999999,9,0.1240,0,88,0.098,0.0,0.0 +2010,10,30,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,-1.7,33,101016,742,1388,347,439,463,188,50418,35683,21694,7893,260,8.2,10,10,9000.0,6096,9,999999999,8,0.1240,0,88,0.098,0.0,0.0 +2010,10,30,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.9,-1.7,33,101016,640,1388,347,334,263,201,37424,21093,22635,7547,260,8.2,10,10,9000.0,6096,9,999999999,8,0.1240,0,88,0.098,0.0,0.0 +2010,10,30,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,-2.8,32,100926,479,1388,343,237,174,165,26057,12663,18228,5523,250,8.2,10,10,9000.0,5486,9,999999999,7,0.1240,0,88,0.098,0.0,0.0 +2010,10,30,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,-0.6,39,100915,271,1388,344,136,108,104,14597,4854,11212,2938,240,9.3,10,10,9000.0,6000,9,999999999,9,0.1240,0,88,0.098,0.0,0.0 +2010,10,30,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.8,-0.6,39,100915,30,1388,344,42,27,36,4221,0,3637,422,240,9.3,10,10,9000.0,6000,9,999999999,9,0.1240,0,88,0.098,0.0,0.0 +2010,10,30,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,0.0,43,100865,0,161,341,0,0,0,0,0,0,0,220,5.1,10,10,9000.0,3658,9,999999999,10,0.1240,0,88,0.098,0.0,0.0 +2010,10,30,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,0.6,46,100755,0,0,340,0,0,0,0,0,0,0,200,5.7,10,10,9000.0,4572,9,999999999,10,0.1240,0,88,0.098,0.0,0.0 +2010,10,30,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,0.6,46,100755,0,0,340,0,0,0,0,0,0,0,200,5.7,10,10,9000.0,4572,9,999999999,10,0.1240,0,88,0.098,0.0,0.0 +2010,10,30,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,1.7,52,100665,0,0,338,0,0,0,0,0,0,0,210,5.1,10,10,9000.0,4267,9,999999999,12,0.1240,0,88,0.098,0.0,0.0 +2010,10,30,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,1.7,50,100585,0,0,341,0,0,0,0,0,0,0,230,6.7,10,10,9000.0,4267,9,999999999,12,0.1240,0,88,0.098,0.0,0.0 +2010,10,30,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,1.7,50,100585,0,0,341,0,0,0,0,0,0,0,230,6.7,10,10,9000.0,4267,9,999999999,12,0.1240,0,88,0.098,0.0,0.0 +2010,10,30,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,0.6,46,100465,0,0,340,0,0,0,0,0,0,0,230,7.2,10,10,9000.0,6096,9,999999999,10,0.1240,0,88,0.098,0.0,0.0 +2010,10,31,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,1.1,50,100405,0,0,328,0,0,0,0,0,0,0,230,5.7,9,9,9000.0,3353,9,999999999,11,0.1220,0,88,0.098,0.0,0.0 +2010,10,31,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.1,1.1,50,100405,0,0,337,0,0,0,0,0,0,0,230,5.7,10,10,9000.0,3353,9,999999999,11,0.1220,0,88,0.098,0.0,0.0 +2010,10,31,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,1.1,50,100335,0,0,337,0,0,0,0,0,0,0,230,3.6,10,10,9000.0,2438,9,999999999,11,0.1220,0,88,0.098,0.0,0.0 +2010,10,31,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,1.7,54,100315,0,0,327,0,0,0,0,0,0,0,220,5.7,9,9,9000.0,2743,9,999999999,12,0.1220,0,88,0.098,0.0,0.0 +2010,10,31,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.6,1.7,54,100315,0,0,336,0,0,0,0,0,0,0,220,5.7,10,10,9000.0,2743,9,999999999,12,0.1220,0,88,0.098,0.0,0.0 +2010,10,31,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,1.1,50,100335,0,0,337,0,0,0,0,0,0,0,250,5.7,10,10,9000.0,2438,9,999999999,11,0.1220,0,88,0.098,0.0,0.0 +2010,10,31,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,1.1,50,100375,43,231,328,4,0,4,386,0,389,154,240,6.2,9,9,9000.0,2591,9,999999999,11,0.1220,0,88,0.098,0.0,0.0 +2010,10,31,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.1,1.1,50,100375,282,1388,328,44,21,41,5114,403,4775,1608,240,6.2,9,9,9000.0,2591,9,999999999,11,0.1220,0,88,0.098,0.0,0.0 +2010,10,31,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,1.1,43,100446,487,1388,320,197,379,71,23198,18563,8383,3035,280,8.8,5,5,9000.0,77777,9,999999999,11,0.1220,0,88,0.098,0.0,0.0 +2010,10,31,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,1.1,43,100436,643,1388,315,348,590,87,41658,34436,10445,3991,280,7.7,3,3,9000.0,77777,9,999999999,11,0.1220,0,88,0.098,0.0,0.0 +2010,10,31,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,1.1,43,100436,740,1388,338,491,817,89,59696,49358,10853,4283,280,7.7,9,9,9000.0,77777,9,999999999,11,0.1220,0,88,0.098,0.0,0.0 +2010,10,31,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,-1.7,33,100536,772,1388,319,369,427,146,43457,30035,17265,6631,290,9.3,5,5,9000.0,77777,9,999999999,8,0.1220,0,88,0.098,0.0,0.0 +2010,10,31,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,-1.7,36,100626,735,1388,333,449,498,182,51639,37928,21029,7672,330,9.3,9,9,9000.0,1829,9,999999999,8,0.1220,0,88,0.098,0.0,0.0 +2010,10,31,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.8,-1.7,36,100626,634,1388,333,298,210,190,33500,16423,21463,7238,330,9.3,9,9,9000.0,1829,9,999999999,8,0.1220,0,88,0.098,0.0,0.0 +2010,10,31,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,-2.8,41,100895,473,1388,316,202,113,148,22375,7736,16468,5152,330,8.2,9,9,9000.0,1829,9,999999999,7,0.1220,0,88,0.098,0.0,0.0 +2010,10,31,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,-4.4,37,101035,265,1388,312,177,458,77,19459,15433,8496,2492,330,9.3,9,9,9000.0,1829,9,999999999,6,0.1220,0,88,0.098,0.0,0.0 +2010,10,31,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.9,-4.4,37,101035,24,1388,294,77,272,22,8036,0,2305,476,330,9.3,5,5,9000.0,1829,9,999999999,6,0.1220,0,88,0.098,0.0,0.0 +2010,10,31,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-5.0,41,101354,0,130,285,0,0,0,0,0,0,0,340,5.7,5,5,9000.0,77777,9,999999999,6,0.1220,0,88,0.098,0.0,0.0 +2010,10,31,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.9,-5.9,43,101559,0,0,280,0,0,0,0,0,0,0,332,5.1,5,5,9000.0,77777,9,999999999,6,0.1220,0,88,0.098,0.0,0.0 +2010,10,31,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-6.1,43,101624,0,0,275,0,0,0,0,0,0,0,335,5.1,3,3,9000.0,77777,9,999999999,5,0.1220,0,88,0.096,0.0,0.0 +2010,10,31,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.8,-6.4,44,101724,0,0,275,0,0,0,0,0,0,0,330,5.4,5,5,9000.0,77777,9,999999999,5,0.1220,0,88,0.096,0.0,0.0 +2010,10,31,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-4.2,51,101633,0,0,268,0,0,0,0,0,0,0,330,5.4,3,3,9000.0,77777,9,999999999,7,0.1220,0,88,0.096,0.0,0.0 +2010,10,31,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.3,-1.7,60,101558,0,0,272,0,0,0,0,0,0,0,325,5.9,5,5,9000.0,77777,9,999999999,8,0.1220,0,88,0.096,0.0,0.0 +2010,10,31,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.0,0.4,67,101498,0,0,263,0,0,0,0,0,0,0,325,5.8,3,3,9000.0,77777,9,999999999,10,0.1220,0,88,0.096,0.0,0.0 +2016,11,1,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.8,2.4,73,101425,0,0,313,0,0,0,0,0,0,0,330,6.0,9,9,9656.0,914,0,919999999,13,0.1220,0,88,0.096,0.0,0.0 +2016,11,1,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.5,1.8,72,101494,0,0,322,0,0,0,0,0,0,0,330,6.6,10,10,9656.0,914,0,919999999,12,0.1220,0,88,0.096,0.0,0.0 +2016,11,1,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,1.2,71,101569,0,0,318,0,0,0,0,0,0,0,327,6.3,10,10,9656.0,1006,0,919999999,11,0.1220,0,88,0.096,0.0,0.0 +2016,11,1,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.8,1.1,72,101652,0,0,314,0,0,0,0,0,0,0,320,6.6,10,10,9656.0,1067,0,919999999,11,0.1220,0,88,0.096,0.0,0.0 +2016,11,1,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.7,1.1,72,101712,0,0,314,0,0,0,0,0,0,0,315,6.2,10,10,9656.0,1067,0,919999999,11,0.1220,0,88,0.096,0.0,0.0 +2016,11,1,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,1.1,70,101797,0,0,282,0,0,0,0,0,0,0,315,6.2,3,3,9656.0,77777,0,919999999,11,0.1220,0,88,0.096,0.0,0.0 +2016,11,1,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,1.1,73,101794,43,231,282,8,62,6,947,0,711,223,310,5.7,3,3,9656.0,77777,0,919999999,11,0.1220,0,88,0.096,0.0,0.0 +2016,11,1,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.6,1.1,73,101794,282,1388,282,101,385,34,11913,6277,4017,1371,310,5.7,3,3,9656.0,77777,0,919999999,11,0.1220,0,88,0.096,0.0,0.0 +2016,11,1,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,1.1,63,101894,487,1388,291,245,645,58,29304,29558,6953,2551,330,7.2,3,3,9656.0,77777,0,919999999,11,0.1220,0,88,0.096,0.0,0.0 +2016,11,1,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,1.1,58,101914,643,1388,296,391,788,72,47483,43815,8766,3381,340,6.2,3,3,9656.0,77777,0,919999999,11,0.1220,0,88,0.096,0.0,0.0 +2016,11,1,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.9,1.1,58,101914,740,1388,296,498,854,79,52860,84950,11550,1664,340,6.2,3,3,9656.0,77777,0,919999999,11,0.1220,0,88,0.096,0.0,0.0 +2016,11,1,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,1.1,52,101975,772,1388,303,553,879,83,58628,87732,12044,1744,310,4.6,3,3,9656.0,77777,0,919999999,11,0.1220,0,88,0.096,0.0,0.0 +2016,11,1,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,1.1,50,101965,735,1388,305,550,877,84,67104,52219,10278,4059,300,4.6,3,3,9656.0,77777,0,919999999,11,0.1220,0,88,0.096,0.0,0.0 +2016,11,1,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.1,1.1,50,101965,634,1388,328,489,845,81,58750,48175,9759,3730,300,4.6,9,9,9656.0,77777,0,919999999,11,0.1220,0,88,0.096,0.0,0.0 +2016,11,1,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,0.0,50,102064,473,1388,299,377,776,73,44171,38030,8577,3075,340,5.1,3,3,9656.0,77777,0,919999999,10,0.1220,0,88,0.096,0.0,0.0 +2016,11,1,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,-0.6,49,102154,265,1388,296,228,636,57,25671,15275,6436,2039,320,6.7,3,3,9656.0,77777,0,919999999,9,0.1220,0,88,0.096,0.0,0.0 +2016,11,1,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,9.4,-0.6,49,102154,24,1388,296,75,259,23,7790,0,2399,478,320,6.7,3,3,9656.0,77777,0,919999999,9,0.1220,0,88,0.096,0.0,0.0 +2016,11,1,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,0.0,60,102314,0,130,288,0,0,0,0,0,0,0,330,5.1,3,3,9656.0,77777,0,919999999,10,0.1220,0,88,0.096,0.0,0.0 +2016,11,1,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-0.6,62,102364,0,0,271,0,0,0,0,0,0,0,330,6.2,0,0,9656.0,77777,0,919999999,9,0.1220,0,88,0.096,0.0,0.0 +2016,11,1,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.1,-0.6,62,102364,0,0,271,0,0,0,0,0,0,0,330,6.2,0,0,9656.0,77777,9,999999999,9,0.1220,0,88,0.099,0.0,0.0 +2016,11,1,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-0.6,67,102513,0,0,267,0,0,0,0,0,0,0,330,4.6,0,0,9656.0,77777,9,999999999,9,0.1220,0,88,0.099,0.0,0.0 +2016,11,1,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-1.1,67,102553,0,0,264,0,0,0,0,0,0,0,330,5.1,0,0,9656.0,77777,9,999999999,9,0.1220,0,88,0.099,0.0,0.0 +2016,11,1,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,4.4,-1.1,67,102553,0,0,264,0,0,0,0,0,0,0,330,5.1,0,0,9656.0,77777,9,999999999,9,0.1220,0,88,0.099,0.0,0.0 +2016,11,1,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-1.1,72,102613,0,0,260,0,0,0,0,0,0,0,320,4.1,0,0,9656.0,77777,9,999999999,9,0.1220,0,88,0.099,0.0,0.0 +2016,11,2,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-0.6,78,102653,0,0,258,0,0,0,0,0,0,0,330,3.6,0,0,9656.0,77777,9,999999999,9,0.1210,0,88,0.099,0.0,0.0 +2016,11,2,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,-0.6,78,102653,0,0,258,0,0,0,0,0,0,0,330,3.6,0,0,9656.0,77777,9,999999999,9,0.1210,0,88,0.099,0.0,0.0 +2016,11,2,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-0.6,81,102753,0,0,267,0,0,0,0,0,0,0,340,3.1,3,3,9656.0,77777,9,999999999,9,0.1210,0,88,0.099,0.0,0.0 +2016,11,2,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-0.6,84,102793,0,0,265,0,0,0,0,0,0,0,330,3.6,3,3,9656.0,77777,9,999999999,9,0.1210,0,88,0.099,0.0,0.0 +2016,11,2,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.7,-0.6,84,102793,0,0,254,0,0,0,0,0,0,0,330,3.6,0,0,9656.0,77777,9,999999999,9,0.1210,0,88,0.099,0.0,0.0 +2016,11,2,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-1.1,84,102813,0,0,262,0,0,0,0,0,0,0,320,2.6,3,3,9656.0,77777,9,999999999,9,0.1210,0,88,0.099,0.0,0.0 +2016,11,2,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-0.6,81,102873,38,203,267,7,62,6,825,0,707,221,330,2.1,3,3,9656.0,77777,9,999999999,9,0.1210,0,88,0.099,0.0,0.0 +2016,11,2,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.2,-0.6,81,102873,277,1389,267,100,392,33,11805,6055,3902,1330,330,2.1,3,3,9656.0,77777,9,999999999,9,0.1210,0,88,0.099,0.0,0.0 +2016,11,2,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,1.7,73,102963,481,1389,285,242,652,56,28979,29178,6720,2464,360,2.1,3,3,9656.0,77777,9,999999999,12,0.1210,0,88,0.099,0.0,0.0 +2016,11,2,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,3.3,68,102954,637,1389,298,386,793,69,46941,42909,8412,3244,125,0.0,3,3,9656.0,77777,9,999999999,14,0.1210,0,88,0.099,0.0,0.0 +2016,11,2,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.9,3.3,68,102954,734,1389,298,418,590,141,48970,40105,16586,6302,147,0.0,3,3,9656.0,77777,9,999999999,14,0.1210,0,88,0.099,0.0,0.0 +2016,11,2,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,3.9,68,102864,766,1389,301,510,756,111,61181,47720,13362,5257,90,1.5,3,3,9656.0,77777,9,999999999,15,0.1210,0,88,0.099,0.0,0.0 +2016,11,2,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,5.0,71,102794,729,1389,304,408,386,205,46329,29995,23395,8299,80,3.1,3,3,9656.0,77777,9,999999999,16,0.1210,0,88,0.099,0.0,0.0 +2016,11,2,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.0,5.0,71,102794,627,1389,304,448,729,107,52550,43973,12595,4705,80,3.1,3,3,9656.0,77777,9,999999999,16,0.1210,0,88,0.099,0.0,0.0 +2016,11,2,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,5.0,71,102704,467,1389,309,371,784,67,43628,35551,7900,2848,110,5.7,5,5,9656.0,77777,9,999999999,16,0.1210,0,88,0.099,0.0,0.0 +2016,11,2,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,5.6,74,102624,260,1389,310,223,642,53,25151,12326,5994,1916,110,6.2,5,5,9656.0,77777,9,999999999,17,0.1210,0,88,0.099,0.0,0.0 +2016,11,2,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.0,5.6,74,102624,18,1389,310,73,260,21,7572,0,2187,440,110,6.2,5,5,9656.0,77777,9,999999999,17,0.1210,0,88,0.099,0.0,0.0 +2016,11,2,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,6.1,83,102664,0,99,306,0,0,0,0,0,0,0,160,4.6,5,5,9656.0,77777,9,999999999,18,0.1210,0,88,0.099,0.0,0.0 +2016,11,2,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,4.4,76,102654,0,0,284,0,0,0,0,0,0,0,190,2.6,0,0,9656.0,77777,9,999999999,15,0.1210,0,88,0.099,0.0,0.0 +2016,11,2,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.3,4.4,76,102654,0,0,284,0,0,0,0,0,0,0,190,2.6,0,0,9656.0,77777,9,999999999,15,0.1210,0,88,0.099,0.0,0.0 +2016,11,2,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,6.1,86,102664,0,0,286,0,0,0,0,0,0,0,200,4.1,0,0,9656.0,77777,9,999999999,18,0.1210,0,88,0.099,0.0,0.0 +2016,11,2,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,6.7,90,102614,0,0,304,0,0,0,0,0,0,0,190,3.1,5,5,9656.0,77777,9,999999999,19,0.1210,0,88,0.099,0.0,0.0 +2016,11,2,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.3,6.7,90,102614,0,0,287,0,0,0,0,0,0,0,190,3.1,0,0,9656.0,77777,9,999999999,19,0.1210,0,88,0.099,0.0,0.0 +2016,11,2,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,6.7,93,102564,0,0,285,0,0,0,0,0,0,0,190,3.1,0,0,9656.0,77777,9,999999999,19,0.1210,0,88,0.099,0.0,0.0 +2016,11,3,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,7.2,93,102514,0,0,331,0,0,0,0,0,0,0,200,2.6,10,10,9656.0,1158,9,999999999,20,0.1200,0,88,0.099,0.0,0.0 +2016,11,3,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.3,7.2,93,102514,0,0,331,0,0,0,0,0,0,0,200,2.6,10,10,9656.0,1158,9,999999999,20,0.1200,0,88,0.099,0.0,0.0 +2016,11,3,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,7.8,90,102394,0,0,337,0,0,0,0,0,0,0,180,2.1,10,10,9656.0,975,9,999999999,22,0.1200,0,88,0.099,0.0,0.0 +2016,11,3,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,8.9,89,102334,0,0,344,0,0,0,0,0,0,0,180,3.6,10,10,9656.0,1128,9,999999999,24,0.1200,0,88,0.099,0.0,0.0 +2016,11,3,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.6,8.9,89,102334,0,0,344,0,0,0,0,0,0,0,180,3.6,10,10,9656.0,1128,9,999999999,24,0.1200,0,88,0.099,0.0,0.0 +2016,11,3,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,8.3,86,101280,0,0,343,0,0,0,0,0,0,0,200,4.1,10,10,9656.0,1158,9,999999999,22,0.1200,0,88,0.099,0.0,0.0 +2016,11,3,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,8.9,83,102315,32,174,321,4,10,4,482,0,482,152,220,5.1,5,5,9656.0,77777,9,999999999,24,0.1200,0,88,0.099,0.0,0.0 +2016,11,3,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,8.9,83,102315,271,1390,316,81,222,43,9315,3315,4956,1651,220,5.1,3,3,9656.0,77777,9,999999999,24,0.1200,0,88,0.099,0.0,0.0 +2016,11,3,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,8.9,72,102235,475,1390,351,208,445,78,24175,20782,9093,3251,230,6.7,9,9,9656.0,7620,9,999999999,24,0.1200,0,88,0.099,0.0,0.0 +2016,11,3,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,9.4,67,102145,631,1390,339,342,603,101,40248,34432,11927,4496,210,4.6,5,5,9656.0,77777,9,999999999,25,0.1200,0,88,0.099,0.0,0.0 +2016,11,3,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.6,9.4,67,102145,728,1390,334,441,679,114,52336,41235,13578,5271,210,4.6,3,3,9656.0,77777,9,999999999,25,0.1200,0,88,0.099,0.0,0.0 +2016,11,3,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,10.0,58,102026,760,1390,348,493,713,118,58650,43651,14090,5519,290,2.6,3,3,9656.0,77777,9,999999999,26,0.1200,0,88,0.099,0.0,0.0 +2016,11,3,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,20.0,10.6,55,101946,723,1390,362,489,707,119,57751,42980,14107,5448,290,2.6,5,5,9656.0,77777,9,999999999,28,0.1200,0,88,0.099,0.0,0.0 +2016,11,3,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,20.0,10.6,55,101946,621,1390,362,432,670,114,50231,39299,13305,4932,290,2.6,5,5,9656.0,77777,9,999999999,28,0.1200,0,88,0.099,0.0,0.0 +2016,11,3,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,11.7,72,101876,461,1390,378,193,169,112,21683,8937,12633,4235,150,2.1,10,10,9656.0,2743,9,999999999,31,0.1200,0,88,0.099,0.0,0.0 +2016,11,3,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,12.2,70,101856,254,1390,374,73,0,73,7132,0,7185,2356,253,0.0,9,9,9656.0,2743,9,999999999,33,0.1200,0,88,0.099,0.0,0.0 +2016,11,3,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,12.2,70,101856,13,1390,374,23,0,23,2201,0,2216,396,242,0.0,9,9,9656.0,2743,9,999999999,33,0.1200,0,88,0.099,0.0,0.0 +2016,11,3,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,11.1,81,101895,0,70,356,0,0,0,0,0,0,0,90,1.5,9,9,9656.0,7010,9,999999999,30,0.1200,0,88,0.099,0.0,0.0 +2016,11,3,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,11.1,83,101895,0,0,353,0,0,0,0,0,0,0,80,1.5,9,9,9656.0,2591,9,999999999,30,0.1200,0,88,0.099,0.0,0.0 +2016,11,3,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.9,11.1,83,101895,0,0,353,0,0,0,0,0,0,0,80,1.5,9,9,9656.0,2591,9,999999999,30,0.1200,0,88,0.099,1.0,0.0 +2016,11,3,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,11.1,89,101885,0,0,328,0,0,0,0,0,0,0,50,1.5,5,5,9656.0,77777,9,999999999,30,0.1200,0,88,0.099,0.0,0.0 +2016,11,3,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,11.1,89,101905,0,0,323,0,0,0,0,0,0,0,10,2.1,3,3,9656.0,77777,9,999999999,30,0.1200,0,88,0.099,0.0,0.0 +2016,11,3,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.8,11.1,89,101905,0,0,323,0,0,0,0,0,0,0,10,2.1,3,3,9656.0,77777,9,999999999,30,0.1200,0,88,0.099,0.0,0.0 +2016,11,3,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,11.1,96,101845,0,0,305,0,0,0,0,0,0,0,10,1.5,0,0,9656.0,77777,9,999999999,30,0.1200,0,88,0.099,0.0,0.0 +2016,11,4,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,10.6,97,101775,0,0,315,0,0,0,0,0,0,0,19,0.0,3,3,9656.0,77777,9,999999999,28,0.1190,0,88,0.099,0.0,0.0 +2016,11,4,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.1,10.6,97,101775,0,0,339,0,0,0,0,0,0,0,30,0.0,9,9,9656.0,77777,9,999999999,28,0.1190,0,88,0.099,0.0,0.0 +2016,11,4,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,11.1,93,101705,0,0,355,0,0,0,0,0,0,0,58,0.0,10,10,9656.0,1829,9,999999999,30,0.1190,0,88,0.099,0.0,0.0 +2016,11,4,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,11.1,93,101635,0,0,355,0,0,0,0,0,0,0,80,2.1,10,10,9656.0,1676,9,999999999,30,0.1190,0,88,0.099,0.0,0.0 +2016,11,4,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.2,11.1,93,101635,0,0,355,0,0,0,0,0,0,0,80,2.1,10,10,9656.0,1676,9,999999999,30,0.1190,0,88,0.099,0.0,0.0 +2016,11,4,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,11.1,96,101535,0,0,352,0,0,0,0,0,0,0,60,2.6,10,10,9656.0,1829,0,919999999,30,0.1190,0,88,0.099,0.0,0.0 +2016,11,4,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,11.7,100,101505,27,145,343,0,0,0,0,0,0,0,90,2.6,9,9,9656.0,2134,0,919999999,32,0.1190,0,88,0.099,0.0,0.0 +2016,11,4,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,11.7,100,101505,265,1391,343,1,0,1,98,0,99,45,90,2.6,9,9,9656.0,2134,0,919999999,32,0.1190,0,88,0.099,0.0,0.0 +2016,11,4,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.0,12.0,94,101280,470,1391,360,4,0,4,398,0,401,195,120,3.1,10,10,9656.0,3048,0,919999999,32,0.1190,0,88,0.099,0.0,0.0 +2016,11,4,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,13.3,96,101155,625,1391,366,113,34,97,13294,1824,11450,4329,110,2.6,10,10,9656.0,3048,0,919999999,37,0.1190,0,88,0.099,0.0,0.0 +2016,11,4,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.9,13.3,96,101155,722,1391,366,184,45,162,21171,2970,18724,6964,110,2.6,10,10,9656.0,3048,0,919999999,37,0.1190,0,88,0.099,0.0,0.0 +2016,11,4,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,13.9,87,100816,753,1391,378,195,15,186,22306,1039,21381,7891,180,4.1,10,10,9656.0,3353,0,919999999,39,0.1190,0,88,0.099,0.0,0.0 +2016,11,4,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,16.7,14.4,86,100716,717,1391,382,140,4,138,16286,245,16121,6125,220,3.6,10,10,9656.0,2134,0,919999999,41,0.1190,0,88,0.099,0.0,0.0 +2016,11,4,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,16.1,15.0,93,101281,615,1391,369,125,12,120,14416,678,13894,5114,220,2.6,9,9,4023.0,2134,0,919999999,44,0.1190,0,88,0.099,0.0,0.0 +2016,11,4,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,15.0,87,100596,455,1391,385,18,0,18,1785,0,1799,847,300,3.6,10,10,4023.0,1067,0,919999999,43,0.1190,0,88,0.099,0.0,0.0 +2016,11,4,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,15.0,90,101281,248,1391,382,96,174,61,10599,2678,6757,2078,320,7.7,10,10,4023.0,640,0,919999999,43,0.1190,0,88,0.099,0.0,0.0 +2016,11,4,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,15.6,13.9,90,100716,8,1391,375,54,103,33,5271,0,3240,141,310,4.6,10,10,8000.0,640,0,919999999,39,0.1190,0,88,0.099,0.0,0.0 +2016,11,4,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,11.7,90,101280,0,41,326,0,0,0,0,0,0,0,300,7.2,3,3,8000.0,792,0,919999999,31,0.1190,0,88,0.099,0.0,0.0 +2016,11,4,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,10.6,86,101025,0,0,323,0,0,0,0,0,0,0,290,5.7,3,3,8000.0,77777,0,919999999,28,0.1190,0,88,0.099,0.0,0.0 +2016,11,4,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.8,10.6,86,101025,0,0,323,0,0,0,0,0,0,0,290,5.7,3,3,8000.0,77777,9,999999999,28,0.1190,0,88,0.099,2.0,0.0 +2016,11,4,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,8.3,77,101145,0,0,318,0,0,0,0,0,0,0,320,5.7,3,3,8000.0,77777,9,999999999,22,0.1190,0,88,0.099,0.0,0.0 +2016,11,4,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,8.3,77,101205,0,0,318,0,0,0,0,0,0,0,320,5.1,3,3,8000.0,77777,9,999999999,22,0.1190,0,88,0.099,0.0,0.0 +2016,11,4,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.2,8.3,77,101205,0,0,304,0,0,0,0,0,0,0,320,5.1,0,0,8000.0,77777,9,999999999,22,0.1190,0,88,0.099,0.0,0.0 +2016,11,4,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,7.8,80,101245,0,0,299,0,0,0,0,0,0,0,320,4.1,0,0,8000.0,77777,9,999999999,21,0.1190,0,88,0.099,0.0,0.0 +2016,11,5,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,6.7,77,101215,0,0,296,0,0,0,0,0,0,0,310,3.1,0,0,8000.0,77777,9,999999999,19,0.1180,0,88,0.099,0.0,0.0 +2016,11,5,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.6,6.7,77,101215,0,0,296,0,0,0,0,0,0,0,310,3.1,0,0,8000.0,77777,9,999999999,19,0.1180,0,88,0.099,0.0,0.0 +2016,11,5,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,6.7,80,101265,0,0,294,0,0,0,0,0,0,0,310,4.6,0,0,8000.0,77777,9,999999999,19,0.1180,0,88,0.099,0.0,0.0 +2016,11,5,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,6.1,83,101335,0,0,288,0,0,0,0,0,0,0,310,5.1,0,0,8000.0,77777,9,999999999,18,0.1180,0,88,0.099,0.0,0.0 +2016,11,5,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.9,6.1,83,101335,0,0,301,0,0,0,0,0,0,0,310,5.1,3,3,8000.0,77777,9,999999999,18,0.1180,0,88,0.099,0.0,0.0 +2016,11,5,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,5.0,77,101555,0,0,300,0,0,0,0,0,0,0,330,3.6,3,3,8000.0,77777,9,999999999,16,0.1180,0,88,0.099,0.0,0.0 +2016,11,5,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,4.4,76,101684,22,117,297,0,0,0,0,0,0,0,310,4.6,3,3,8000.0,77777,9,999999999,15,0.1180,0,88,0.099,0.0,0.0 +2016,11,5,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.3,4.4,76,101684,260,1391,297,85,298,37,9871,3744,4305,1441,310,4.6,3,3,8000.0,77777,9,999999999,15,0.1180,0,88,0.099,0.0,0.0 +2016,11,5,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,4.4,65,101775,464,1391,306,220,562,62,26008,24760,7348,2658,320,7.2,3,3,8000.0,77777,9,999999999,15,0.1180,0,88,0.099,0.0,0.0 +2016,11,5,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,4.4,61,101775,619,1391,335,363,743,75,43697,40315,9052,3458,330,6.2,9,9,8000.0,7620,9,999999999,15,0.1180,0,88,0.099,0.0,0.0 +2016,11,5,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,4.4,61,101775,716,1391,316,474,851,72,50668,84776,10626,1586,330,6.2,5,5,8000.0,7620,9,999999999,15,0.1180,0,88,0.099,0.0,0.0 +2016,11,5,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,2.8,49,101745,747,1391,321,499,766,104,59984,47714,12543,4922,320,6.7,5,5,8000.0,77777,9,999999999,13,0.1180,0,88,0.099,0.0,0.0 +2016,11,5,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,2.2,47,101725,711,1391,316,499,774,103,59662,47957,12356,4788,300,5.1,3,3,8000.0,77777,9,999999999,12,0.1180,0,88,0.099,0.0,0.0 +2016,11,5,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,2.2,47,101725,609,1391,316,477,886,66,50882,86396,9928,1379,300,5.1,3,3,8000.0,77777,9,999999999,12,0.1180,0,88,0.099,0.0,0.0 +2016,11,5,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,-1.1,38,101775,450,1391,310,368,828,58,43654,36310,6896,2485,280,6.7,3,3,8000.0,77777,9,999999999,9,0.1180,0,88,0.099,0.0,0.0 +2016,11,5,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,-1.7,37,101845,243,1391,307,220,693,45,25036,10612,5134,1652,330,4.1,3,3,8000.0,77777,9,999999999,8,0.1180,0,88,0.099,0.0,0.0 +2016,11,5,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.2,-1.7,37,101845,426,1391,307,71,285,18,7330,0,1866,347,330,4.1,3,3,8000.0,77777,9,999999999,8,0.1180,0,88,0.099,0.0,0.0 +2016,11,5,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,-2.8,38,101985,0,12,299,0,0,0,0,0,0,0,300,4.1,3,3,8000.0,77777,9,999999999,7,0.1180,0,88,0.099,0.0,0.0 +2016,11,5,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,-3.3,39,102054,0,0,293,0,0,0,0,0,0,0,320,4.1,3,3,8000.0,77777,9,999999999,7,0.1180,0,88,0.099,0.0,0.0 +2016,11,5,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,9.4,-3.3,39,102054,0,0,281,0,0,0,0,0,0,0,320,4.1,0,0,8000.0,77777,9,999999999,7,0.1180,0,88,0.099,0.0,0.0 +2016,11,5,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,-2.8,48,102124,0,0,273,0,0,0,0,0,0,0,330,5.1,0,0,8000.0,77777,9,999999999,8,0.1180,0,88,0.099,0.0,0.0 +2016,11,5,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-2.8,51,102144,0,0,269,0,0,0,0,0,0,0,310,4.1,0,0,8000.0,77777,9,999999999,8,0.1180,0,88,0.099,0.0,0.0 +2016,11,5,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.1,-2.8,51,102144,0,0,269,0,0,0,0,0,0,0,310,4.1,0,0,8000.0,77777,9,999999999,8,0.1180,0,88,0.099,0.0,0.0 +2016,11,5,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-2.8,58,102124,0,0,262,0,0,0,0,0,0,0,310,4.6,0,0,8000.0,77777,9,999999999,8,0.1180,0,88,0.099,0.0,0.0 +2016,11,6,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-2.2,66,102133,0,0,259,0,0,0,0,0,0,0,310,4.6,0,0,8000.0,77777,9,999999999,8,0.1170,0,88,0.099,0.0,0.0 +2016,11,6,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,-2.2,66,102133,0,0,259,0,0,0,0,0,0,0,310,4.6,0,0,8000.0,77777,9,999999999,8,0.1170,0,88,0.099,0.0,0.0 +2016,11,6,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-2.2,68,102113,0,0,257,0,0,0,0,0,0,0,270,2.1,0,0,8000.0,77777,9,999999999,8,0.1170,0,88,0.099,0.0,0.0 +2016,11,6,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-2.2,71,102083,0,0,254,0,0,0,0,0,0,0,280,2.6,0,0,8000.0,77777,9,999999999,8,0.1170,0,88,0.099,0.0,0.0 +2016,11,6,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.2,-2.2,71,102083,0,0,254,0,0,0,0,0,0,0,280,2.6,0,0,8000.0,77777,9,999999999,8,0.1170,0,88,0.099,0.0,0.0 +2016,11,6,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-1.1,72,102073,0,0,271,0,0,0,0,0,0,0,264,0.0,3,3,8000.0,77777,9,999999999,9,0.1170,0,88,0.099,0.0,0.0 +2016,11,6,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-1.1,69,102123,16,88,294,0,0,0,0,0,0,0,280,1.5,9,9,8000.0,3658,9,999999999,9,0.1170,0,88,0.099,0.0,0.0 +2016,11,6,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.9,-1.1,69,102123,254,1392,294,41,10,39,4740,143,4518,1496,280,1.5,9,9,8000.0,3658,9,999999999,9,0.1170,0,88,0.099,0.0,0.0 +2016,11,6,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,0.0,65,102134,458,1392,313,103,28,94,11783,1496,10790,3710,224,0.0,10,10,8000.0,2438,9,999999999,10,0.1170,0,88,0.099,0.0,0.0 +2016,11,6,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,1.1,65,102064,614,1392,319,133,17,127,15366,1110,14730,5336,200,3.6,10,10,8000.0,1372,9,999999999,11,0.1170,0,88,0.099,0.0,0.0 +2016,11,6,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.2,1.1,65,102064,710,1392,319,237,132,171,27239,9727,19743,7184,200,3.6,10,10,8000.0,1372,9,999999999,11,0.1170,0,88,0.099,0.0,0.0 +2016,11,6,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,2.8,58,101955,741,1392,305,279,134,209,31718,10596,23880,8484,260,3.6,3,3,8000.0,77777,9,999999999,13,0.1170,0,88,0.099,0.0,0.0 +2016,11,6,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,3.9,57,101865,705,1392,318,418,534,149,48482,36854,17355,6452,270,4.6,5,5,8000.0,77777,9,999999999,15,0.1170,0,88,0.099,0.0,0.0 +2016,11,6,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.2,3.9,57,101865,604,1392,313,393,627,115,45631,38759,13402,4901,270,4.6,3,3,8000.0,77777,9,999999999,15,0.1170,0,88,0.099,0.0,0.0 +2016,11,6,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,3.9,53,101865,444,1392,342,346,734,74,40156,33788,8613,3034,290,5.1,9,9,8000.0,7620,9,999999999,14,0.1170,0,88,0.099,0.0,0.0 +2016,11,6,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,3.3,54,101875,237,1392,345,202,579,57,22468,10804,6360,1946,280,5.7,10,10,8000.0,1829,9,999999999,14,0.1170,0,88,0.099,0.0,0.0 +2016,11,6,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.2,3.3,54,101875,0,1375,345,0,0,0,0,0,0,0,280,5.7,10,10,8000.0,1829,9,999999999,14,0.1170,0,88,0.099,0.0,0.0 +2016,11,6,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,3.9,59,101835,0,0,344,0,0,0,0,0,0,0,250,5.7,10,10,8000.0,5486,9,999999999,15,0.1170,0,88,0.099,0.0,0.0 +2016,11,6,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,4.4,65,101845,0,0,339,0,0,0,0,0,0,0,240,4.6,10,10,8000.0,4572,9,999999999,15,0.1170,0,88,0.099,0.0,0.0 +2016,11,6,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.6,4.4,65,101845,0,0,330,0,0,0,0,0,0,0,240,4.6,9,9,8000.0,4572,9,999999999,15,0.1170,0,88,0.099,0.0,0.0 +2016,11,6,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,5.0,66,101825,0,0,333,0,0,0,0,0,0,0,230,5.1,9,9,8000.0,2134,9,999999999,16,0.1170,0,88,0.099,0.0,0.0 +2016,11,6,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,5.0,68,101795,0,0,312,0,0,0,0,0,0,0,230,4.6,5,5,8000.0,77777,9,999999999,16,0.1170,0,88,0.099,0.0,0.0 +2016,11,6,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.6,5.0,68,101795,0,0,340,0,0,0,0,0,0,0,230,4.6,10,10,8000.0,77777,9,999999999,16,0.1170,0,88,0.099,0.0,0.0 +2016,11,6,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,5.0,66,101695,0,0,342,0,0,0,0,0,0,0,260,5.1,10,10,8000.0,2438,9,999999999,16,0.1170,0,88,0.099,0.0,0.0 +2016,11,7,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,5.0,66,101665,0,0,342,0,0,0,0,0,0,0,270,4.6,10,10,8000.0,2438,9,999999999,16,0.1160,0,88,0.099,0.0,0.0 +2016,11,7,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.1,5.0,66,101665,0,0,342,0,0,0,0,0,0,0,270,4.6,10,10,8000.0,2438,9,999999999,16,0.1160,0,88,0.099,0.0,0.0 +2016,11,7,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,5.6,77,101665,0,0,335,0,0,0,0,0,0,0,300,3.6,10,10,8000.0,1829,0,919999999,17,0.1160,0,88,0.099,0.0,0.0 +2016,11,7,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,6.7,86,101694,0,0,334,0,0,0,0,0,0,0,320,3.6,10,10,8000.0,1981,0,919999999,19,0.1160,0,88,0.099,0.8,0.0 +2016,11,7,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.9,6.7,86,101694,0,0,334,0,0,0,0,0,0,0,320,3.6,10,10,8000.0,1981,0,919999999,19,0.1160,0,88,0.099,0.0,0.0 +2016,11,7,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,6.7,90,101754,0,0,331,0,0,0,0,0,0,0,340,3.1,10,10,8000.0,1372,0,919999999,19,0.1160,0,88,0.099,0.0,0.0 +2016,11,7,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,6.1,89,101834,11,59,319,0,0,0,0,0,0,0,330,5.1,9,9,8000.0,1219,0,919999999,18,0.1160,0,88,0.099,0.0,0.0 +2016,11,7,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.8,6.1,89,101834,249,1393,319,16,0,16,1568,0,1580,676,330,5.1,9,9,8000.0,1219,0,919999999,18,0.1160,0,88,0.099,0.0,0.0 +2016,11,7,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,6.1,89,101279,452,1393,328,43,0,43,4287,0,4321,1911,10,7.7,10,10,8000.0,579,0,919999999,18,0.1160,0,88,0.099,0.0,0.0 +2016,11,7,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,4.4,76,102124,608,1393,319,222,222,128,25574,14260,14803,5343,360,4.6,9,9,8000.0,1280,0,919999999,15,0.1160,0,88,0.099,0.0,0.0 +2016,11,7,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.3,4.4,76,102124,704,1393,319,166,29,154,19196,2020,17885,6612,360,4.6,9,9,8000.0,1280,0,919999999,15,0.1160,0,88,0.099,0.0,0.0 +2016,11,7,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,3.3,73,102144,736,1393,325,122,5,119,14481,322,14177,5482,10,3.1,10,10,8000.0,945,0,919999999,14,0.1160,0,88,0.099,0.0,0.0 +2016,11,7,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,4.4,79,102184,699,1393,317,170,6,167,19514,431,19256,7000,20,4.6,9,9,8000.0,1524,0,919999999,15,0.1160,0,88,0.099,0.0,0.0 +2016,11,7,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.8,4.4,79,102184,598,1393,326,106,5,104,12388,297,12196,4501,20,4.6,10,10,8000.0,1524,0,919999999,15,0.1160,0,88,0.099,0.0,0.0 +2016,11,7,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,2.8,68,102294,438,1393,326,72,5,70,8384,225,8174,2886,360,5.1,10,10,8000.0,1524,0,919999999,13,0.1160,0,88,0.099,0.0,0.0 +2016,11,7,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,3.3,71,102374,232,1393,327,23,0,23,2254,0,2270,929,10,3.1,10,10,8000.0,2438,0,919999999,14,0.1160,0,88,0.099,0.0,0.0 +2016,11,7,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.3,3.3,71,102374,0,1346,327,0,0,0,0,0,0,0,10,3.1,10,10,8000.0,2438,0,919999999,14,0.1160,0,88,0.099,0.0,0.0 +2016,11,7,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,1.1,60,102564,0,0,324,0,0,0,0,0,0,0,350,5.1,10,10,8000.0,2286,0,919999999,11,0.1160,0,88,0.099,0.0,0.0 +2016,11,7,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,0.6,58,102604,0,0,324,0,0,0,0,0,0,0,350,4.6,10,10,8000.0,2286,0,919999999,11,0.1160,0,88,0.099,0.0,0.0 +2016,11,7,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.3,0.6,58,102604,0,0,324,0,0,0,0,0,0,0,350,4.6,10,10,8000.0,2286,9,999999999,11,0.1160,0,88,0.099,0.0,0.0 +2016,11,7,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,-0.6,57,102714,0,0,317,0,0,0,0,0,0,0,340,5.1,10,10,8000.0,2134,9,999999999,9,0.1160,0,88,0.099,0.0,0.0 +2016,11,7,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,-1.1,55,102744,0,0,317,0,0,0,0,0,0,0,340,4.6,10,10,8000.0,2134,9,999999999,9,0.1160,0,88,0.099,0.0,0.0 +2016,11,7,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.2,-1.1,55,102744,0,0,308,0,0,0,0,0,0,0,340,4.6,9,9,8000.0,2134,9,999999999,9,0.1160,0,88,0.099,0.0,0.0 +2016,11,7,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-0.6,62,102774,0,0,312,0,0,0,0,0,0,0,340,5.7,10,10,8000.0,1981,9,999999999,9,0.1160,0,88,0.099,1.5,0.0 +2016,11,8,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-1.1,61,102803,0,0,301,0,0,0,0,0,0,0,350,5.7,9,9,8000.0,2134,9,999999999,9,0.1150,0,88,0.099,0.0,0.0 +2016,11,8,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.6,-1.1,61,102803,0,0,280,0,0,0,0,0,0,0,350,5.7,3,3,8000.0,2134,9,999999999,9,0.1150,0,88,0.099,0.0,0.0 +2016,11,8,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-2.2,63,102883,0,0,272,0,0,0,0,0,0,0,350,4.1,3,3,8000.0,77777,9,999999999,8,0.1150,0,88,0.099,0.0,0.0 +2016,11,8,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-1.7,69,102943,0,0,270,0,0,0,0,0,0,0,360,5.7,3,3,8000.0,77777,9,999999999,8,0.1150,0,88,0.099,0.0,0.0 +2016,11,8,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,-1.7,69,102943,0,0,270,0,0,0,0,0,0,0,360,5.7,3,3,8000.0,77777,9,999999999,8,0.1150,0,88,0.099,0.0,0.0 +2016,11,8,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-2.2,68,103043,0,0,268,0,0,0,0,0,0,0,350,5.7,3,3,8000.0,77777,9,999999999,8,0.1150,0,88,0.099,0.0,0.0 +2016,11,8,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-1.7,74,103083,6,31,266,0,0,0,0,0,0,0,350,5.1,3,3,8000.0,77777,9,999999999,9,0.1150,0,88,0.099,0.0,0.0 +2016,11,8,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.2,-1.7,74,103083,243,1393,270,84,372,29,9899,2890,3422,1151,350,5.1,5,5,8000.0,77777,9,999999999,9,0.1150,0,88,0.099,0.0,0.0 +2016,11,8,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,0.0,70,103163,447,1393,300,218,636,52,26049,26508,6226,2254,350,5.1,9,9,8000.0,975,9,999999999,10,0.1150,0,88,0.099,0.0,0.0 +2016,11,8,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,0.6,68,103173,602,1393,305,360,785,67,43604,41951,8135,3098,360,6.2,9,9,8000.0,1006,9,999999999,11,0.1150,0,88,0.099,0.0,0.0 +2016,11,8,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.1,0.6,68,103173,698,1393,284,466,859,72,49546,84935,10648,1553,360,6.2,3,3,8000.0,1006,9,999999999,11,0.1150,0,88,0.099,0.0,0.0 +2016,11,8,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.0,1.0,61,101280,730,1393,314,373,395,180,42842,29670,20771,7564,20,7.2,9,9,8000.0,853,9,999999999,11,0.1150,0,88,0.099,0.0,0.0 +2016,11,8,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,1.1,63,101279,693,1393,291,453,688,111,53691,43660,13202,5048,20,6.7,3,3,8000.0,914,9,999999999,11,0.1150,0,88,0.099,0.0,0.0 +2016,11,8,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.8,1.1,63,102984,592,1393,291,460,863,70,55421,46200,8455,3203,30,4.6,3,3,8000.0,914,9,999999999,11,0.1150,0,88,0.099,0.0,0.0 +2016,11,8,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,1.7,65,102854,433,1393,292,350,796,62,41102,34050,7299,2597,100,3.6,3,3,8000.0,77777,9,999999999,12,0.1150,0,88,0.099,0.0,0.0 +2016,11,8,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,1.7,70,102804,227,1393,287,204,648,47,22964,8149,5305,1666,110,2.1,3,3,8000.0,77777,9,999999999,12,0.1150,0,88,0.099,0.0,0.0 +2016,11,8,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.7,1.7,70,102804,0,1318,287,0,0,0,0,0,0,0,110,2.1,3,3,8000.0,77777,9,999999999,12,0.1150,0,88,0.099,0.0,0.0 +2016,11,8,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,1.7,73,102744,0,0,285,0,0,0,0,0,0,0,160,2.1,3,3,8000.0,77777,9,999999999,12,0.1150,0,88,0.099,0.0,0.0 +2016,11,8,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,2.2,76,102734,0,0,273,0,0,0,0,0,0,0,170,2.6,0,0,8000.0,77777,9,999999999,12,0.1150,0,88,0.099,0.0,0.0 +2016,11,8,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.1,2.2,76,102734,0,0,273,0,0,0,0,0,0,0,170,2.6,0,0,8000.0,77777,9,999999999,12,0.1150,0,88,0.099,0.0,0.0 +2016,11,8,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,1.7,79,102673,0,0,269,0,0,0,0,0,0,0,240,2.6,0,0,8000.0,77777,9,999999999,12,0.1150,0,88,0.099,0.0,0.0 +2016,11,8,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,1.7,79,102573,0,0,269,0,0,0,0,0,0,0,240,2.6,0,0,8000.0,77777,9,999999999,12,0.1150,0,88,0.099,0.0,0.0 +2016,11,8,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.0,1.7,79,102573,0,0,269,0,0,0,0,0,0,0,240,2.6,0,0,8000.0,77777,9,999999999,12,0.1150,0,88,0.099,0.0,0.0 +2016,11,8,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,1.1,79,102423,0,0,266,0,0,0,0,0,0,0,280,2.6,0,0,8000.0,77777,9,999999999,11,0.1150,0,88,0.099,0.0,0.0 +2016,11,9,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,0.0,76,102403,0,0,263,0,0,0,0,0,0,0,314,0.0,0,0,8000.0,77777,9,999999999,10,0.1140,0,88,0.099,0.0,0.0 +2016,11,9,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.9,0.0,76,102403,0,0,263,0,0,0,0,0,0,0,315,0.0,0,0,8000.0,77777,9,999999999,10,0.1140,0,88,0.099,0.0,0.0 +2016,11,9,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-1.1,69,102323,0,0,262,0,0,0,0,0,0,0,300,2.6,0,0,8000.0,77777,9,999999999,9,0.1140,0,88,0.099,0.0,0.0 +2016,11,9,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-1.7,63,102253,0,0,263,0,0,0,0,0,0,0,270,2.6,0,0,8000.0,77777,9,999999999,8,0.1140,0,88,0.099,0.0,0.0 +2016,11,9,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,4.4,-1.7,63,102253,0,0,263,0,0,0,0,0,0,0,270,2.6,0,0,8000.0,77777,9,999999999,8,0.1140,0,88,0.099,0.0,0.0 +2016,11,9,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-1.1,72,102123,0,0,260,0,0,0,0,0,0,0,270,2.1,0,0,8000.0,77777,9,999999999,9,0.1140,0,88,0.099,0.0,0.0 +2016,11,9,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-1.1,67,102074,0,0,264,0,0,0,0,0,0,0,290,2.6,0,0,8000.0,77777,9,999999999,9,0.1140,0,88,0.099,0.0,0.0 +2016,11,9,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,4.4,-1.1,67,102074,238,1396,264,79,366,26,9368,1847,3087,1041,290,2.6,0,0,8000.0,77777,9,999999999,9,0.1140,0,88,0.099,0.0,0.0 +2016,11,9,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,0.6,54,102044,441,1394,285,209,625,47,25128,24806,5661,2054,330,1.5,0,0,8000.0,77777,9,999999999,10,0.1140,0,88,0.099,0.0,0.0 +2016,11,9,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,1.1,45,102025,596,1394,299,348,775,61,42395,40198,7448,2840,312,1.5,0,0,8000.0,77777,9,999999999,11,0.1140,0,88,0.099,0.0,0.0 +2016,11,9,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.8,1.1,45,102025,693,1394,299,450,836,70,47910,82647,10378,1533,301,1.5,0,0,8000.0,77777,9,999999999,11,0.1140,0,88,0.099,0.0,0.0 +2016,11,9,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,4.4,59,101805,724,1394,313,503,861,74,53728,85828,10895,1607,130,3.1,3,3,8000.0,77777,9,999999999,15,0.1140,0,88,0.099,0.0,0.0 +2016,11,9,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,3.3,47,101725,688,1394,322,500,858,74,53298,84940,10950,1540,110,3.6,3,3,8000.0,77777,9,999999999,14,0.1140,0,88,0.099,0.0,0.0 +2016,11,9,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,14.4,3.3,47,101725,587,1394,322,440,820,73,52747,43599,8774,3312,110,3.6,3,3,8000.0,77777,9,999999999,14,0.1140,0,88,0.099,0.0,0.0 +2016,11,9,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,6.1,64,101585,428,1394,318,332,743,65,38732,30806,7603,2690,100,3.1,3,3,8000.0,77777,9,999999999,18,0.1140,0,88,0.099,0.0,0.0 +2016,11,9,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,6.7,71,101535,222,1394,314,190,586,50,21196,6606,5594,1727,110,4.1,3,3,8000.0,77777,9,999999999,19,0.1140,0,88,0.099,0.0,0.0 +2016,11,9,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,6.7,71,101535,0,1290,314,0,0,0,0,0,0,0,110,4.1,3,3,8000.0,77777,9,999999999,19,0.1140,0,88,0.099,0.0,0.0 +2016,11,9,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,4.4,63,101445,0,0,309,0,0,0,0,0,0,0,204,0.0,3,3,8000.0,77777,9,999999999,15,0.1140,0,88,0.099,0.0,0.0 +2016,11,9,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,6.1,77,101395,0,0,310,0,0,0,0,0,0,0,180,2.1,5,5,8000.0,77777,9,999999999,18,0.1140,0,88,0.099,0.0,0.0 +2016,11,9,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.0,6.1,77,101395,0,0,293,0,0,0,0,0,0,0,180,2.1,0,0,8000.0,77777,9,999999999,18,0.1140,0,88,0.100,0.0,0.0 +2016,11,9,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,5.0,77,101265,0,0,300,0,0,0,0,0,0,0,180,3.1,3,3,8000.0,77777,9,999999999,16,0.1140,0,88,0.100,0.0,0.0 +2016,11,9,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,4.4,79,101244,0,0,295,0,0,0,0,0,0,0,190,2.1,3,3,8000.0,77777,9,999999999,15,0.1140,0,88,0.100,0.0,0.0 +2016,11,9,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.8,4.4,79,101244,0,0,295,0,0,0,0,0,0,0,190,2.1,3,3,8000.0,77777,9,999999999,15,0.1140,0,88,0.100,0.0,0.0 +2016,11,9,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,5.0,80,101105,0,0,297,0,0,0,0,0,0,0,276,0.0,3,3,8000.0,77777,9,999999999,16,0.1140,0,88,0.100,0.0,0.0 +2016,11,10,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,4.4,85,101044,0,0,290,0,0,0,0,0,0,0,281,0.0,3,3,8000.0,77777,9,999999999,15,0.1130,0,88,0.100,0.0,0.0 +2016,11,10,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.7,4.4,85,101044,0,0,278,0,0,0,0,0,0,0,284,0.0,0,0,8000.0,77777,9,999999999,15,0.1130,0,88,0.100,0.0,0.0 +2016,11,10,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,2.2,63,100955,0,0,285,0,0,0,0,0,0,0,285,0.0,0,0,8000.0,77777,9,999999999,12,0.1130,0,88,0.100,0.0,0.0 +2016,11,10,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,3.3,73,100905,0,0,316,0,0,0,0,0,0,0,287,0.0,9,9,8000.0,4877,9,999999999,14,0.1130,0,88,0.100,0.0,0.0 +2016,11,10,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.8,3.3,73,100905,0,0,316,0,0,0,0,0,0,0,290,0.0,9,9,8000.0,4877,9,999999999,14,0.1130,0,88,0.100,0.0,0.0 +2016,11,10,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,2.2,61,100895,0,0,322,0,0,0,0,0,0,0,293,0.0,9,9,8000.0,4877,9,999999999,12,0.1130,0,88,0.100,0.0,0.0 +2016,11,10,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,1.7,56,100905,0,0,333,0,0,0,0,0,0,0,270,2.1,10,10,8000.0,5486,9,999999999,12,0.1130,0,88,0.100,0.0,0.0 +2016,11,10,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.0,1.7,56,100905,232,1366,333,63,209,33,7312,1365,3837,1270,270,2.1,10,10,8000.0,5486,9,999999999,12,0.1130,0,88,0.100,0.0,0.0 +2016,11,10,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,2.8,51,100865,435,1395,338,171,390,70,19894,17439,8166,2877,290,1.5,9,9,8000.0,7620,9,999999999,13,0.1130,0,88,0.100,0.0,0.0 +2016,11,10,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,3.3,45,100836,590,1395,330,276,438,120,31852,27486,13901,5012,310,2.6,5,5,8000.0,77777,9,999999999,13,0.1130,0,88,0.100,0.0,0.0 +2016,11,10,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.0,3.3,45,100836,687,1395,359,256,237,163,29381,16975,18791,6807,310,2.6,10,10,8000.0,77777,9,999999999,13,0.1130,0,88,0.100,0.0,0.0 +2016,11,10,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,5.0,48,100746,718,1395,367,253,94,208,28622,7367,23651,8283,300,2.6,10,10,8000.0,2743,9,999999999,16,0.1130,0,88,0.100,0.0,0.0 +2016,11,10,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,6.1,51,100736,682,1395,368,255,94,208,28641,7363,23481,8017,290,3.1,10,10,8000.0,2286,9,999999999,18,0.1130,0,88,0.100,0.0,0.0 +2016,11,10,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.1,6.1,51,100736,581,1395,368,175,58,147,19812,3882,16715,5779,290,3.1,10,10,8000.0,2286,9,999999999,18,0.1130,0,88,0.100,0.0,0.0 +2016,11,10,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,7.2,60,100796,423,1395,364,102,6,100,11475,302,11292,3737,340,2.6,10,10,8000.0,1981,9,999999999,20,0.1130,0,88,0.100,0.0,0.0 +2016,11,10,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,7.8,65,100776,217,1395,352,74,3,73,7977,66,7900,2150,340,5.7,9,9,8000.0,3048,9,999999999,21,0.1130,0,88,0.100,0.0,0.0 +2016,11,10,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,8.3,69,100846,0,1264,360,0,0,0,0,0,0,0,310,5.7,10,10,8000.0,2286,9,999999999,22,0.1130,0,88,0.100,0.0,0.0 +2016,11,10,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,8.3,74,100925,0,0,354,0,0,0,0,0,0,0,310,4.6,10,10,8000.0,1829,9,999999999,22,0.1130,0,88,0.100,0.0,0.0 +2016,11,10,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,7.8,72,100995,0,0,344,0,0,0,0,0,0,0,320,4.6,9,9,8000.0,2743,9,999999999,21,0.1130,0,88,0.100,0.0,0.0 +2016,11,10,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.8,7.8,72,100995,0,0,354,0,0,0,0,0,0,0,320,4.6,10,10,8000.0,2743,9,999999999,21,0.1130,0,88,0.100,0.0,0.0 +2016,11,10,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,4.4,65,101155,0,0,339,0,0,0,0,0,0,0,330,6.2,10,10,8000.0,1158,9,999999999,15,0.1130,0,88,0.100,0.0,0.0 +2016,11,10,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,4.4,71,101185,0,0,333,0,0,0,0,0,0,0,330,5.7,10,10,8000.0,975,0,919999999,15,0.1130,0,88,0.100,0.0,0.0 +2016,11,10,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,9.4,4.4,71,101185,0,0,333,0,0,0,0,0,0,0,330,5.7,10,10,8000.0,975,0,919999999,15,0.1130,0,88,0.100,0.0,0.0 +2016,11,10,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.0,3.0,71,101280,0,0,325,0,0,0,0,0,0,0,320,6.7,10,10,8000.0,914,0,919999999,13,0.1130,0,88,0.100,0.0,0.0 +2016,11,11,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,1.1,65,101294,0,0,319,0,0,0,0,0,0,0,330,5.1,10,10,8000.0,1067,0,919999999,11,0.1120,0,88,0.100,0.0,0.0 +2016,11,11,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.2,1.1,65,101294,0,0,319,0,0,0,0,0,0,0,330,5.1,10,10,8000.0,1067,0,919999999,11,0.1120,0,88,0.100,0.0,0.0 +2016,11,11,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-0.6,59,101304,0,0,315,0,0,0,0,0,0,0,350,6.2,10,10,8000.0,1189,0,919999999,9,0.1120,0,88,0.100,0.0,0.0 +2016,11,11,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-0.6,67,101374,0,0,299,0,0,0,0,0,0,0,330,5.7,9,9,8000.0,1097,0,919999999,9,0.1120,0,88,0.100,0.0,0.0 +2016,11,11,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.0,-0.6,67,101374,0,0,267,0,0,0,0,0,0,0,330,5.7,0,0,8000.0,1097,0,919999999,9,0.1120,0,88,0.100,0.0,0.0 +2016,11,11,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-1.7,66,101434,0,0,261,0,0,0,0,0,0,0,320,5.1,0,0,8000.0,77777,0,919999999,8,0.1120,0,88,0.100,0.0,0.0 +2016,11,11,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-1.7,66,101484,0,0,273,0,0,0,0,0,0,0,320,4.1,3,3,8000.0,77777,0,919999999,8,0.1120,0,88,0.100,0.0,0.0 +2016,11,11,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.9,-1.7,66,101484,227,1336,273,75,366,25,8884,872,2965,995,320,4.1,3,3,8000.0,77777,0,919999999,8,0.1120,0,88,0.100,0.0,0.0 +2016,11,11,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-1.7,56,101424,430,1395,281,204,630,45,24553,24444,5426,1961,300,4.1,3,3,8000.0,77777,0,919999999,8,0.1120,0,88,0.100,0.0,0.0 +2016,11,11,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,-1.7,52,101394,585,1395,286,342,783,59,36420,75631,8952,1308,330,3.1,3,3,8000.0,77777,0,919999999,8,0.1120,0,88,0.100,0.0,0.0 +2016,11,11,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.2,-1.7,52,101394,681,1395,286,443,840,69,47031,82652,10251,1508,330,3.1,3,3,8000.0,77777,0,919999999,8,0.1120,0,88,0.100,0.0,0.0 +2016,11,11,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,-4.4,36,101205,712,1395,297,492,847,78,60165,50477,9564,3752,260,2.6,5,5,8000.0,77777,0,919999999,6,0.1120,0,88,0.100,0.0,0.0 +2016,11,11,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,-4.4,34,101105,677,1395,299,487,837,79,59124,49433,9617,3728,290,4.6,5,5,8000.0,77777,0,919999999,6,0.1120,0,88,0.100,0.0,0.0 +2016,11,11,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.0,-4.4,34,101105,576,1395,317,382,591,114,44219,37486,13244,4761,290,4.6,9,9,8000.0,77777,0,919999999,6,0.1120,0,88,0.100,0.0,0.0 +2016,11,11,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,-4.4,32,100905,417,1395,331,271,443,105,30434,24510,11836,3841,230,4.6,10,10,8000.0,7925,0,919999999,6,0.1120,0,88,0.100,0.0,0.0 +2016,11,11,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,-3.9,33,100865,212,1395,331,139,267,78,14925,7573,8409,2183,250,5.1,10,10,8000.0,7925,0,919999999,7,0.1120,0,88,0.100,0.0,0.0 +2016,11,11,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.1,-3.9,33,100865,0,1238,331,0,0,0,0,0,0,0,250,5.1,10,10,8000.0,7925,0,919999999,7,0.1120,0,88,0.100,0.0,0.0 +2016,11,11,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,-2.8,39,100745,0,0,328,0,0,0,0,0,0,0,220,5.1,10,10,8000.0,4572,0,919999999,7,0.1120,0,88,0.100,0.0,0.0 +2016,11,11,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,-3.3,38,100655,0,0,327,0,0,0,0,0,0,0,220,6.7,10,10,8000.0,4572,0,919999999,7,0.1120,0,88,0.100,0.0,0.0 +2016,11,11,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.0,-3.3,38,100655,0,0,300,0,0,0,0,0,0,0,220,6.7,5,5,8000.0,4572,9,999999999,7,0.1120,0,88,0.100,0.0,0.0 +2016,11,11,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,-3.3,39,100455,0,0,293,0,0,0,0,0,0,0,220,7.2,3,3,8000.0,77777,9,999999999,7,0.1120,0,88,0.100,0.0,0.0 +2016,11,11,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,-2.8,42,100355,0,0,292,0,0,0,0,0,0,0,220,6.7,3,3,8000.0,77777,9,999999999,7,0.1120,0,88,0.100,0.0,0.0 +2016,11,11,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.9,-2.8,42,100355,0,0,292,0,0,0,0,0,0,0,220,6.7,3,3,8000.0,77777,9,999999999,7,0.1120,0,88,0.100,0.0,0.0 +2016,11,11,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,0.0,56,100125,0,0,292,0,0,0,0,0,0,0,210,6.2,3,3,8000.0,77777,9,999999999,10,0.1120,0,88,0.100,0.0,0.0 +2016,11,12,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,0.6,52,100025,0,0,287,0,0,0,0,0,0,0,230,7.2,0,0,8000.0,77777,9,999999999,10,0.1100,0,88,0.100,0.0,0.0 +2016,11,12,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.0,0.6,52,100025,0,0,287,0,0,0,0,0,0,0,230,7.2,0,0,8000.0,77777,9,999999999,10,0.1100,0,88,0.100,0.0,0.0 +2016,11,12,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,1.7,63,99885,0,0,282,0,0,0,0,0,0,0,220,6.2,0,0,8000.0,77777,9,999999999,12,0.1100,0,88,0.100,0.0,0.0 +2016,11,12,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,1.1,58,99835,0,0,283,0,0,0,0,0,0,0,230,8.2,0,0,8000.0,77777,9,999999999,11,0.1100,0,88,0.100,0.0,0.0 +2016,11,12,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.9,1.1,58,99835,0,0,283,0,0,0,0,0,0,0,230,8.2,0,0,8000.0,77777,9,999999999,11,0.1100,0,88,0.100,0.0,0.0 +2016,11,12,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,1.1,60,99765,0,0,293,0,0,0,0,0,0,0,230,6.7,3,3,8000.0,77777,9,999999999,11,0.1100,0,88,0.100,0.0,0.0 +2016,11,12,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,1.1,58,99805,0,0,296,0,0,0,0,0,0,0,240,6.7,3,3,8000.0,77777,9,999999999,11,0.1100,0,88,0.100,0.0,0.0 +2016,11,12,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.9,1.1,58,99805,221,1305,296,66,269,29,7706,663,3391,1125,240,6.7,3,3,8000.0,77777,9,999999999,11,0.1100,0,88,0.100,0.0,0.0 +2016,11,12,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,2.8,51,99876,424,1396,314,189,512,58,22250,20748,6844,2436,270,6.2,3,3,8000.0,77777,9,999999999,13,0.1100,0,88,0.100,0.0,0.0 +2016,11,12,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,4.4,49,99896,579,1396,326,327,693,77,38960,36903,9200,3452,280,9.8,3,3,8000.0,77777,9,999999999,15,0.1100,0,88,0.100,0.0,0.0 +2016,11,12,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.0,4.4,49,99896,675,1396,326,439,817,77,53266,45780,9368,3642,280,9.8,3,3,8000.0,77777,9,999999999,15,0.1100,0,88,0.100,0.0,0.0 +2016,11,12,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,0.6,37,100066,707,1396,322,499,873,75,52995,86382,11056,1578,310,9.3,3,3,8000.0,77777,9,999999999,10,0.1100,0,88,0.100,0.0,0.0 +2016,11,12,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,1.1,43,100206,671,1396,320,396,518,141,45866,35474,16398,6029,290,11.3,5,5,8000.0,77777,9,999999999,11,0.1100,0,88,0.100,0.0,0.0 +2016,11,12,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,1.1,43,100206,571,1396,320,445,874,65,47386,84280,9834,1304,290,11.3,5,5,8000.0,77777,9,999999999,11,0.1100,0,88,0.100,0.0,0.0 +2016,11,12,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,-4.4,33,100495,412,1396,297,339,819,56,39970,33577,6618,2343,320,10.8,3,3,8000.0,77777,9,999999999,6,0.1100,0,88,0.100,0.0,0.0 +2016,11,12,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,-6.1,32,100705,207,1396,288,196,677,42,22120,5703,4752,1484,320,10.3,3,3,8000.0,77777,9,999999999,5,0.1100,0,88,0.100,0.0,0.0 +2016,11,12,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.9,-6.1,32,100705,0,1212,288,0,0,0,0,0,0,0,320,10.3,3,3,8000.0,77777,9,999999999,5,0.1100,0,88,0.100,0.0,0.0 +2016,11,12,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-6.7,35,101074,0,0,279,0,0,0,0,0,0,0,330,8.2,3,3,8000.0,77777,9,999999999,5,0.1100,0,88,0.100,0.0,0.0 +2016,11,12,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-6.7,37,101274,0,0,276,0,0,0,0,0,0,0,320,9.3,3,3,8000.0,77777,9,999999999,5,0.1100,0,88,0.100,0.0,0.0 +2016,11,12,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.1,-6.7,37,101274,0,0,276,0,0,0,0,0,0,0,320,9.3,3,3,8000.0,77777,9,999999999,5,0.1100,0,88,0.100,0.0,0.0 +2016,11,12,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-5.6,44,101474,0,0,273,0,0,0,0,0,0,0,310,7.2,3,3,8000.0,77777,9,999999999,6,0.1100,0,88,0.100,0.0,0.0 +2016,11,12,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-6.1,44,101514,0,0,270,0,0,0,0,0,0,0,310,7.2,3,3,8000.0,77777,9,999999999,5,0.1100,0,88,0.100,0.0,0.0 +2016,11,12,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,4.4,-6.1,44,101514,0,0,270,0,0,0,0,0,0,0,310,7.2,3,3,8000.0,77777,9,999999999,5,0.1100,0,88,0.100,0.0,0.0 +2016,11,12,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-8.9,35,101624,0,0,265,0,0,0,0,0,0,0,320,12.4,3,3,8000.0,77777,9,999999999,4,0.1100,0,88,0.100,0.0,0.0 +2016,11,13,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-8.9,38,101663,0,0,261,0,0,0,0,0,0,0,310,8.2,3,3,8000.0,77777,9,999999999,4,0.1090,0,88,0.100,0.0,0.0 +2016,11,13,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,-8.9,38,101663,0,0,250,0,0,0,0,0,0,0,310,8.2,0,0,8000.0,77777,9,999999999,4,0.1090,0,88,0.100,0.0,0.0 +2016,11,13,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-8.9,40,101863,0,0,259,0,0,0,0,0,0,0,320,8.8,3,3,8000.0,77777,9,999999999,4,0.1090,0,88,0.100,0.0,0.0 +2016,11,13,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-8.3,42,101913,0,0,249,0,0,0,0,0,0,0,320,6.2,0,0,8000.0,77777,9,999999999,4,0.1090,0,88,0.100,0.0,0.0 +2016,11,13,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.2,-8.3,42,101913,0,0,260,0,0,0,0,0,0,0,320,6.2,3,3,8000.0,77777,9,999999999,4,0.1090,0,88,0.100,0.0,0.0 +2016,11,13,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-8.3,44,102103,0,0,258,0,0,0,0,0,0,0,330,5.1,3,3,8000.0,77777,9,999999999,4,0.1090,0,88,0.100,0.0,0.0 +2016,11,13,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-7.8,46,102223,0,0,258,0,0,0,0,0,0,0,320,5.7,3,3,8000.0,77777,9,999999999,5,0.1090,0,88,0.100,0.0,0.0 +2016,11,13,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.7,-7.8,46,102223,216,1275,258,73,379,25,8619,491,2955,984,320,5.7,3,3,8000.0,77777,9,999999999,5,0.1090,0,88,0.100,0.0,0.0 +2016,11,13,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-6.7,45,102363,419,1397,265,205,653,45,24628,25379,5416,1946,320,7.2,3,3,8000.0,77777,9,999999999,5,0.1090,0,88,0.100,0.0,0.0 +2016,11,13,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-6.1,42,102324,573,1397,273,346,814,59,36696,78107,8961,1291,310,6.2,3,3,8000.0,77777,9,999999999,5,0.1090,0,88,0.100,0.0,0.0 +2016,11,13,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.0,-6.1,42,102324,670,1397,277,452,883,66,47858,86436,9839,1473,310,6.2,5,5,8000.0,77777,9,999999999,5,0.1090,0,88,0.100,0.0,0.0 +2016,11,13,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-6.1,37,102224,701,1397,284,506,907,69,53527,89213,10217,1540,260,4.6,5,5,8000.0,77777,9,999999999,5,0.1090,0,88,0.100,0.0,0.0 +2016,11,13,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,-6.1,35,102114,666,1397,305,502,900,70,53056,87991,10409,1485,260,6.2,9,9,8000.0,7620,9,999999999,5,0.1090,0,88,0.100,0.0,0.0 +2016,11,13,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.8,-6.1,35,102114,566,1397,305,377,598,112,43616,37728,13004,4656,260,6.2,9,9,8000.0,7620,9,999999999,5,0.1090,0,88,0.100,0.0,0.0 +2016,11,13,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,-6.7,32,101984,408,1397,307,314,724,70,36348,32637,8126,2806,260,4.6,9,9,8000.0,7620,9,999999999,5,0.1090,0,88,0.100,0.0,0.0 +2016,11,13,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,-6.7,32,101934,202,1397,307,185,615,47,20648,6461,5261,1595,250,5.7,9,9,8000.0,9144,9,999999999,5,0.1090,0,88,0.100,0.0,0.0 +2016,11,13,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.3,-6.7,32,101934,0,1187,307,0,0,0,0,0,0,0,250,5.7,9,9,8000.0,9144,9,999999999,5,0.1090,0,88,0.100,0.0,0.0 +2016,11,13,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,-5.6,38,101934,0,0,303,0,0,0,0,0,0,0,240,5.1,9,9,8000.0,9144,9,999999999,6,0.1090,0,88,0.100,0.0,0.0 +2016,11,13,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-5.6,41,101854,0,0,298,0,0,0,0,0,0,0,230,5.7,9,9,8000.0,7620,9,999999999,6,0.1090,0,88,0.100,0.0,0.0 +2016,11,13,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.1,-5.6,41,101854,0,0,298,0,0,0,0,0,0,0,230,5.7,9,9,8000.0,7620,9,999999999,6,0.1090,0,88,0.100,0.0,0.0 +2016,11,13,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-4.4,45,101774,0,0,283,0,0,0,0,0,0,0,250,5.1,5,5,8000.0,77777,9,999999999,6,0.1090,0,88,0.100,0.0,0.0 +2016,11,13,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-4.4,46,101744,0,0,298,0,0,0,0,0,0,0,260,5.7,9,9,8000.0,6096,9,999999999,6,0.1090,0,88,0.100,0.0,0.0 +2016,11,13,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.6,-4.4,46,101744,0,0,306,0,0,0,0,0,0,0,260,5.7,10,10,8000.0,6096,9,999999999,6,0.1090,0,88,0.100,0.0,0.0 +2016,11,13,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-3.9,51,101604,0,0,304,0,0,0,0,0,0,0,220,6.2,10,10,8000.0,6096,9,999999999,7,0.1090,0,88,0.100,0.0,0.0 +2016,11,14,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-3.9,49,101544,0,0,307,0,0,0,0,0,0,0,240,6.2,10,10,8000.0,5791,9,999999999,7,0.1080,0,88,0.100,0.0,0.0 +2016,11,14,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.6,-3.9,49,101544,0,0,307,0,0,0,0,0,0,0,240,6.2,10,10,8000.0,5791,9,999999999,7,0.1080,0,88,0.100,0.0,0.0 +2016,11,14,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,-4.4,42,101544,0,0,313,0,0,0,0,0,0,0,260,5.1,10,10,8000.0,5182,9,999999999,6,0.1080,0,88,0.100,0.0,0.0 +2016,11,14,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,-4.4,42,101534,0,0,313,0,0,0,0,0,0,0,250,4.6,10,10,8000.0,6096,9,999999999,6,0.1080,0,88,0.100,0.0,0.0 +2016,11,14,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.2,-4.4,42,101534,0,0,313,0,0,0,0,0,0,0,250,4.6,10,10,8000.0,6096,9,999999999,6,0.1080,0,88,0.100,0.0,0.0 +2016,11,14,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,-5.0,38,101544,0,0,306,0,0,0,0,0,0,0,260,6.2,9,9,8000.0,6706,9,999999999,6,0.1080,0,88,0.100,0.0,0.0 +2016,11,14,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,-3.9,42,101564,0,0,308,0,0,0,0,0,0,0,260,5.7,9,9,8000.0,6706,9,999999999,7,0.1080,0,88,0.100,0.0,0.0 +2016,11,14,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.8,-3.9,42,101564,211,1245,308,64,306,26,7512,0,3056,1012,260,5.7,9,9,8000.0,6706,9,999999999,7,0.1080,0,88,0.100,0.0,0.0 +2016,11,14,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,-1.7,45,101635,413,1397,317,186,567,48,22183,21595,5736,2052,260,5.1,9,9,8000.0,6706,9,999999999,8,0.1080,0,88,0.100,0.0,0.0 +2016,11,14,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,0.0,44,101615,568,1397,311,294,615,85,34726,34450,10070,3727,280,5.7,5,5,8000.0,77777,9,999999999,10,0.1080,0,88,0.100,0.0,0.0 +2016,11,14,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,0.0,44,101615,664,1397,311,359,539,132,41752,36198,15412,5697,280,5.7,5,5,8000.0,77777,9,999999999,10,0.1080,0,88,0.100,0.0,0.0 +2016,11,14,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,0.0,41,101455,696,1397,311,450,728,98,53870,44827,11769,4543,270,4.1,3,3,8000.0,77777,9,999999999,10,0.1080,0,88,0.100,0.0,0.0 +2016,11,14,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,0.0,37,101365,661,1397,318,477,850,73,58024,48004,8903,3446,250,3.6,3,3,8000.0,77777,9,999999999,10,0.1080,0,88,0.100,0.0,0.0 +2016,11,14,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,14.4,0.0,37,101365,561,1397,305,421,819,69,50457,42880,8290,3102,250,3.6,0,0,8000.0,77777,9,999999999,10,0.1080,0,88,0.100,0.0,0.0 +2016,11,14,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,-1.1,31,101306,403,1397,309,316,753,60,36937,30482,7031,2463,270,3.6,0,0,8000.0,77777,9,999999999,9,0.1080,0,88,0.100,0.0,0.0 +2016,11,14,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.0,-1.1,33,101326,198,1397,306,178,601,44,19910,4042,4935,1510,250,3.1,0,0,8000.0,77777,9,999999999,9,0.1080,0,88,0.100,0.0,0.0 +2016,11,14,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.0,-1.1,33,101326,0,1163,306,0,0,0,0,0,0,0,250,3.1,0,0,8000.0,77777,9,999999999,9,0.1080,0,88,0.100,0.0,0.0 +2016,11,14,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,0.0,43,101395,0,0,296,0,0,0,0,0,0,0,230,4.1,0,0,8000.0,77777,9,999999999,10,0.1080,0,88,0.100,0.0,0.0 +2016,11,14,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,-1.1,37,101405,0,0,299,0,0,0,0,0,0,0,270,5.7,0,0,8000.0,77777,9,999999999,9,0.1080,0,88,0.100,0.0,0.0 +2016,11,14,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,-1.1,37,101405,0,0,299,0,0,0,0,0,0,0,270,5.7,0,0,8000.0,77777,9,999999999,9,0.1080,0,88,0.100,0.0,0.0 +2016,11,14,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,-1.7,40,101375,0,0,290,0,0,0,0,0,0,0,230,5.7,0,0,8000.0,77777,9,999999999,8,0.1080,0,88,0.100,0.0,0.0 +2016,11,14,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,-3.3,35,101345,0,0,288,0,0,0,0,0,0,0,240,6.2,0,0,8000.0,77777,9,999999999,7,0.1080,0,88,0.100,0.0,0.0 +2016,11,14,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.1,-3.3,35,101345,0,0,288,0,0,0,0,0,0,0,240,6.2,0,0,8000.0,77777,9,999999999,7,0.1080,0,88,0.100,0.0,0.0 +2016,11,14,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,-2.2,48,101344,0,0,276,0,0,0,0,0,0,0,210,3.6,0,0,8000.0,77777,9,999999999,8,0.1080,0,88,0.100,0.0,0.0 +2016,11,15,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-3.3,47,101364,0,0,270,0,0,0,0,0,0,0,210,4.6,0,0,8000.0,77777,9,999999999,7,0.1070,0,88,0.100,0.0,0.0 +2016,11,15,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.7,-3.3,47,101364,0,0,270,0,0,0,0,0,0,0,210,4.6,0,0,8000.0,77777,9,999999999,7,0.1070,0,88,0.100,0.0,0.0 +2016,11,15,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-3.9,45,101374,0,0,270,0,0,0,0,0,0,0,230,6.2,0,0,8000.0,77777,9,999999999,7,0.1070,0,88,0.100,0.0,0.0 +2016,11,15,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-3.9,49,101364,0,0,266,0,0,0,0,0,0,0,210,5.7,0,0,8000.0,77777,9,999999999,7,0.1070,0,88,0.100,0.0,0.0 +2016,11,15,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.6,-3.9,49,101364,0,0,266,0,0,0,0,0,0,0,210,5.7,0,0,8000.0,77777,9,999999999,7,0.1070,0,88,0.100,0.0,0.0 +2016,11,15,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-4.4,46,101354,0,0,265,0,0,0,0,0,0,0,220,4.6,0,0,8000.0,77777,9,999999999,6,0.1070,0,88,0.100,0.0,0.0 +2016,11,15,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-3.9,53,101414,0,0,261,0,0,0,0,0,0,0,200,3.6,0,0,8000.0,77777,9,999999999,7,0.1070,0,88,0.100,0.0,0.0 +2016,11,15,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,4.4,-3.9,53,101414,205,1215,261,68,368,23,8039,0,2722,905,200,3.6,0,0,8000.0,77777,9,999999999,7,0.1070,0,88,0.100,0.0,0.0 +2016,11,15,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,-6.7,24,101495,408,1398,289,196,641,44,23521,24041,5289,1893,260,5.7,0,0,8000.0,77777,9,999999999,5,0.1070,0,88,0.100,0.0,0.0 +2016,11,15,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,-6.7,23,101445,562,1398,293,337,804,60,40888,41885,7296,2745,270,4.1,0,0,8000.0,77777,9,999999999,5,0.1070,0,88,0.100,0.0,0.0 +2016,11,15,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,-6.7,23,101445,659,1398,293,442,869,68,46730,84831,10137,1465,270,4.1,0,0,8000.0,77777,9,999999999,5,0.1070,0,88,0.100,0.0,0.0 +2016,11,15,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,-6.1,20,101346,691,1398,319,495,892,73,52268,87537,10794,1539,230,5.1,3,3,8000.0,77777,9,999999999,5,0.1070,0,88,0.100,0.0,0.0 +2016,11,15,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.8,-6.7,17,101316,655,1398,326,492,885,74,59809,51417,9019,3478,240,5.1,3,3,8000.0,77777,9,999999999,5,0.1070,0,88,0.100,0.0,0.0 +2016,11,15,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,17.8,-6.7,17,101316,556,1398,326,431,842,73,51449,45950,8737,3247,240,5.1,3,3,8000.0,77777,9,999999999,5,0.1070,0,88,0.100,0.0,0.0 +2016,11,15,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,18.3,-9.4,13,101296,398,1398,324,322,761,65,37413,32925,7572,2620,250,4.1,3,3,8000.0,77777,9,999999999,4,0.1070,0,88,0.100,0.0,0.0 +2016,11,15,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,-8.3,16,101336,194,1398,324,179,595,48,19868,5853,5343,1590,240,5.1,5,5,8000.0,77777,9,999999999,4,0.1070,0,88,0.100,0.0,0.0 +2016,11,15,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,-9.4,14,101376,0,1140,341,0,0,0,0,0,0,0,270,4.1,9,9,8000.0,3962,9,999999999,4,0.1070,0,88,0.100,0.0,0.0 +2016,11,15,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.7,-9.4,14,101426,0,0,341,0,0,0,0,0,0,0,280,4.6,9,9,8000.0,3962,9,999999999,4,0.1070,0,88,0.100,0.0,0.0 +2016,11,15,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,-6.1,24,101505,0,0,339,0,0,0,0,0,0,0,230,3.6,10,10,8000.0,3962,9,999999999,5,0.1070,0,88,0.100,0.0,0.0 +2016,11,15,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,-6.1,24,101505,0,0,330,0,0,0,0,0,0,0,230,3.6,9,9,8000.0,3962,9,999999999,5,0.1070,0,88,0.100,0.0,0.0 +2016,11,15,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,-5.0,26,101555,0,0,331,0,0,0,0,0,0,0,210,2.1,9,9,8000.0,3962,9,999999999,6,0.1070,0,88,0.100,0.0,0.0 +2016,11,15,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,-1.7,43,101575,0,0,329,0,0,0,0,0,0,0,220,4.1,10,10,8000.0,3962,9,999999999,8,0.1070,0,88,0.100,0.0,0.0 +2016,11,15,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.0,-1.7,43,101575,0,0,329,0,0,0,0,0,0,0,220,4.1,10,10,8000.0,3962,9,999999999,8,0.1070,0,88,0.100,0.0,0.0 +2016,11,15,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,-1.7,43,101575,0,0,329,0,0,0,0,0,0,0,240,3.6,10,10,8000.0,6706,9,999999999,8,0.1070,0,88,0.100,0.0,0.0 +2016,11,16,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,-3.3,35,101495,0,0,323,0,0,0,0,0,0,0,330,2.6,9,9,8000.0,3353,9,999999999,7,0.1060,0,88,0.100,0.0,0.0 +2016,11,16,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.1,-3.3,35,101495,0,0,288,0,0,0,0,0,0,0,330,2.6,0,0,8000.0,3353,9,999999999,7,0.1060,0,88,0.100,0.0,0.0 +2016,11,16,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,-2.2,41,101535,0,0,297,0,0,0,0,0,0,0,220,1.5,3,3,8000.0,77777,9,999999999,8,0.1060,0,88,0.100,0.0,0.0 +2016,11,16,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,1.7,61,101555,0,0,328,0,0,0,0,0,0,0,140,2.6,10,10,8000.0,5486,9,999999999,12,0.1060,0,88,0.100,0.0,0.0 +2016,11,16,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.9,1.7,61,101555,0,0,328,0,0,0,0,0,0,0,140,2.6,10,10,8000.0,5486,9,999999999,12,0.1060,0,88,0.100,0.0,0.0 +2016,11,16,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,3.3,71,101574,0,0,318,0,0,0,0,0,0,0,20,3.1,9,9,8000.0,3658,9,999999999,14,0.1060,0,88,0.100,0.0,0.0 +2016,11,16,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,0.6,54,101585,0,0,329,0,0,0,0,0,0,0,350,2.1,10,10,8000.0,2286,9,999999999,10,0.1060,0,88,0.100,0.0,0.0 +2016,11,16,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,9.4,0.6,54,101585,200,1185,329,27,1,27,3142,0,3147,1032,350,2.1,10,10,8000.0,2286,9,999999999,10,0.1060,0,88,0.100,0.0,0.0 +2016,11,16,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,0.0,50,101565,402,1399,331,82,20,77,9393,902,8847,3008,10,3.6,10,10,8000.0,1829,9,999999999,10,0.1060,0,88,0.100,0.0,0.0 +2016,11,16,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,2.8,58,101585,557,1399,337,92,14,87,10813,772,10257,3771,60,2.6,10,10,8000.0,1676,9,999999999,13,0.1060,0,88,0.100,0.0,0.0 +2016,11,16,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.6,2.8,58,101585,653,1399,337,139,9,136,16080,602,15796,5784,60,2.6,10,10,8000.0,1676,9,999999999,13,0.1060,0,88,0.100,0.0,0.0 +2016,11,16,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,8.9,86,101325,685,1399,347,157,10,152,18067,672,17567,6445,30,6.2,10,10,8000.0,1433,0,919999999,24,0.1060,0,88,0.100,0.0,0.0 +2016,11,16,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,8.9,83,101255,650,1399,350,129,12,123,14996,741,14354,5333,50,5.1,10,10,8000.0,1067,0,919999999,24,0.1060,0,88,0.100,0.0,0.0 +2016,11,16,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,8.9,83,101255,551,1399,350,66,2,65,7905,95,7804,2926,50,5.1,10,10,8000.0,1067,0,919999999,24,0.1060,0,88,0.100,0.0,0.0 +2016,11,16,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,10.6,9.4,92,101280,394,1399,345,23,0,23,2278,0,2295,1037,50,7.7,10,10,6437.0,671,0,919999999,25,0.1060,0,88,0.100,0.0,0.0 +2016,11,16,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,10.6,9.4,92,101280,190,1399,345,3,0,3,292,0,294,130,30,6.2,10,10,4023.0,945,0,919999999,25,0.1060,0,88,0.100,0.0,0.0 +2016,11,16,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,10.6,10.0,96,101025,0,1118,345,0,0,0,0,0,0,0,30,7.7,10,10,4000.0,945,0,919999999,27,0.1060,0,88,0.100,0.0,0.0 +2016,11,16,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,11.7,11.7,100,101280,0,0,353,0,0,0,0,0,0,0,40,9.8,10,10,3219.0,274,0,919999999,32,0.1060,0,88,0.100,0.0,0.0 +2016,11,16,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,11.7,11.7,100,101280,0,0,353,0,0,0,0,0,0,0,60,11.8,10,10,3219.0,91,0,919999999,32,0.1060,0,88,0.100,0.0,0.0 +2016,11,16,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,12.2,12.2,100,100725,0,0,356,0,0,0,0,0,0,0,50,8.8,10,10,3200.0,91,0,919999999,33,0.1060,0,88,0.100,5.0,0.0 +2016,11,16,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,12.2,12.2,100,101280,0,0,356,0,0,0,0,0,0,0,110,6.2,10,10,3219.0,274,0,919999999,33,0.1060,0,88,0.100,5.0,0.0 +2016,11,16,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,12.2,12.2,100,101280,0,0,356,0,0,0,0,0,0,0,110,5.1,10,10,805.0,183,0,919999999,33,0.1060,0,88,0.100,5.0,0.0 +2016,11,16,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,12.2,12.2,100,100585,0,0,356,0,0,0,0,0,0,0,120,4.6,10,10,800.0,183,0,919999999,33,0.1060,0,88,0.100,5.0,0.0 +2016,11,16,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,12.2,12.2,100,101280,0,0,356,0,0,0,0,0,0,0,80,2.6,10,10,805.0,122,0,919999999,33,0.1060,0,88,0.100,5.0,0.0 +2016,11,17,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,12.2,12.2,100,101280,0,0,356,0,0,0,0,0,0,0,110,3.6,10,10,6437.0,244,0,919999999,33,0.1060,0,88,0.100,0.9,0.0 +2016,11,17,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,12.2,12.2,100,100416,0,0,356,0,0,0,0,0,0,0,90,3.6,10,10,4000.0,244,0,919999999,33,0.1060,0,88,0.100,0.0,0.0 +2016,11,17,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,11.7,11.7,100,100356,0,0,353,0,0,0,0,0,0,0,110,3.1,10,10,1609.0,61,0,919999999,31,0.1060,0,88,0.100,0.0,0.0 +2016,11,17,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,11.7,11.7,100,101280,0,0,353,0,0,0,0,0,0,0,170,2.1,10,10,1609.0,152,0,919999999,32,0.1060,0,88,0.100,0.0,0.0 +2016,11,17,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,11.7,11.7,100,100346,0,0,353,0,0,0,0,0,0,0,170,2.1,10,10,1600.0,152,0,919999999,31,0.1060,0,88,0.100,0.0,0.0 +2016,11,17,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,11.1,100,101280,0,0,349,0,0,0,0,0,0,0,170,3.1,10,10,1600.0,518,0,919999999,30,0.1060,0,88,0.100,0.0,0.0 +2016,11,17,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,10.0,93,100345,0,0,348,0,0,0,0,0,0,0,210,4.1,10,10,1600.0,274,0,919999999,26,0.1060,0,88,0.100,0.0,0.0 +2016,11,17,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.1,10.0,93,100345,195,1155,348,54,228,27,6246,0,3128,1026,210,4.1,10,10,1600.0,274,0,919999999,26,0.1060,0,88,0.100,0.0,0.0 +2016,11,17,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,10.6,100,101280,397,1399,346,65,165,37,7840,4634,4469,1610,210,5.7,10,10,1600.0,335,0,919999999,28,0.1060,0,88,0.100,0.0,0.0 +2016,11,17,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,9.4,92,100405,551,1399,345,98,124,72,11644,6033,8578,3200,230,6.7,10,10,1600.0,366,0,919999999,25,0.1060,0,88,0.100,0.0,0.0 +2016,11,17,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.6,9.4,92,100405,648,1399,345,67,0,67,6775,0,6832,3170,230,6.7,10,10,1600.0,366,0,919999999,25,0.1060,0,88,0.100,0.0,0.0 +2016,11,17,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.0,11.0,100,101280,680,1399,349,105,0,105,10634,0,10726,4773,230,6.7,10,10,1600.0,488,0,919999999,29,0.1060,0,88,0.100,0.0,0.0 +2016,11,17,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,10.6,93,100376,645,1399,352,85,0,85,8587,0,8660,3906,240,5.1,10,10,1600.0,488,0,919999999,28,0.1060,0,88,0.100,0.0,0.0 +2016,11,17,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,10.6,93,100376,546,1399,352,104,0,104,10421,0,10507,4323,240,5.1,10,10,1600.0,488,0,919999999,28,0.1060,0,88,0.100,0.0,0.0 +2016,11,17,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,10.6,90,100466,389,1399,354,85,0,85,8408,0,8473,3196,230,6.2,10,10,1600.0,732,0,919999999,28,0.1060,0,88,0.100,0.0,0.0 +2016,11,17,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,10.0,86,100516,186,1399,344,47,0,47,4572,0,4605,1539,260,6.7,9,9,1600.0,853,0,919999999,26,0.1060,0,88,0.100,0.0,0.0 +2016,11,17,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.2,10.0,86,100516,0,1096,344,0,0,0,0,0,0,0,260,6.7,9,9,1600.0,853,0,919999999,26,0.1060,0,88,0.100,0.0,0.0 +2016,11,17,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.0,8.0,82,101280,0,0,336,0,0,0,0,0,0,0,260,4.6,9,9,1600.0,945,0,919999999,22,0.1060,0,88,0.100,0.0,0.0 +2016,11,17,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,7.8,80,100665,0,0,312,0,0,0,0,0,0,0,260,6.2,3,3,1600.0,77777,0,919999999,21,0.1060,0,88,0.100,0.0,0.0 +2016,11,17,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.1,7.8,80,100665,0,0,336,0,0,0,0,0,0,0,260,6.2,9,9,1600.0,77777,9,999999999,21,0.1060,0,88,0.095,1.0,0.0 +2016,11,17,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,8.9,89,100805,0,0,316,0,0,0,0,0,0,0,270,4.6,5,5,1600.0,77777,9,999999999,24,0.1060,0,88,0.095,0.0,0.0 +2016,11,17,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,8.3,83,100845,0,0,318,0,0,0,0,0,0,0,280,5.1,5,5,1600.0,77777,9,999999999,22,0.1060,0,88,0.095,0.0,0.0 +2016,11,17,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.0,7.0,76,101280,0,0,344,0,0,0,0,0,0,0,270,3.1,10,10,1600.0,884,9,999999999,20,0.1060,0,88,0.095,0.0,0.0 +2016,11,17,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,8.3,86,101280,0,0,343,0,0,0,0,0,0,0,270,2.6,10,10,1600.0,945,9,999999999,22,0.1060,0,88,0.095,0.0,0.0 +2016,11,18,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,7.8,86,100895,0,0,312,0,0,0,0,0,0,0,270,3.1,5,5,1600.0,77777,9,999999999,21,0.1050,0,88,0.095,0.0,0.0 +2016,11,18,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.0,7.8,86,100895,0,0,312,0,0,0,0,0,0,0,270,3.1,5,5,1600.0,77777,9,999999999,21,0.1050,0,88,0.095,0.0,0.0 +2016,11,18,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,6.7,90,100915,0,0,287,0,0,0,0,0,0,0,280,4.1,0,0,1600.0,77777,9,999999999,19,0.1050,0,88,0.095,0.0,0.0 +2016,11,18,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,5.6,80,100985,0,0,323,0,0,0,0,0,0,0,290,5.1,9,9,1600.0,1158,9,999999999,17,0.1050,0,88,0.095,0.0,0.0 +2016,11,18,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,5.6,83,100985,0,0,329,0,0,0,0,0,0,0,280,5.1,10,10,1600.0,1128,9,999999999,17,0.1050,0,88,0.095,0.0,0.0 +2016,11,18,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,6.1,83,101085,0,0,324,0,0,0,0,0,0,0,300,4.1,9,9,1600.0,792,9,999999999,18,0.1050,0,88,0.095,0.0,0.0 +2016,11,18,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.0,6.0,81,101280,0,0,333,0,0,0,0,0,0,0,310,4.6,10,10,1600.0,1097,9,999999999,18,0.1050,0,88,0.095,0.0,0.0 +2016,11,18,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.9,6.1,83,101175,189,1126,333,9,0,9,878,0,884,378,310,5.1,10,10,1600.0,1097,9,999999999,18,0.1050,0,88,0.095,0.0,0.0 +2016,11,18,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,6.7,80,101280,391,1400,339,29,0,29,2875,0,2898,1285,330,5.1,10,10,1600.0,945,9,999999999,19,0.1050,0,88,0.095,0.0,0.0 +2016,11,18,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,6.7,77,101335,546,1400,332,123,55,102,14223,3100,11836,4256,340,4.1,9,9,1600.0,823,9,999999999,19,0.1050,0,88,0.095,0.0,0.0 +2016,11,18,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.6,6.7,77,101335,643,1400,332,200,94,157,22791,6491,17970,6383,340,4.1,9,9,1600.0,823,9,999999999,19,0.1050,0,88,0.095,0.0,0.0 +2016,11,18,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,5.6,60,101285,675,1400,344,280,178,197,31537,13655,22299,7674,350,4.1,9,9,1600.0,1433,9,999999999,17,0.1050,0,88,0.095,0.0,0.0 +2016,11,18,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,5.6,60,101245,640,1400,344,245,97,200,27375,7523,22460,7489,300,5.1,9,9,1600.0,1219,9,999999999,17,0.1050,0,88,0.095,0.0,0.0 +2016,11,18,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,5.6,60,101245,542,1400,344,271,272,163,30156,19075,18223,5923,300,5.1,9,9,1600.0,1219,9,999999999,17,0.1050,0,88,0.095,0.0,0.0 +2016,11,18,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.3,5.0,57,101305,385,1400,319,261,565,90,29335,25967,10151,3313,330,4.1,3,3,1600.0,77777,9,999999999,16,0.1050,0,88,0.095,0.0,0.0 +2016,11,18,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,5.0,59,101365,182,1400,317,165,559,46,18209,1604,5092,1504,320,6.2,3,3,1600.0,77777,9,999999999,16,0.1050,0,88,0.095,0.0,0.0 +2016,11,18,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.8,5.0,59,101365,0,1075,317,0,0,0,0,0,0,0,320,6.2,3,3,1600.0,77777,9,999999999,16,0.1050,0,88,0.095,0.0,0.0 +2016,11,18,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,5.0,68,101505,0,0,307,0,0,0,0,0,0,0,330,8.8,3,3,1600.0,77777,9,999999999,16,0.1050,0,88,0.095,0.0,0.0 +2016,11,18,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,5.0,74,101525,0,0,302,0,0,0,0,0,0,0,330,7.7,3,3,1600.0,77777,9,999999999,16,0.1050,0,88,0.095,0.0,0.0 +2016,11,18,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,9.4,5.0,74,101525,0,0,302,0,0,0,0,0,0,0,330,7.7,3,3,1600.0,77777,9,999999999,16,0.1050,0,88,0.095,0.0,0.0 +2016,11,18,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,5.6,83,101604,0,0,298,0,0,0,0,0,0,0,330,6.7,3,3,1600.0,77777,9,999999999,17,0.1050,0,88,0.095,0.0,0.0 +2016,11,18,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,5.6,86,101624,0,0,296,0,0,0,0,0,0,0,330,4.6,3,3,1600.0,77777,9,999999999,17,0.1050,0,88,0.095,0.0,0.0 +2016,11,18,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.8,5.6,86,101624,0,0,296,0,0,0,0,0,0,0,330,4.6,3,3,1600.0,77777,9,999999999,17,0.1050,0,88,0.095,0.0,0.0 +2016,11,18,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,5.0,86,101644,0,0,293,0,0,0,0,0,0,0,320,6.2,3,3,1600.0,77777,9,999999999,16,0.1050,0,88,0.095,0.0,0.0 +2016,11,19,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,4.4,85,101664,0,0,278,0,0,0,0,0,0,0,320,5.1,0,0,1600.0,77777,9,999999999,15,0.1040,0,88,0.095,0.0,0.0 +2016,11,19,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.7,4.4,85,101664,0,0,278,0,0,0,0,0,0,0,320,5.1,0,0,1600.0,77777,9,999999999,15,0.1040,0,88,0.095,0.0,0.0 +2016,11,19,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,4.4,89,101744,0,0,276,0,0,0,0,0,0,0,320,5.1,0,0,1600.0,77777,9,999999999,15,0.1040,0,88,0.095,0.0,0.0 +2016,11,19,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,4.4,89,101744,0,0,276,0,0,0,0,0,0,0,330,3.6,0,0,1600.0,77777,9,999999999,15,0.1040,0,88,0.095,0.0,0.0 +2016,11,19,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.1,4.4,89,101744,0,0,276,0,0,0,0,0,0,0,330,3.6,0,0,1600.0,77777,9,999999999,15,0.1040,0,88,0.095,0.0,0.0 +2016,11,19,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,3.9,86,101744,0,0,275,0,0,0,0,0,0,0,320,5.1,0,0,1600.0,77777,9,999999999,15,0.1040,0,88,0.095,0.0,0.0 +2016,11,19,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,4.4,89,101774,0,0,287,0,0,0,0,0,0,0,310,7.2,3,3,1600.0,77777,9,999999999,15,0.1040,0,88,0.095,0.0,0.0 +2016,11,19,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.1,4.4,89,101774,184,1096,287,55,294,22,6450,0,2583,851,310,7.2,3,3,1600.0,77777,9,999999999,15,0.1040,0,88,0.095,0.0,0.0 +2016,11,19,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,4.4,71,101854,386,1400,301,172,564,44,20469,18144,5246,1864,320,3.6,3,3,1600.0,77777,9,999999999,15,0.1040,0,88,0.095,0.0,0.0 +2016,11,19,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,3.9,59,101855,541,1400,311,305,745,59,36793,35687,7133,2670,330,4.1,3,3,1600.0,77777,9,999999999,15,0.1040,0,88,0.095,0.0,0.0 +2016,11,19,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,3.9,59,101855,638,1400,311,407,820,67,49554,43769,8177,3153,330,4.1,3,3,1600.0,77777,9,999999999,15,0.1040,0,88,0.095,0.0,0.0 +2016,11,19,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,4.4,51,101705,670,1400,323,460,849,70,49181,83925,10421,1490,340,4.1,3,3,1600.0,77777,9,999999999,15,0.1040,0,88,0.095,0.0,0.0 +2016,11,19,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,15.6,5.0,49,101646,636,1400,329,458,850,70,55540,45422,8510,3275,350,4.1,3,3,1600.0,77777,9,999999999,16,0.1040,0,88,0.095,0.0,0.0 +2016,11,19,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,15.6,5.0,49,101646,537,1400,329,403,820,66,48146,40034,7904,2940,350,4.1,3,3,1600.0,77777,9,999999999,16,0.1040,0,88,0.095,0.0,0.0 +2016,11,19,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,17.2,5.0,44,101596,381,1400,337,300,749,57,34933,26518,6654,2315,340,4.1,3,3,1600.0,77777,9,999999999,16,0.1040,0,88,0.095,0.0,0.0 +2016,11,19,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.1,4.4,46,101606,178,1400,331,164,588,41,18242,0,4573,1380,320,4.1,3,3,1600.0,77777,9,999999999,15,0.1040,0,88,0.095,0.0,0.0 +2016,11,19,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,16.1,4.4,46,101606,0,1055,331,0,0,0,0,0,0,0,320,4.1,3,3,1600.0,77777,9,999999999,15,0.1040,0,88,0.095,0.0,0.0 +2016,11,19,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,6.1,68,101645,0,0,300,0,0,0,0,0,0,0,80,3.6,0,0,1600.0,77777,9,999999999,18,0.1040,0,88,0.095,0.0,0.0 +2016,11,19,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,7.2,74,101695,0,0,301,0,0,0,0,0,0,0,10,2.1,0,0,1600.0,77777,9,999999999,20,0.1040,0,88,0.095,0.0,0.0 +2016,11,19,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,7.2,74,101695,0,0,301,0,0,0,0,0,0,0,10,2.1,0,0,1600.0,77777,9,999999999,20,0.1040,0,88,0.095,0.0,0.0 +2016,11,19,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,6.7,80,101695,0,0,294,0,0,0,0,0,0,0,40,2.1,0,0,1600.0,77777,9,999999999,19,0.1040,0,88,0.095,0.0,0.0 +2016,11,19,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,7.2,83,101715,0,0,294,0,0,0,0,0,0,0,20,2.6,0,0,1600.0,77777,9,999999999,20,0.1040,0,88,0.095,0.0,0.0 +2016,11,19,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.0,7.2,83,101715,0,0,294,0,0,0,0,0,0,0,20,2.6,0,0,1600.0,77777,9,999999999,20,0.1040,0,88,0.095,0.0,0.0 +2016,11,19,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,6.7,80,101705,0,0,294,0,0,0,0,0,0,0,350,2.6,0,0,1600.0,77777,9,999999999,19,0.1040,0,88,0.095,0.0,0.0 +2016,11,20,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,6.1,83,101684,0,0,288,0,0,0,0,0,0,0,350,2.6,0,0,1600.0,77777,9,999999999,18,0.1030,0,88,0.095,0.0,0.0 +2016,11,20,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.9,6.1,83,101684,0,0,288,0,0,0,0,0,0,0,350,2.6,0,0,1600.0,77777,9,999999999,18,0.1030,0,88,0.095,0.0,0.0 +2016,11,20,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,6.1,89,101704,0,0,284,0,0,0,0,0,0,0,360,3.6,0,0,1600.0,77777,9,999999999,18,0.1030,0,88,0.095,0.0,0.0 +2016,11,20,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,5.0,86,101664,0,0,280,0,0,0,0,0,0,0,360,2.6,0,0,1600.0,77777,9,999999999,16,0.1030,0,88,0.095,0.0,0.0 +2016,11,20,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.2,5.0,86,101664,0,0,280,0,0,0,0,0,0,0,360,2.6,0,0,1600.0,77777,9,999999999,16,0.1030,0,88,0.095,0.0,0.0 +2016,11,20,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,5.0,89,101594,0,0,278,0,0,0,0,0,0,0,310,3.1,0,0,1600.0,77777,9,999999999,16,0.1030,0,88,0.095,0.0,0.0 +2016,11,20,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,4.4,85,101624,0,0,278,0,0,0,0,0,0,0,340,3.1,0,0,1600.0,77777,9,999999999,15,0.1030,0,88,0.095,0.0,0.0 +2016,11,20,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.7,4.4,85,101624,179,1067,278,53,284,22,6201,0,2577,846,340,3.1,0,0,1600.0,77777,9,999999999,15,0.1030,0,88,0.095,0.0,0.0 +2016,11,20,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.0,6.0,81,101280,381,1401,324,168,548,45,19918,17113,5346,1893,350,2.1,9,9,1600.0,305,9,999999999,18,0.1030,0,88,0.095,0.0,0.0 +2016,11,20,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.0,7.0,87,101280,536,1401,307,302,735,61,36257,34343,7340,2741,50,4.1,5,5,1600.0,77777,9,999999999,20,0.1030,0,88,0.095,0.0,0.0 +2016,11,20,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,7.8,90,101345,633,1401,310,405,824,67,49190,42413,8157,3144,80,3.1,5,5,1600.0,77777,9,999999999,21,0.1030,0,88,0.095,0.0,0.0 +2016,11,20,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,8.3,89,101175,665,1401,308,459,857,69,49430,85186,10297,1477,90,3.1,3,3,1600.0,77777,9,999999999,22,0.1030,0,88,0.095,0.0,0.0 +2016,11,20,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,8.9,93,101045,631,1401,309,458,857,69,55461,43897,8376,3225,80,2.6,3,3,1600.0,77777,9,999999999,24,0.1030,0,88,0.095,0.0,0.0 +2016,11,20,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.0,8.9,93,101045,533,1401,309,402,823,66,47903,38450,7884,2932,80,2.6,3,3,1600.0,77777,9,999999999,24,0.1030,0,88,0.095,0.0,0.0 +2016,11,20,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,8.3,93,100945,377,1401,310,298,742,60,34473,25516,6959,2406,100,4.1,5,5,1600.0,77777,9,999999999,22,0.1030,0,88,0.095,0.0,0.0 +2016,11,20,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,7.8,90,101280,174,1401,328,162,563,44,17856,0,4865,1436,100,4.1,9,9,1600.0,244,9,999999999,21,0.1030,0,88,0.095,0.0,0.0 +2016,11,20,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.9,7.8,93,100855,0,1035,335,0,0,0,0,0,0,0,90,4.6,10,10,1600.0,244,9,999999999,21,0.1030,0,88,0.095,0.0,0.0 +2016,11,20,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,8.3,100,101280,0,0,332,0,0,0,0,0,0,0,90,3.6,10,10,1600.0,91,9,999999999,23,0.1030,0,88,0.095,0.0,0.0 +2016,11,20,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,8.3,8.3,100,100675,0,0,332,0,0,0,0,0,0,0,90,2.1,10,10,6437.0,91,9,999999999,22,0.1030,0,88,0.095,0.0,0.0 +2016,11,20,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,8.3,8.3,100,100675,0,0,332,0,0,0,0,0,0,0,90,2.1,10,10,6000.0,91,9,999999999,22,0.1030,0,88,0.095,2.0,0.0 +2016,11,20,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,8.3,8.3,100,100465,0,0,332,0,0,0,0,0,0,0,150,3.1,10,10,9656.0,122,0,919999999,22,0.1030,0,88,0.095,0.0,0.0 +2016,11,20,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.8,7.8,100,100345,0,0,330,0,0,0,0,0,0,0,160,1.5,10,10,6437.0,122,0,919999999,21,0.1030,0,88,0.095,0.0,0.0 +2016,11,20,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,7.8,7.8,100,100345,0,0,330,0,0,0,0,0,0,0,160,1.5,10,10,6000.0,122,0,919999999,21,0.1030,0,88,0.095,0.0,0.0 +2016,11,20,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.8,7.8,100,101279,0,0,330,0,0,0,0,0,0,0,160,2.1,10,10,4828.0,122,0,919999999,22,0.1030,0,88,0.095,0.0,0.0 +2016,11,21,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,7.8,100,101279,0,0,330,0,0,0,0,0,0,0,190,2.6,10,10,4828.0,152,0,919999999,22,0.1030,0,88,0.095,0.0,0.0 +2016,11,21,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,7.8,7.8,100,99995,0,0,321,0,0,0,0,0,0,0,180,2.1,9,9,4800.0,152,0,919999999,21,0.1030,0,88,0.095,0.0,0.0 +2016,11,21,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,7.2,100,99705,0,0,326,0,0,0,0,0,0,0,120,2.6,10,10,4800.0,762,0,919999999,20,0.1030,0,88,0.095,0.0,0.0 +2016,11,21,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,7.2,100,99455,0,0,317,0,0,0,0,0,0,0,70,5.1,9,9,4800.0,671,0,919999999,20,0.1030,0,88,0.095,0.0,0.0 +2016,11,21,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.2,7.2,100,99455,0,0,326,0,0,0,0,0,0,0,70,5.1,10,10,4800.0,671,0,919999999,20,0.1030,0,88,0.095,0.0,0.0 +2016,11,21,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,8.3,8.3,100,101280,0,0,332,0,0,0,0,0,0,0,100,6.7,10,10,4023.0,152,0,919999999,23,0.1030,0,88,0.095,0.0,0.0 +2016,11,21,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.0,9.0,100,101280,0,0,337,0,0,0,0,0,0,0,130,7.7,10,10,4023.0,305,0,919999999,24,0.1030,0,88,0.095,0.0,0.0 +2016,11,21,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.9,8.9,100,99096,174,1038,336,17,0,17,1653,0,1665,671,130,7.7,10,10,4023.0,305,0,919999999,24,0.1030,0,88,0.095,0.0,0.0 +2016,11,21,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,5.6,93,101279,376,1402,322,63,0,63,6241,0,6289,2500,210,10.8,10,10,4023.0,305,0,919999999,17,0.1030,0,88,0.095,0.0,0.0 +2016,11,21,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,2.8,86,99085,531,1402,311,99,2,98,11460,113,11383,4071,240,9.3,10,10,4023.0,427,0,919999999,13,0.1030,0,88,0.095,0.0,0.0 +2016,11,21,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.0,2.8,86,99085,628,1402,311,143,6,141,16408,405,16246,5822,240,9.3,10,10,4023.0,427,0,919999999,13,0.1030,0,88,0.095,0.0,0.0 +2016,11,21,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,0.6,68,99025,660,1402,314,162,8,158,18550,573,18172,6501,240,10.8,10,10,4023.0,884,0,919999999,10,0.1030,0,88,0.095,0.0,0.0 +2016,11,21,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,0.0,65,101279,627,1402,313,172,15,166,19491,1098,18897,6540,250,7.7,10,10,4023.0,945,0,919999999,10,0.1030,0,88,0.095,0.0,0.0 +2016,11,21,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.1,-0.6,62,99055,529,1402,312,119,5,116,13599,308,13307,4627,240,9.8,10,10,4023.0,945,0,919999999,9,0.1030,0,88,0.095,0.0,0.0 +2016,11,21,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-0.6,62,99065,373,1402,312,75,0,75,7446,0,7502,2857,220,10.3,10,10,4023.0,1158,0,919999999,9,0.1030,0,88,0.095,0.0,0.0 +2016,11,21,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-1.1,61,99125,171,1402,310,40,0,40,3905,0,3932,1336,250,9.8,10,10,4023.0,1128,0,919999999,9,0.1030,0,88,0.095,0.0,0.0 +2016,11,21,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.6,-1.1,61,99125,0,1017,310,0,0,0,0,0,0,0,250,9.8,10,10,4023.0,1128,0,919999999,9,0.1030,0,88,0.095,0.0,0.0 +2016,11,21,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-0.6,70,101279,0,0,305,0,0,0,0,0,0,0,240,8.8,10,10,4023.0,853,0,919999999,9,0.1030,0,88,0.095,0.0,0.0 +2016,11,21,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-2.8,63,99235,0,0,298,0,0,0,0,0,0,0,250,11.8,10,10,4023.0,2286,0,919999999,7,0.1030,0,88,0.095,0.0,0.0 +2016,11,21,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,-2.8,63,99235,0,0,298,0,0,0,0,0,0,0,250,11.8,10,10,4023.0,2286,9,999999999,7,0.1030,0,88,0.095,0.0,0.0 +2016,11,21,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-3.3,65,99274,0,0,293,0,0,0,0,0,0,0,240,9.3,10,10,4023.0,975,0,999099999,7,0.1030,0,88,0.095,0.0,0.0 +2016,11,21,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-3.9,67,99274,0,0,287,0,0,0,0,0,0,0,250,6.7,10,10,4023.0,1524,0,999099999,7,0.1030,0,88,0.095,0.0,0.0 +2016,11,21,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.1,-3.9,67,99274,0,0,287,0,0,0,0,0,0,0,250,6.7,10,10,4023.0,1524,0,999099999,7,0.1030,0,88,0.095,0.0,0.0 +2016,11,21,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,0.0,-2.8,79,101278,0,0,284,0,0,0,0,0,0,0,240,6.7,10,10,3219.0,914,0,999099999,8,0.1030,0,88,0.095,0.0,0.0 +2016,11,22,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-0.6,-2.8,83,101278,0,0,281,0,0,0,0,0,0,0,240,7.7,10,10,4023.0,975,0,999099999,8,0.1020,0,88,0.095,0.0,0.0 +2016,11,22,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-0.6,-2.2,88,99284,0,0,282,0,0,0,0,0,0,0,240,7.7,10,10,4800.0,975,0,999099999,8,0.1020,0,88,0.095,0.0,0.0 +2016,11,22,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-3.3,76,99364,0,0,283,0,0,0,0,0,0,0,240,7.7,10,10,4800.0,1981,0,999099999,7,0.1020,0,88,0.095,0.0,0.0 +2016,11,22,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-4.4,69,99394,0,0,274,0,0,0,0,0,0,0,260,6.7,9,9,4800.0,1219,0,999099999,6,0.1020,0,88,0.095,0.0,0.0 +2016,11,22,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.0,-4.4,69,99394,0,0,282,0,0,0,0,0,0,0,260,6.7,10,10,4800.0,1219,0,999099999,6,0.1020,0,88,0.095,0.0,0.0 +2016,11,22,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-0.6,-2.8,83,99524,0,0,281,0,0,0,0,0,0,0,250,6.7,10,10,8047.0,1067,0,999099999,7,0.1020,0,88,0.095,0.0,0.0 +2016,11,22,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-3.9,72,101278,0,0,275,0,0,0,0,0,0,0,250,8.8,9,9,8047.0,7620,0,999099999,7,0.1020,0,88,0.095,0.0,0.0 +2016,11,22,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.0,-5.0,66,99564,169,1009,274,22,0,22,2150,0,2165,835,260,7.2,9,9,8047.0,7620,0,999099999,6,0.1020,0,88,0.095,0.0,0.0 +2016,11,22,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-6.7,52,99664,371,1402,276,75,22,69,8602,914,7937,2673,270,11.3,9,9,8047.0,1250,0,999099999,5,0.1020,0,88,0.095,0.0,0.0 +2016,11,22,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-6.1,53,99714,525,1402,287,162,99,126,18399,6441,14367,4899,270,6.2,10,10,8047.0,1250,0,999099999,5,0.1020,0,88,0.095,0.0,0.0 +2016,11,22,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.7,-6.1,53,99714,623,1402,279,254,216,161,28869,15923,18380,6379,270,6.2,9,9,8047.0,1250,0,999099999,5,0.1020,0,88,0.095,0.0,0.0 +2016,11,22,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-6.7,45,99694,656,1402,285,290,218,192,32711,17349,21762,7403,260,9.3,9,9,8047.0,1463,0,999099999,5,0.1020,0,88,0.095,0.0,0.0 +2016,11,22,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-8.3,39,99704,622,1402,284,331,350,175,37378,26880,19854,6747,270,8.8,9,9,8047.0,2743,0,999099999,4,0.1020,0,88,0.095,0.0,0.0 +2016,11,22,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,-8.3,39,99704,525,1402,284,277,293,158,30890,21304,17700,5689,270,8.8,9,9,8047.0,2743,0,999099999,4,0.1020,0,88,0.095,0.0,0.0 +2016,11,22,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-8.3,40,99844,370,1402,282,198,234,125,21631,13957,13716,3960,280,6.2,9,9,8047.0,3962,0,999099999,4,0.1020,0,88,0.095,0.0,0.0 +2016,11,22,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-7.8,46,99954,168,1402,278,107,176,71,11337,3653,7555,1774,260,8.2,9,9,8047.0,3962,0,999099999,5,0.1020,0,88,0.095,0.0,0.0 +2016,11,22,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.7,-7.8,46,99954,0,999,278,0,0,0,0,0,0,0,260,8.2,9,9,8047.0,3962,0,999099999,5,0.1020,0,88,0.095,0.0,0.0 +2016,11,22,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-7.2,50,100064,0,0,261,0,0,0,0,0,0,0,270,9.3,5,5,8047.0,77777,0,999099999,5,0.1020,0,88,0.095,0.0,0.0 +2016,11,22,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-8.3,46,100124,0,0,275,0,0,0,0,0,0,0,270,9.3,9,9,8047.0,2743,0,999099999,4,0.1020,0,88,0.095,0.0,0.0 +2016,11,22,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.1,-8.3,46,100124,0,0,259,0,0,0,0,0,0,0,270,9.3,5,5,8047.0,2743,9,999999999,4,0.1020,0,88,0.095,0.0,0.0 +2016,11,22,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-7.8,49,100264,0,0,254,0,0,0,0,0,0,0,260,9.8,3,3,8047.0,77777,9,999999999,5,0.1020,0,88,0.095,0.0,0.0 +2016,11,22,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-8.3,49,100314,0,0,251,0,0,0,0,0,0,0,280,8.2,3,3,8047.0,77777,9,999999999,4,0.1020,0,88,0.095,0.0,0.0 +2016,11,22,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.0,-8.3,49,100314,0,0,251,0,0,0,0,0,0,0,280,8.2,3,3,8047.0,77777,9,999999999,4,0.1020,0,88,0.095,0.0,0.0 +2016,11,22,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-8.3,49,100374,0,0,251,0,0,0,0,0,0,0,270,7.7,3,3,8047.0,77777,9,999999999,4,0.1020,0,88,0.095,0.0,0.0 +2016,11,23,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-7.8,49,100404,0,0,244,0,0,0,0,0,0,0,260,9.8,0,0,8047.0,77777,9,999999999,5,0.1010,0,88,0.095,0.0,0.0 +2016,11,23,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.6,-7.8,49,100404,0,0,258,0,0,0,0,0,0,0,260,9.8,5,5,8047.0,77777,9,999999999,5,0.1010,0,88,0.095,0.0,0.0 +2016,11,23,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-7.2,52,100474,0,0,282,0,0,0,0,0,0,0,270,7.7,10,10,8047.0,3353,9,999999999,5,0.1010,0,88,0.095,0.0,0.0 +2016,11,23,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-7.2,52,100494,0,0,282,0,0,0,0,0,0,0,270,9.3,10,10,8047.0,3353,9,999999999,5,0.1010,0,88,0.095,0.0,0.0 +2016,11,23,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.6,-7.2,52,100494,0,0,244,0,0,0,0,0,0,0,270,9.3,0,0,8047.0,3353,9,999999999,5,0.1010,0,88,0.095,0.0,0.0 +2016,11,23,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-7.2,54,100643,0,0,252,0,0,0,0,0,0,0,270,6.7,3,3,8047.0,77777,9,999999999,5,0.1010,0,88,0.095,0.0,0.0 +2016,11,23,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-7.2,54,100733,0,0,252,0,0,0,0,0,0,0,290,8.8,3,3,8047.0,77777,9,999999999,5,0.1010,0,88,0.095,0.0,0.0 +2016,11,23,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-7.2,52,100833,164,980,255,46,260,21,5377,0,2458,798,290,6.7,3,3,8047.0,77777,9,999999999,5,0.1010,0,88,0.095,0.0,0.0 +2016,11,23,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-7.2,48,100944,366,1403,259,162,538,43,19258,17610,5121,1798,280,8.2,3,3,8047.0,77777,9,999999999,5,0.1010,0,88,0.095,0.0,0.0 +2016,11,23,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-6.7,45,101044,521,1403,265,297,744,60,35714,37139,7231,2676,280,8.8,3,3,8047.0,77777,9,999999999,5,0.1010,0,88,0.095,0.0,0.0 +2016,11,23,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,-6.7,45,101044,618,1403,265,402,841,65,42529,81420,9769,1382,280,8.8,3,3,8047.0,77777,9,999999999,5,0.1010,0,88,0.095,0.0,0.0 +2016,11,23,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-6.1,42,101034,651,1403,273,458,882,66,48479,86000,9868,1440,300,9.8,3,3,8047.0,77777,9,999999999,5,0.1010,0,88,0.095,0.0,0.0 +2016,11,23,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-6.1,40,101054,618,1403,275,459,886,65,48580,85813,9769,1382,280,6.2,3,3,8047.0,77777,9,999999999,5,0.1010,0,88,0.095,0.0,0.0 +2016,11,23,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.6,-6.1,40,101054,521,1403,275,404,863,60,42771,81449,9164,1203,280,6.2,3,3,8047.0,77777,9,999999999,5,0.1010,0,88,0.095,0.0,0.0 +2016,11,23,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-5.6,42,101194,366,1403,275,300,793,52,35133,28048,6103,2116,270,8.2,3,3,8047.0,77777,9,999999999,6,0.1010,0,88,0.095,0.0,0.0 +2016,11,23,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-6.1,42,101314,164,1403,273,162,621,39,18018,0,4350,1294,290,6.7,3,3,8047.0,77777,9,999999999,5,0.1010,0,88,0.095,0.0,0.0 +2016,11,23,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.0,-6.1,42,101314,0,982,273,0,0,0,0,0,0,0,290,6.7,3,3,8047.0,77777,9,999999999,5,0.1010,0,88,0.095,0.0,0.0 +2016,11,23,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-5.6,49,101514,0,0,266,0,0,0,0,0,0,0,290,9.8,3,3,8047.0,77777,9,999999999,6,0.1010,0,88,0.095,0.0,0.0 +2016,11,23,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-6.1,51,101573,0,0,262,0,0,0,0,0,0,0,290,6.7,3,3,8047.0,77777,9,999999999,5,0.1010,0,88,0.095,0.0,0.0 +2016,11,23,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-6.7,48,101633,0,0,261,0,0,0,0,0,0,0,290,4.6,3,3,8047.0,77777,9,999999999,5,0.1010,0,88,0.095,0.0,0.0 +2016,11,23,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-7.2,48,101633,0,0,259,0,0,0,0,0,0,0,280,7.7,3,3,8047.0,77777,9,999999999,5,0.1010,0,88,0.095,0.0,0.0 +2016,11,23,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-7.2,50,101663,0,0,257,0,0,0,0,0,0,0,290,6.2,3,3,8047.0,77777,9,999999999,5,0.1010,0,88,0.095,0.0,0.0 +2016,11,23,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.1,-7.2,50,101663,0,0,257,0,0,0,0,0,0,0,290,6.2,3,3,8047.0,77777,9,999999999,5,0.1010,0,88,0.095,0.0,0.0 +2016,11,23,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-6.7,52,101693,0,0,246,0,0,0,0,0,0,0,290,6.2,0,0,8047.0,77777,9,999999999,5,0.1010,0,88,0.095,0.0,0.0 +2016,11,24,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-6.1,55,101743,0,0,277,0,0,0,0,0,0,0,290,6.2,9,9,8047.0,1189,9,999999999,5,0.1000,0,88,0.095,0.0,0.0 +2016,11,24,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.1,-6.1,55,101743,0,0,285,0,0,0,0,0,0,0,290,6.2,10,10,8047.0,1189,9,999999999,5,0.1000,0,88,0.095,0.0,0.0 +2016,11,24,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-6.1,55,101793,0,0,285,0,0,0,0,0,0,0,300,7.2,10,10,8047.0,1158,9,999999999,5,0.1000,0,88,0.095,0.0,0.0 +2016,11,24,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-6.7,52,101853,0,0,246,0,0,0,0,0,0,0,300,9.3,0,0,8047.0,77777,9,999999999,5,0.1000,0,88,0.095,0.0,0.0 +2016,11,24,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.1,-6.7,52,101853,0,0,246,0,0,0,0,0,0,0,300,9.3,0,0,8047.0,77777,9,999999999,5,0.1000,0,88,0.095,0.0,0.0 +2016,11,24,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-6.7,54,101963,0,0,255,0,0,0,0,0,0,0,290,7.7,3,3,8047.0,77777,9,999999999,5,0.1000,0,88,0.095,0.0,0.0 +2016,11,24,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-6.1,57,102013,0,0,256,0,0,0,0,0,0,0,290,7.7,3,3,8047.0,77777,9,999999999,5,0.1000,0,88,0.095,0.0,0.0 +2016,11,24,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.6,-6.1,57,102013,159,951,256,47,301,18,5546,0,2126,694,290,7.7,3,3,8047.0,77777,9,999999999,5,0.1000,0,88,0.095,0.0,0.0 +2016,11,24,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-6.1,51,102073,361,1403,262,162,585,39,19372,17917,4671,1644,290,8.2,3,3,8047.0,77777,9,999999999,5,0.1000,0,88,0.095,0.0,0.0 +2016,11,24,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-6.1,49,102113,516,1403,253,298,781,54,31643,73656,8297,1179,300,7.7,0,0,8047.0,77777,9,999999999,5,0.1000,0,88,0.095,0.0,0.0 +2016,11,24,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,-6.1,49,102113,613,1403,253,403,862,61,42730,83443,9205,1356,300,7.7,0,0,8047.0,77777,9,999999999,5,0.1000,0,88,0.095,0.0,0.0 +2016,11,24,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-5.6,42,102064,647,1403,275,458,893,64,48538,87047,9591,1422,300,5.1,3,3,8047.0,77777,9,999999999,6,0.1000,0,88,0.095,0.0,0.0 +2016,11,24,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-5.0,41,102044,614,1403,280,458,892,65,48512,86379,9776,1375,320,4.6,3,3,8047.0,77777,9,999999999,6,0.1000,0,88,0.095,0.0,0.0 +2016,11,24,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.7,-5.0,41,102044,517,1403,280,402,860,61,48226,42660,7334,2708,320,4.6,3,3,8047.0,77777,9,999999999,6,0.1000,0,88,0.095,0.0,0.0 +2016,11,24,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-4.4,43,102184,363,1403,285,298,783,54,34754,27714,6312,2177,310,6.7,5,5,8047.0,77777,9,999999999,6,0.1000,0,88,0.095,0.0,0.0 +2016,11,24,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-4.4,45,102234,161,1403,300,160,608,39,17762,0,4341,1285,330,5.7,9,9,8047.0,8534,9,999999999,6,0.1000,0,88,0.095,0.0,0.0 +2016,11,24,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.1,-4.4,45,102234,0,966,300,0,0,0,0,0,0,0,330,5.7,9,9,8047.0,8534,9,999999999,6,0.1000,0,88,0.095,0.0,0.0 +2016,11,24,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-4.4,52,102373,0,0,270,0,0,0,0,0,0,0,330,6.2,3,3,8047.0,77777,9,999999999,6,0.1000,0,88,0.095,0.0,0.0 +2016,11,24,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-4.4,55,102423,0,0,257,0,0,0,0,0,0,0,320,7.7,0,0,8047.0,77777,9,999999999,6,0.1000,0,88,0.095,0.0,0.0 +2016,11,24,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,-4.4,55,102423,0,0,257,0,0,0,0,0,0,0,320,7.7,0,0,8047.0,77777,9,999999999,6,0.1000,0,88,0.095,0.0,0.0 +2016,11,24,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-4.4,59,102513,0,0,252,0,0,0,0,0,0,0,340,4.6,0,0,8047.0,77777,9,999999999,6,0.1000,0,88,0.095,0.0,0.0 +2016,11,24,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-4.4,61,102533,0,0,266,0,0,0,0,0,0,0,360,4.6,5,5,8047.0,77777,9,999999999,6,0.1000,0,88,0.095,0.0,0.0 +2016,11,24,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.7,-4.4,61,102533,0,0,281,0,0,0,0,0,0,0,360,4.6,9,9,8047.0,77777,9,999999999,6,0.1000,0,88,0.095,0.0,0.0 +2016,11,24,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-3.9,69,102663,0,0,262,0,0,0,0,0,0,0,330,3.1,5,5,8047.0,77777,9,999999999,7,0.1000,0,88,0.095,0.0,0.0 +2016,11,25,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-3.9,69,102673,0,0,277,0,0,0,0,0,0,0,330,3.6,9,9,8047.0,7620,9,999999999,7,0.1000,0,88,0.095,0.0,0.0 +2016,11,25,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.6,-3.9,69,102673,0,0,277,0,0,0,0,0,0,0,330,3.6,9,9,8047.0,7620,9,999999999,7,0.1000,0,88,0.095,0.0,0.0 +2016,11,25,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-2.8,76,102623,0,0,286,0,0,0,0,0,0,0,360,3.6,10,10,8047.0,914,9,999999999,8,0.1000,0,88,0.095,0.0,0.0 +2016,11,25,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-2.2,77,102583,0,0,289,0,0,0,0,0,0,0,360,3.6,10,10,8047.0,853,9,999999999,8,0.1000,0,88,0.095,0.0,0.0 +2016,11,25,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.1,-2.2,77,102583,0,0,289,0,0,0,0,0,0,0,360,3.6,10,10,8047.0,853,9,999999999,8,0.1000,0,88,0.095,0.0,0.0 +2016,11,25,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-2.2,74,101278,0,0,292,0,0,0,0,0,0,0,310,3.6,10,10,8047.0,914,9,999999999,8,0.1000,0,88,0.095,0.0,0.0 +2016,11,25,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-2.2,74,102763,0,0,292,0,0,0,0,0,0,0,330,2.6,10,10,8047.0,914,9,999999999,8,0.1000,0,88,0.095,0.0,0.0 +2016,11,25,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.7,-2.2,74,102763,154,923,292,11,0,11,1073,0,1080,443,330,2.6,10,10,8047.0,914,9,999999999,8,0.1000,0,88,0.095,0.0,0.0 +2016,11,25,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-2.2,71,102753,356,1404,294,40,0,40,3967,0,3997,1675,350,3.1,10,10,8047.0,1067,9,999999999,8,0.1000,0,88,0.095,0.0,0.0 +2016,11,25,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-1.7,71,102763,511,1404,297,72,0,72,7231,0,7289,3112,90,0.0,10,10,8047.0,1067,9,999999999,8,0.1000,0,88,0.095,0.0,0.0 +2016,11,25,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,-1.7,71,102763,609,1404,297,101,0,101,10224,0,10309,4413,107,0.0,10,10,8047.0,1067,9,999999999,8,0.1000,0,88,0.095,0.0,0.0 +2016,11,25,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-0.6,70,102623,642,1404,297,114,12,108,13407,751,12746,4768,360,2.6,9,9,8047.0,2286,9,999999999,9,0.1000,0,88,0.095,0.0,0.0 +2016,11,25,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,0.6,70,102574,610,1404,312,130,41,111,15156,2550,12987,4769,320,2.1,10,10,8047.0,1036,9,999999999,11,0.1000,0,88,0.095,0.0,0.0 +2016,11,25,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.6,0.6,70,102574,513,1404,312,125,41,107,14321,2405,12304,4292,320,2.1,10,10,8047.0,1036,9,999999999,11,0.1000,0,88,0.095,0.0,0.0 +2016,11,25,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,1.7,73,102494,359,1404,315,59,0,59,5846,0,5890,2333,118,0.0,10,10,8047.0,1036,9,999999999,12,0.1000,0,88,0.095,0.0,0.0 +2016,11,25,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,2.2,76,102524,158,1404,316,30,0,30,2923,0,2943,1056,105,0.0,10,10,8047.0,1189,9,999999999,12,0.1000,0,88,0.095,0.0,0.0 +2016,11,25,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.1,2.2,76,102524,0,950,316,0,0,0,0,0,0,0,104,0.0,10,10,8047.0,1189,0,919999999,12,0.1000,0,88,0.095,0.0,0.0 +2016,11,25,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,4.4,85,102504,0,0,321,0,0,0,0,0,0,0,109,0.0,10,10,8047.0,1067,0,919999999,15,0.1000,0,88,0.095,0.0,0.0 +2016,11,25,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.0,4.0,87,101279,0,0,317,0,0,0,0,0,0,0,350,2.1,10,10,8047.0,792,0,919999999,15,0.1000,0,88,0.095,0.0,0.0 +2016,11,25,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.1,3.9,86,102514,0,0,317,0,0,0,0,0,0,0,360,2.6,10,10,8047.0,792,0,919999999,15,0.1000,0,88,0.094,1.0,0.0 +2016,11,25,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,3.9,93,101279,0,0,312,0,0,0,0,0,0,0,10,2.6,10,10,8047.0,1463,0,919999999,15,0.1000,0,88,0.094,0.3,0.0 +2016,11,25,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,4.4,3.9,97,102483,0,0,310,0,0,0,0,0,0,0,310,2.6,10,10,9656.0,1036,0,919999999,15,0.1000,0,88,0.094,0.0,0.0 +2016,11,25,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,4.4,3.9,97,102483,0,0,310,0,0,0,0,0,0,0,310,2.6,10,10,9000.0,1036,0,919999999,15,0.1000,0,88,0.094,0.0,0.0 +2016,11,25,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,3.9,97,102463,0,0,310,0,0,0,0,0,0,0,340,1.5,10,10,9000.0,975,0,919999999,15,0.1000,0,88,0.094,0.0,0.0 +2016,11,26,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,3.9,97,102443,0,0,310,0,0,0,0,0,0,0,340,2.1,10,10,9000.0,1250,0,919999999,15,0.0990,0,88,0.094,0.0,0.0 +2016,11,26,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,4.4,3.9,97,102443,0,0,310,0,0,0,0,0,0,0,340,2.1,10,10,9000.0,1250,0,919999999,15,0.0990,0,88,0.094,0.0,0.0 +2016,11,26,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,3.9,93,102423,0,0,312,0,0,0,0,0,0,0,350,2.6,10,10,9000.0,1036,0,919999999,15,0.0990,0,88,0.094,0.0,0.0 +2016,11,26,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,3.9,97,101279,0,0,310,0,0,0,0,0,0,0,330,2.6,10,10,9000.0,732,0,919999999,15,0.0990,0,88,0.094,0.0,0.0 +2016,11,26,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,4.4,3.9,97,102443,0,0,310,0,0,0,0,0,0,0,320,2.1,10,10,9000.0,732,0,919999999,15,0.0990,0,88,0.094,0.0,0.0 +2016,11,26,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,3.9,97,102533,0,0,310,0,0,0,0,0,0,0,350,2.1,10,10,9000.0,610,0,919999999,15,0.0990,0,88,0.094,0.0,0.0 +2016,11,26,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,3.9,97,101279,0,0,310,0,0,0,0,0,0,0,340,2.1,10,10,9000.0,366,0,919999999,15,0.0990,0,88,0.094,0.0,0.0 +2016,11,26,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,4.4,3.9,97,102553,149,895,310,12,0,12,1167,0,1175,478,350,2.1,10,10,4000.0,366,0,919999999,15,0.0990,0,88,0.094,0.0,0.0 +2016,11,26,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,4.4,4.4,100,102523,351,1404,310,49,0,49,4847,0,4883,1986,20,2.1,10,10,3219.0,122,0,919999999,16,0.0990,0,88,0.094,0.0,0.0 +2016,11,26,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,5.6,5.0,96,102504,506,1404,316,94,0,94,9415,0,9490,3859,10,2.6,10,10,3219.0,91,0,919999999,16,0.0990,0,88,0.094,0.0,0.0 +2016,11,26,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,5.6,5.0,96,102504,604,1404,316,125,0,125,12620,0,12725,5212,10,2.6,10,10,3200.0,91,0,919999999,16,0.0990,0,88,0.094,0.0,0.0 +2016,11,26,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.2,6.7,97,101279,638,1404,326,192,45,172,21690,3233,19522,6764,350,1.5,10,10,3219.0,853,0,919999999,19,0.0990,0,88,0.094,0.0,0.0 +2016,11,26,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,7.2,93,102224,606,1404,331,143,12,137,16344,776,15723,5594,100,1.5,10,10,3219.0,914,0,919999999,20,0.0990,0,88,0.094,0.0,0.0 +2016,11,26,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.3,7.2,93,102224,510,1404,331,102,6,99,11722,324,11417,4031,100,1.5,10,10,3219.0,914,0,919999999,20,0.0990,0,88,0.094,0.0,0.0 +2016,11,26,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,8.3,7.8,97,101280,356,1404,323,135,227,79,15186,8810,8917,2909,130,2.6,9,9,8047.0,1036,0,919999999,21,0.0990,0,88,0.094,0.0,0.0 +2016,11,26,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,8.3,100,101280,156,1404,323,82,190,55,8779,619,5911,1540,173,0.0,9,9,8047.0,396,0,919999999,23,0.0990,0,88,0.094,0.0,0.0 +2016,11,26,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.3,7.8,97,102134,0,936,332,0,0,0,0,0,0,0,160,1.5,10,10,8047.0,396,0,919999999,22,0.0990,0,88,0.094,0.0,0.0 +2016,11,26,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.0,7.0,93,101280,0,0,330,0,0,0,0,0,0,0,290,1.5,10,10,8047.0,274,0,919999999,20,0.0990,0,88,0.094,0.0,0.0 +2016,11,26,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,6.1,96,102204,0,0,323,0,0,0,0,0,0,0,300,3.6,10,10,8047.0,244,0,919999999,18,0.0990,0,88,0.094,0.0,0.0 +2016,11,26,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.7,6.1,96,102204,0,0,323,0,0,0,0,0,0,0,300,3.6,10,10,8047.0,244,9,999999999,18,0.0990,0,88,0.094,1.0,0.0 +2016,11,26,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,6.7,6.1,96,101279,0,0,323,0,0,0,0,0,0,0,290,3.1,10,10,3219.0,152,9,999999999,18,0.0990,0,88,0.094,0.0,0.0 +2016,11,26,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,6.7,6.1,96,102124,0,0,323,0,0,0,0,0,0,0,320,3.1,10,10,8047.0,1676,9,999999999,18,0.0990,0,88,0.094,0.0,0.0 +2016,11,26,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,6.7,6.1,96,102124,0,0,323,0,0,0,0,0,0,0,320,3.1,10,10,8000.0,1676,9,999999999,18,0.0990,0,88,0.094,0.0,0.0 +2016,11,26,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,6.1,100,101279,0,0,320,0,0,0,0,0,0,0,302,0.0,10,10,8000.0,2286,9,999999999,18,0.0990,0,88,0.094,0.0,0.0 +2016,11,27,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,5.6,5.0,96,101279,0,0,316,0,0,0,0,0,0,0,340,2.6,10,10,805.0,152,9,999999999,16,0.0980,0,88,0.094,0.0,0.0 +2016,11,27,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,5.0,5.0,100,102004,0,0,314,0,0,0,0,0,0,0,340,2.6,10,10,800.0,152,9,999999999,16,0.0980,0,88,0.094,0.0,0.0 +2016,11,27,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,4.4,4.4,100,101974,0,0,310,0,0,0,0,0,0,0,270,2.6,10,10,805.0,61,0,999999999,15,0.0980,0,88,0.094,0.0,0.0 +2016,11,27,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,4.4,4.4,100,101964,0,0,310,0,0,0,0,0,0,0,320,2.1,10,10,805.0,61,0,999999999,15,0.0980,0,88,0.094,0.0,0.0 +2016,11,27,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,4.4,4.4,100,101964,0,0,310,0,0,0,0,0,0,0,320,2.1,10,10,800.0,61,0,999999999,15,0.0980,0,88,0.094,0.0,0.0 +2016,11,27,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.9,3.9,100,101279,0,0,308,0,0,0,0,0,0,0,340,3.1,10,10,1207.0,122,0,999999999,15,0.0980,0,88,0.094,0.0,0.0 +2016,11,27,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.9,3.9,100,101914,0,0,308,0,0,0,0,0,0,0,330,2.1,10,10,402.0,91,0,999999999,15,0.0980,0,88,0.094,0.0,0.0 +2016,11,27,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,3.9,3.9,100,101914,145,868,308,18,9,18,2103,0,2105,682,330,2.1,10,10,400.0,91,0,999999999,15,0.0980,0,88,0.094,0.0,0.0 +2016,11,27,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.9,3.3,96,101279,346,1405,307,80,54,68,9099,1952,7757,2572,348,0.0,10,10,402.0,152,0,999999999,14,0.0980,0,88,0.094,0.0,0.0 +2016,11,27,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,4.4,3.3,93,101914,502,1405,309,158,109,123,17836,6661,13941,4697,343,2.1,10,10,3219.0,183,0,999999999,14,0.0980,0,88,0.094,0.0,0.0 +2016,11,27,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,4.4,3.3,93,101914,600,1405,309,269,307,145,30611,20829,16571,5798,337,2.1,10,10,3200.0,183,0,999999999,14,0.0980,0,88,0.094,0.0,0.0 +2016,11,27,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,5.0,96,101279,634,1405,316,266,200,181,29920,14859,20457,6970,335,0.0,10,10,3200.0,213,0,999999999,16,0.0980,0,88,0.094,0.0,0.0 +2016,11,27,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,3.9,82,101279,602,1405,311,299,257,187,33339,19530,20954,6885,20,2.6,9,9,3200.0,3353,0,999999999,15,0.0980,0,88,0.094,0.0,0.0 +2016,11,27,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.8,5.0,82,101624,506,1405,317,274,308,155,30366,20984,17257,5492,10,2.1,9,9,3200.0,3353,0,999999999,16,0.0980,0,88,0.094,0.0,0.0 +2016,11,27,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,4.4,82,101279,353,1405,323,229,431,104,25196,20892,11489,3474,10,2.6,10,10,3200.0,427,0,999999999,15,0.0980,0,88,0.094,0.0,0.0 +2016,11,27,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,4.4,82,101584,153,1405,314,122,310,66,12862,3955,6988,1623,350,3.1,9,9,3200.0,457,0,999999999,15,0.0980,0,88,0.094,0.0,0.0 +2016,11,27,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.2,4.4,82,101584,0,922,323,0,0,0,0,0,0,0,350,3.1,10,10,3200.0,457,0,999999999,15,0.0980,0,88,0.094,0.0,0.0 +2016,11,27,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,5.0,89,101279,0,0,313,0,0,0,0,0,0,0,10,3.1,9,9,3200.0,945,0,999999999,16,0.0980,0,88,0.094,0.0,0.0 +2016,11,27,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,4.4,89,101584,0,0,309,0,0,0,0,0,0,0,330,4.1,9,9,3200.0,975,0,999999999,15,0.0980,0,88,0.094,0.0,0.0 +2016,11,27,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.1,4.4,89,101584,0,0,318,0,0,0,0,0,0,0,330,4.1,10,10,3200.0,975,9,999999999,15,0.0980,0,88,0.094,0.0,0.0 +2016,11,27,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,3.9,89,101554,0,0,306,0,0,0,0,0,0,0,320,6.2,9,9,3200.0,1158,9,999999999,15,0.0980,0,88,0.094,0.0,0.0 +2016,11,27,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,3.9,89,101279,0,0,306,0,0,0,0,0,0,0,320,5.7,9,9,3200.0,853,9,999999999,15,0.0980,0,88,0.094,0.0,0.0 +2016,11,27,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.6,3.9,89,101494,0,0,289,0,0,0,0,0,0,0,330,5.1,5,5,3200.0,853,9,999999999,15,0.0980,0,88,0.094,0.0,0.0 +2016,11,27,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,2.8,89,101444,0,0,279,0,0,0,0,0,0,0,290,4.1,3,3,3200.0,77777,9,999999999,13,0.0980,0,88,0.094,0.0,0.0 +2016,11,28,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,2.8,93,101454,0,0,298,0,0,0,0,0,0,0,300,5.1,9,9,3200.0,1981,9,999999999,13,0.0970,0,88,0.094,0.0,0.0 +2016,11,28,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.9,2.8,93,101454,0,0,306,0,0,0,0,0,0,0,300,5.1,10,10,3200.0,1981,9,999999999,13,0.0970,0,88,0.094,0.0,0.0 +2016,11,28,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,1.7,86,101474,0,0,297,0,0,0,0,0,0,0,300,5.7,9,9,3200.0,1676,9,999999999,12,0.0970,0,88,0.094,0.0,0.0 +2016,11,28,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,0.0,79,101434,0,0,276,0,0,0,0,0,0,0,300,6.2,5,5,3200.0,77777,9,999999999,10,0.0970,0,88,0.094,0.0,0.0 +2016,11,28,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,0.0,79,101434,0,0,272,0,0,0,0,0,0,0,300,6.2,3,3,3200.0,77777,9,999999999,10,0.0970,0,88,0.094,0.0,0.0 +2016,11,28,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-1.1,75,101474,0,0,269,0,0,0,0,0,0,0,300,6.7,3,3,3200.0,77777,9,999999999,9,0.0970,0,88,0.094,0.0,0.0 +2016,11,28,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-2.2,68,101504,0,0,268,0,0,0,0,0,0,0,300,6.2,3,3,3200.0,77777,9,999999999,8,0.0970,0,88,0.094,0.0,0.0 +2016,11,28,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,-2.2,68,101504,140,840,272,32,157,17,3752,0,1995,645,300,6.2,5,5,3200.0,77777,9,999999999,8,0.0970,0,88,0.094,0.0,0.0 +2016,11,28,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-1.7,66,101564,342,1405,277,137,424,44,16128,12268,5190,1798,310,7.2,5,5,3200.0,77777,9,999999999,8,0.0970,0,88,0.094,0.0,0.0 +2016,11,28,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-2.2,63,101594,497,1405,276,269,663,68,31841,32788,8070,2935,320,6.7,5,5,3200.0,77777,9,999999999,8,0.0970,0,88,0.094,0.0,0.0 +2016,11,28,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.9,-2.2,63,101594,595,1405,276,373,762,79,44547,42843,9461,3556,320,6.7,5,5,3200.0,77777,9,999999999,8,0.0970,0,88,0.094,0.0,0.0 +2016,11,28,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-2.2,52,101484,630,1405,288,429,802,84,51336,46704,10081,3827,290,7.7,5,5,3200.0,77777,9,999999999,8,0.0970,0,88,0.094,0.0,0.0 +2016,11,28,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,-2.2,50,101434,599,1405,290,429,799,86,50934,46126,10241,3831,300,5.7,5,5,3200.0,77777,9,999999999,8,0.0970,0,88,0.094,0.0,0.0 +2016,11,28,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.2,-2.2,50,101434,503,1405,290,374,748,85,43566,40269,9932,3551,300,5.7,5,5,3200.0,77777,9,999999999,8,0.0970,0,88,0.094,0.0,0.0 +2016,11,28,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-2.8,49,101464,350,1405,287,274,663,73,31074,26574,8305,2725,290,7.2,5,5,3200.0,77777,9,999999999,7,0.0970,0,88,0.094,0.0,0.0 +2016,11,28,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-2.8,51,101494,151,1405,310,143,480,49,15478,1080,5322,1431,290,5.7,10,10,3200.0,3048,9,999999999,7,0.0970,0,88,0.094,0.0,0.0 +2016,11,28,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.1,-2.8,51,101494,0,909,310,0,0,0,0,0,0,0,290,5.7,10,10,3200.0,3048,9,999999999,7,0.0970,0,88,0.094,0.0,0.0 +2016,11,28,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-3.3,53,101564,0,0,305,0,0,0,0,0,0,0,300,7.7,10,10,3200.0,3353,9,999999999,7,0.0970,0,88,0.094,0.0,0.0 +2016,11,28,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-3.3,55,101614,0,0,294,0,0,0,0,0,0,0,290,6.2,9,9,3200.0,7620,9,999999999,7,0.0970,0,88,0.094,0.0,0.0 +2016,11,28,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,4.4,-3.3,55,101614,0,0,277,0,0,0,0,0,0,0,290,6.2,5,5,3200.0,7620,9,999999999,7,0.0970,0,88,0.094,0.0,0.0 +2016,11,28,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-3.3,60,101634,0,0,289,0,0,0,0,0,0,0,300,5.1,9,9,3200.0,7620,9,999999999,7,0.0970,0,88,0.094,0.0,0.0 +2016,11,28,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-2.8,65,101653,0,0,271,0,0,0,0,0,0,0,300,4.6,5,5,3200.0,77777,9,999999999,8,0.0970,0,88,0.094,0.0,0.0 +2016,11,28,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,-2.8,65,101653,0,0,271,0,0,0,0,0,0,0,300,4.6,5,5,3200.0,77777,9,999999999,8,0.0970,0,88,0.094,0.0,0.0 +2016,11,28,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-3.3,65,101713,0,0,264,0,0,0,0,0,0,0,300,4.6,3,3,3200.0,77777,9,999999999,7,0.0970,0,88,0.094,0.0,0.0 +2016,11,29,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-3.3,67,101763,0,0,267,0,0,0,0,0,0,0,290,4.1,5,5,3200.0,77777,9,999999999,7,0.0960,0,88,0.094,0.0,0.0 +2016,11,29,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.7,-3.3,67,101763,0,0,267,0,0,0,0,0,0,0,290,4.1,5,5,3200.0,77777,9,999999999,7,0.0960,0,88,0.094,0.0,0.0 +2016,11,29,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-2.8,70,101773,0,0,283,0,0,0,0,0,0,0,290,4.6,9,9,3200.0,1067,9,999999999,8,0.0960,0,88,0.094,0.0,0.0 +2016,11,29,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-2.8,70,101813,0,0,291,0,0,0,0,0,0,0,280,4.6,10,10,3200.0,1036,9,999999999,8,0.0960,0,88,0.094,0.0,0.0 +2016,11,29,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.7,-2.8,70,101813,0,0,283,0,0,0,0,0,0,0,280,4.6,9,9,3200.0,1036,9,999999999,8,0.0960,0,88,0.094,0.0,0.0 +2016,11,29,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-3.3,70,101963,0,0,264,0,0,0,0,0,0,0,280,3.6,5,5,3200.0,77777,9,999999999,7,0.0960,0,88,0.094,0.0,0.0 +2016,11,29,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-3.3,70,101983,0,0,260,0,0,0,0,0,0,0,290,4.6,3,3,3200.0,77777,9,999999999,7,0.0960,0,88,0.094,0.0,0.0 +2016,11,29,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.1,-3.3,70,101983,136,814,260,33,200,15,3898,0,1773,575,290,4.6,3,3,3200.0,77777,9,999999999,7,0.0960,0,88,0.094,0.0,0.0 +2016,11,29,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-3.9,59,102053,337,1406,266,141,483,37,16808,12765,4417,1541,310,3.6,3,3,3200.0,77777,9,999999999,7,0.0960,0,88,0.094,0.0,0.0 +2016,11,29,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-3.9,55,102123,493,1406,270,276,732,58,33050,34530,6961,2550,320,4.6,3,3,3200.0,77777,9,999999999,7,0.0960,0,88,0.094,0.0,0.0 +2016,11,29,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.9,-3.9,55,102123,591,1406,270,380,822,67,45934,44431,8118,3072,320,4.6,3,3,3200.0,77777,9,999999999,7,0.0960,0,88,0.094,0.0,0.0 +2016,11,29,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-3.9,47,102004,626,1406,279,437,859,71,52944,48141,8623,3296,290,4.1,3,3,3200.0,77777,9,999999999,7,0.0960,0,88,0.094,0.0,0.0 +2016,11,29,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,-3.3,46,101964,595,1406,284,440,866,70,53044,47340,8460,3200,310,4.6,3,3,3200.0,77777,9,999999999,7,0.0960,0,88,0.094,0.0,0.0 +2016,11,29,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.2,-3.3,46,101964,500,1406,284,387,839,65,46009,41255,7746,2830,310,4.6,3,3,3200.0,77777,9,999999999,7,0.0960,0,88,0.094,0.0,0.0 +2016,11,29,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,-3.9,42,101944,348,1406,286,285,763,56,32994,26164,6499,2211,270,3.6,3,3,3200.0,77777,9,999999999,7,0.0960,0,88,0.094,0.0,0.0 +2016,11,29,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,-4.4,42,101954,149,1406,287,150,577,40,16499,0,4413,1264,260,3.1,5,5,3200.0,77777,9,999999999,6,0.0960,0,88,0.094,0.0,0.0 +2016,11,29,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.2,-4.4,42,101954,0,898,287,0,0,0,0,0,0,0,260,3.1,5,5,3200.0,77777,9,999999999,6,0.0960,0,88,0.094,0.0,0.0 +2016,11,29,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-4.4,43,102014,0,0,281,0,0,0,0,0,0,0,230,2.6,3,3,3200.0,77777,9,999999999,6,0.0960,0,88,0.094,0.0,0.0 +2016,11,29,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-3.9,47,102084,0,0,279,0,0,0,0,0,0,0,230,3.1,3,3,3200.0,77777,9,999999999,7,0.0960,0,88,0.094,0.0,0.0 +2016,11,29,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.1,-3.9,47,102084,0,0,268,0,0,0,0,0,0,0,230,3.1,0,0,3200.0,77777,9,999999999,7,0.0960,0,88,0.094,0.0,0.0 +2016,11,29,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-3.3,51,102134,0,0,266,0,0,0,0,0,0,0,330,1.5,0,0,3200.0,77777,9,999999999,7,0.0960,0,88,0.094,0.0,0.0 +2016,11,29,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-3.3,57,102173,0,0,260,0,0,0,0,0,0,0,290,2.6,0,0,3200.0,77777,9,999999999,7,0.0960,0,88,0.094,0.0,0.0 +2016,11,29,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.9,-3.3,57,102173,0,0,260,0,0,0,0,0,0,0,290,2.6,0,0,3200.0,77777,9,999999999,7,0.0960,0,88,0.094,0.0,0.0 +2016,11,29,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-2.8,63,102233,0,0,258,0,0,0,0,0,0,0,360,1.5,0,0,3200.0,77777,9,999999999,8,0.0960,0,88,0.094,0.0,0.0 +2016,11,30,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-2.2,68,102243,0,0,257,0,0,0,0,0,0,0,145,0.0,0,0,3200.0,77777,9,999999999,8,0.0960,0,88,0.094,0.0,0.0 +2016,11,30,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,-2.2,68,102243,0,0,257,0,0,0,0,0,0,0,154,0.0,0,0,3200.0,77777,9,999999999,8,0.0960,0,88,0.094,0.0,0.0 +2016,11,30,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-0.6,81,102223,0,0,256,0,0,0,0,0,0,0,200,1.5,0,0,3200.0,77777,9,999999999,9,0.0960,0,88,0.094,0.0,0.0 +2016,11,30,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,0.0,85,102193,0,0,256,0,0,0,0,0,0,0,120,1.5,0,0,3200.0,77777,9,999999999,10,0.0960,0,88,0.094,0.0,0.0 +2016,11,30,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.2,0.0,85,102193,0,0,268,0,0,0,0,0,0,0,120,1.5,3,3,3200.0,77777,9,999999999,10,0.0960,0,88,0.094,0.0,0.0 +2016,11,30,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,0.6,82,102243,0,0,301,0,0,0,0,0,0,0,130,2.1,10,10,3200.0,1676,9,999999999,11,0.0960,0,88,0.094,0.0,0.0 +2016,11,30,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,1.7,83,102233,0,0,307,0,0,0,0,0,0,0,160,2.6,10,10,3200.0,1676,9,999999999,12,0.0960,0,88,0.094,0.0,0.0 +2016,11,30,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,4.4,1.7,83,102233,131,787,307,0,0,0,0,0,0,0,160,2.6,10,10,3200.0,1676,9,999999999,12,0.0960,0,88,0.094,0.0,0.0 +2016,11,30,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,3.3,79,102174,333,1406,320,2,0,2,198,0,199,93,140,4.1,10,10,3200.0,4267,9,999999999,14,0.0960,0,88,0.094,0.0,0.0 +2016,11,30,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,3.3,76,102084,488,1406,322,3,0,3,300,0,303,147,140,4.1,10,10,3200.0,1829,9,999999999,14,0.0960,0,88,0.094,0.0,0.0 +2016,11,30,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.2,3.3,76,102084,587,1406,322,10,0,10,1009,0,1017,503,140,4.1,10,10,3200.0,1829,0,919999999,14,0.0960,0,88,0.094,0.0,0.0 +2016,11,30,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,6.7,5.6,93,101964,622,1406,322,52,0,52,5256,0,5300,2483,130,4.6,10,10,6437.0,1676,0,919999999,17,0.0960,0,88,0.094,0.0,0.0 +2016,11,30,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,6.7,97,101854,592,1406,326,33,0,33,3326,0,3353,1602,150,3.6,10,10,6437.0,1829,0,919999999,19,0.0960,0,88,0.094,0.0,0.0 +2016,11,30,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.2,6.7,97,101854,497,1406,326,57,0,57,5700,0,5746,2519,150,3.6,10,10,6437.0,1829,0,919999999,19,0.0960,0,88,0.094,0.0,0.0 +2016,11,30,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,8.9,97,101615,345,1406,338,47,0,47,4636,0,4671,1907,170,6.2,10,10,6437.0,335,0,919999999,24,0.0960,0,88,0.094,0.0,0.0 +2016,11,30,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,10.0,9.4,96,101505,146,1406,342,23,0,23,2231,0,2246,839,170,7.7,10,10,9656.0,335,0,919999999,25,0.0960,0,88,0.094,0.0,0.0 +2016,11,30,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,10.0,9.4,96,101505,0,887,342,0,0,0,0,0,0,0,170,7.7,10,10,9000.0,335,0,919999999,25,0.0960,0,88,0.094,0.0,0.0 +2016,11,30,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,11.1,100,101155,0,0,349,0,0,0,0,0,0,0,170,8.8,10,10,9000.0,305,0,919999999,30,0.0960,0,88,0.094,0.0,0.0 +2016,11,30,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,13.2,13.0,99,101049,0,0,356,0,0,0,0,0,0,0,187,6.6,10,10,6437.0,305,0,919999999,36,0.0960,0,88,0.094,0.0,0.0 +2016,11,30,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,13.6,13.5,99,101002,0,0,356,0,0,0,0,0,0,0,197,5.4,10,10,6000.0,305,0,919999999,38,0.0960,0,88,0.094,5.0,0.0 +2016,11,30,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.1,13.9,98,101064,0,0,369,0,0,0,0,0,0,0,210,4.3,10,10,6000.0,244,0,919999999,39,0.0960,0,88,0.094,5.0,0.0 +2016,11,30,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.2,9.3,88,101309,0,0,366,0,0,0,0,0,0,0,217,5.0,10,10,6000.0,335,0,919999999,25,0.0960,0,88,0.094,0.9,0.0 +2016,11,30,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.5,4.8,77,101663,0,0,366,0,0,0,0,0,0,0,222,5.8,10,10,6000.0,335,0,919999999,16,0.0960,0,88,0.094,0.0,0.0 +2016,11,30,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.4,0.2,69,102075,0,0,369,0,0,0,0,0,0,0,255,5.7,10,10,6000.0,1158,0,919999999,10,0.0960,0,88,0.094,0.0,0.0 +2012,12,1,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.1,-4.6,59,102403,0,0,286,0,0,0,0,0,0,0,290,5.5,9,9,8000.0,1829,9,999999999,6,0.0950,0,88,0.099,0.0,0.0 +2012,12,1,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.7,-4.7,60,102486,0,0,286,0,0,0,0,0,0,0,322,4.8,9,9,8000.0,1829,9,999999999,6,0.0950,0,88,0.099,0.0,0.0 +2012,12,1,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-5.0,61,102623,0,0,266,0,0,0,0,0,0,0,352,4.1,5,5,8000.0,77777,9,999999999,6,0.0950,0,88,0.099,0.0,0.0 +2012,12,1,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-6.1,57,102735,0,0,263,0,0,0,0,0,0,0,355,4.8,5,5,8000.0,77777,9,999999999,5,0.0950,0,88,0.099,0.0,0.0 +2012,12,1,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.1,-7.1,54,102823,0,0,286,0,0,0,0,0,0,0,352,5.3,10,10,8000.0,77777,9,999999999,5,0.0950,0,88,0.099,0.0,0.0 +2012,12,1,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.3,-9.1,47,102955,0,0,283,0,0,0,0,0,0,0,350,5.4,10,10,8000.0,1829,9,999999999,4,0.0950,0,88,0.099,0.0,0.0 +2012,12,1,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-8.9,49,102942,0,0,275,0,0,0,0,0,0,0,350,6.2,10,10,8000.0,1219,9,999999999,4,0.0950,0,88,0.099,0.0,0.0 +2012,12,1,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-0.6,-8.9,49,102942,127,761,275,18,21,16,2107,0,1875,601,350,6.2,10,10,8000.0,1219,9,999999999,4,0.0950,0,88,0.099,0.0,0.0 +2012,12,1,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-12.8,35,103122,328,1407,271,74,81,59,8493,2804,6789,2258,350,4.6,10,10,8000.0,4267,9,999999999,3,0.0950,0,88,0.099,0.0,0.0 +2012,12,1,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-14.4,31,103192,484,1407,267,166,191,112,18867,11767,12777,4314,350,4.6,10,10,8000.0,4572,9,999999999,2,0.0950,0,88,0.099,0.0,0.0 +2012,12,1,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-1.1,-14.4,31,103192,583,1407,267,210,153,156,23753,11274,17723,6004,350,4.6,10,10,8000.0,4572,9,999999999,2,0.0950,0,88,0.099,0.0,0.0 +2012,12,1,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-15.0,27,103132,619,1407,263,319,401,147,36523,28976,16901,5950,358,2.6,9,9,8000.0,3048,9,999999999,2,0.0950,0,88,0.099,0.0,0.0 +2012,12,1,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-14.4,27,103142,588,1407,266,272,262,159,30753,19477,18057,6114,357,0.0,9,9,8000.0,1067,9,999999999,2,0.0950,0,88,0.099,0.0,0.0 +2012,12,1,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.6,-14.4,27,103142,494,1407,266,193,83,161,21347,6129,17891,5521,357,0.0,9,9,8000.0,1067,9,999999999,2,0.0950,0,88,0.099,0.0,0.0 +2012,12,1,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-15.6,24,103152,343,1407,265,142,69,120,15450,3977,13113,3677,10,1.5,9,9,8000.0,4877,9,999999999,2,0.0950,0,88,0.099,0.0,0.0 +2012,12,1,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-13.3,33,103232,145,1407,263,73,37,64,7708,542,6786,1538,60,2.6,9,9,8000.0,4877,9,999999999,3,0.0950,0,88,0.099,0.0,0.0 +2012,12,1,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-0.6,-13.3,33,103232,0,877,270,0,0,0,0,0,0,0,60,2.6,10,10,8000.0,4877,9,999999999,3,0.0950,0,88,0.099,0.0,0.0 +2012,12,1,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-10.0,45,103292,0,0,274,0,0,0,0,0,0,0,40,2.6,10,10,8000.0,1189,9,999999999,4,0.0950,0,88,0.099,0.0,0.0 +2012,12,1,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-9.4,47,103352,0,0,274,0,0,0,0,0,0,0,20,4.1,10,10,8000.0,1372,9,999999999,4,0.0950,0,88,0.099,0.0,0.0 +2012,12,1,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-0.6,-9.4,47,103352,0,0,274,0,0,0,0,0,0,0,20,4.1,10,10,8000.0,1372,9,999999999,4,0.0950,0,88,0.099,0.0,0.0 +2012,12,1,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-11.1,39,103432,0,0,275,0,0,0,0,0,0,0,10,3.1,10,10,8000.0,1311,9,999999999,3,0.0950,0,88,0.099,0.0,0.0 +2012,12,1,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-9.4,45,103402,0,0,277,0,0,0,0,0,0,0,30,3.1,10,10,8000.0,1311,9,999999999,4,0.0950,0,88,0.099,0.0,0.0 +2012,12,1,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.0,-9.4,45,103402,0,0,277,0,0,0,0,0,0,0,30,3.1,10,10,8000.0,1311,9,999999999,4,0.0950,0,88,0.099,0.0,0.0 +2012,12,1,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-10.0,43,103432,0,0,276,0,0,0,0,0,0,0,10,3.6,10,10,8000.0,1402,9,999999999,4,0.0950,0,88,0.099,0.0,0.0 +2012,12,2,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-10.6,42,103442,0,0,273,0,0,0,0,0,0,0,10,4.1,10,10,8000.0,1402,9,999999999,4,0.0940,0,88,0.099,0.0,0.0 +2012,12,2,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-0.6,-10.6,42,103442,0,0,273,0,0,0,0,0,0,0,10,4.1,10,10,8000.0,1402,9,999999999,4,0.0940,0,88,0.099,0.0,0.0 +2012,12,2,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-10.0,45,103482,0,0,274,0,0,0,0,0,0,0,10,4.6,10,10,8000.0,1219,9,999999999,4,0.0940,0,88,0.099,0.0,0.0 +2012,12,2,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-9.4,49,103432,0,0,272,0,0,0,0,0,0,0,360,3.6,10,10,8000.0,1981,9,999999999,4,0.0940,0,88,0.099,0.0,0.0 +2012,12,2,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-1.1,-9.4,49,103432,0,0,272,0,0,0,0,0,0,0,360,3.6,10,10,8000.0,1981,9,999999999,4,0.0940,0,88,0.099,0.0,0.0 +2012,12,2,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-10.0,49,103492,0,0,269,0,0,0,0,0,0,0,10,4.6,10,10,8000.0,1372,9,999999999,4,0.0940,0,88,0.099,0.0,0.0 +2012,12,2,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-8.3,57,103582,0,0,271,0,0,0,0,0,0,0,350,3.6,10,10,8000.0,1036,0,999099999,4,0.0940,0,88,0.099,0.0,0.0 +2012,12,2,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-1.7,-8.3,57,103582,122,735,271,17,22,16,1984,0,1870,597,350,3.6,10,10,8000.0,1036,0,999099999,4,0.0940,0,88,0.099,0.0,0.0 +2012,12,2,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-2.0,-7.0,65,101278,324,1407,235,103,136,74,11582,5268,8348,2660,330,2.6,0,0,4023.0,640,0,999099999,5,0.0940,0,88,0.099,0.0,0.0 +2012,12,2,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-2.0,-6.0,71,101278,480,1407,272,101,107,74,11838,5430,8698,3111,310,3.6,10,10,3219.0,579,0,999099999,6,0.0940,0,88,0.099,0.0,0.0 +2012,12,2,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-1.7,-5.0,76,103692,579,1407,275,131,75,110,15205,4703,12813,4625,330,2.1,10,10,3200.0,579,0,999099999,6,0.0940,0,88,0.099,0.0,0.0 +2012,12,2,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-1.0,-4.0,78,101278,615,1407,278,60,0,60,6080,0,6130,2818,330,3.1,10,10,1609.0,396,0,999099999,7,0.0940,0,88,0.099,0.0,0.0 +2012,12,2,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-1.1,-3.3,83,103492,585,1407,279,57,0,57,5761,0,5808,2650,340,2.6,10,10,2012.0,335,0,999099999,7,0.0940,0,88,0.099,0.0,0.0 +2012,12,2,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-1.1,-3.3,83,103492,492,1407,279,62,0,62,6219,0,6268,2701,340,2.6,10,10,2000.0,335,0,999099999,7,0.0940,0,88,0.099,0.0,0.0 +2012,12,2,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-1.1,-2.8,87,103462,341,1407,279,72,0,72,7132,0,7185,2665,330,3.6,10,10,2012.0,305,0,999099999,8,0.0940,0,88,0.099,0.0,0.0 +2012,12,2,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-1.0,-3.0,85,101278,143,1407,279,79,114,64,8318,1454,6767,1522,330,3.6,10,10,9656.0,305,0,999099999,7,0.0940,0,88,0.099,0.0,0.0 +2012,12,2,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-1.1,-2.8,87,103472,0,867,279,0,0,0,0,0,0,0,340,2.6,10,10,9656.0,305,0,999099999,8,0.0940,0,88,0.099,0.0,0.0 +2012,12,2,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.0,-3.0,85,101278,0,0,279,0,0,0,0,0,0,0,30,3.1,10,10,9656.0,549,0,999099999,7,0.0940,0,88,0.099,0.0,0.0 +2012,12,2,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.0,-2.0,92,101278,0,0,280,0,0,0,0,0,0,0,350,2.6,10,10,9656.0,305,0,919099999,8,0.0940,0,88,0.099,0.0,0.0 +2012,12,2,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-0.6,-2.2,88,103452,0,0,282,0,0,0,0,0,0,0,10,2.1,10,10,9656.0,305,9,999999999,8,0.0940,0,88,0.097,1.0,0.0 +2012,12,2,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-2.2,83,103402,0,0,284,0,0,0,0,0,0,0,310,2.6,10,10,9656.0,213,9,999999999,8,0.0940,0,88,0.097,0.0,0.0 +2012,12,2,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-2.0,85,101278,0,0,285,0,0,0,0,0,0,0,340,3.1,10,10,9656.0,427,9,999999999,8,0.0940,0,88,0.097,0.0,0.0 +2012,12,2,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.0,-2.2,83,103352,0,0,284,0,0,0,0,0,0,0,350,2.1,10,10,9656.0,427,9,999999999,8,0.0940,0,88,0.097,0.0,0.0 +2012,12,2,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-1.7,87,103252,0,0,285,0,0,0,0,0,0,0,340,2.1,10,10,9656.0,518,9,999999999,9,0.0940,0,88,0.097,0.0,0.0 +2012,12,3,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-1.7,87,103182,0,0,285,0,0,0,0,0,0,0,330,3.1,10,10,9656.0,732,9,999999999,9,0.0930,0,88,0.097,0.0,0.0 +2012,12,3,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.0,-1.7,87,103182,0,0,285,0,0,0,0,0,0,0,330,3.1,10,10,9656.0,732,9,999999999,9,0.0930,0,88,0.097,0.0,0.0 +2012,12,3,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,0.0,-2.0,85,101278,0,0,285,0,0,0,0,0,0,0,320,2.1,10,10,9656.0,183,0,919999999,8,0.0930,0,88,0.097,0.0,0.0 +2012,12,3,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,0.0,-1.7,87,103062,0,0,285,0,0,0,0,0,0,0,310,3.1,10,10,9656.0,610,0,919999999,9,0.0930,0,88,0.097,0.0,0.0 +2012,12,3,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,0.0,-1.7,87,103062,0,0,285,0,0,0,0,0,0,0,310,3.1,10,10,9000.0,610,0,919999999,9,0.0930,0,88,0.097,0.0,0.0 +2012,12,3,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,0.6,-1.7,83,102923,0,0,287,0,0,0,0,0,0,0,330,2.1,10,10,9656.0,457,0,919999999,9,0.0930,0,88,0.097,0.0,0.0 +2012,12,3,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.0,-2.0,79,101278,0,0,289,0,0,0,0,0,0,0,330,2.6,10,10,9656.0,213,0,919999999,8,0.0930,0,88,0.097,0.0,0.0 +2012,12,3,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,0.6,-1.1,87,102873,118,710,288,4,0,4,389,0,391,165,280,2.6,10,10,9000.0,213,0,919999999,9,0.0930,0,88,0.097,0.0,0.0 +2012,12,3,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.0,-1.0,86,101278,320,1408,290,31,0,31,3064,0,3087,1300,290,3.1,10,10,4023.0,213,0,919999999,9,0.0930,0,88,0.097,0.0,0.0 +2012,12,3,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.3,1.1,85,102703,476,1408,302,111,38,99,12682,2090,11350,3907,193,0.0,10,10,4023.0,152,0,919999999,11,0.0930,0,88,0.097,0.0,0.0 +2012,12,3,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,3.3,1.1,85,102703,576,1408,302,200,121,153,22558,8467,17333,5880,196,0.0,10,10,4000.0,152,0,919999999,11,0.0930,0,88,0.097,0.0,0.0 +2012,12,3,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,5.0,3.3,89,102473,612,1408,312,266,224,172,29923,16409,19439,6590,193,0.0,10,10,2816.0,152,0,919999999,14,0.0930,0,88,0.097,0.0,0.0 +2012,12,3,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,6.0,4.0,87,101279,582,1408,317,212,86,176,23652,6342,19730,6484,189,0.0,10,10,2816.0,945,0,919999999,15,0.0930,0,88,0.097,0.0,0.0 +2012,12,3,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,7.2,5.0,86,102344,489,1408,315,199,122,153,21984,8218,16981,5324,186,0.0,9,9,2800.0,945,0,919999999,16,0.0930,0,88,0.097,0.0,0.0 +2012,12,3,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.8,5.0,82,102114,339,1408,326,172,191,112,18716,9559,12240,3523,188,0.0,10,10,6437.0,5100,0,919999999,16,0.0930,0,88,0.097,0.0,0.0 +2012,12,3,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,6.0,4.0,87,101279,141,1408,317,83,85,60,8761,624,6360,1487,130,2.1,10,10,6437.0,427,0,919999999,15,0.0930,0,88,0.097,0.0,0.0 +2012,12,3,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.7,4.4,85,102044,0,859,312,0,0,0,0,0,0,0,189,0.0,9,9,6437.0,427,0,919999999,15,0.0930,0,88,0.097,0.0,0.0 +2012,12,3,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,6.7,86,101914,0,0,334,0,0,0,0,0,0,0,200,2.6,10,10,6437.0,4267,0,919999999,19,0.0930,0,88,0.097,0.0,0.0 +2012,12,3,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,6.7,74,101875,0,0,344,0,0,0,0,0,0,0,220,5.7,10,10,6437.0,4877,0,919999999,19,0.0930,0,88,0.097,0.0,0.0 +2012,12,3,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.1,6.7,74,101875,0,0,344,0,0,0,0,0,0,0,220,5.7,10,10,6437.0,4877,9,999999999,19,0.0930,0,88,0.097,0.0,0.0 +2012,12,3,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,6.1,74,101745,0,0,341,0,0,0,0,0,0,0,190,6.7,10,10,6437.0,2134,0,919999999,18,0.0930,0,88,0.097,0.0,0.0 +2012,12,3,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,6.7,77,101785,0,0,342,0,0,0,0,0,0,0,220,8.8,10,10,6437.0,3658,0,919999999,19,0.0930,0,88,0.097,0.0,0.0 +2012,12,3,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.6,6.7,77,101785,0,0,342,0,0,0,0,0,0,0,220,8.7,10,10,6437.0,3658,0,919999999,19,0.0930,0,88,0.097,0.0,0.0 +2012,12,3,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.6,7.8,83,101675,0,0,343,0,0,0,0,0,0,0,230,6.2,10,10,6437.0,2438,0,919999999,21,0.0930,0,88,0.097,0.0,0.0 +2012,12,4,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.0,8.0,82,101280,0,0,345,0,0,0,0,0,0,0,240,5.7,10,10,6437.0,610,0,919999999,22,0.0930,0,88,0.097,0.0,0.0 +2012,12,4,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.6,7.8,83,101655,0,0,310,0,0,0,0,0,0,0,250,7.2,3,3,6437.0,610,0,919999999,21,0.0930,0,88,0.097,0.0,0.0 +2012,12,4,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,7.2,83,101645,0,0,330,0,0,0,0,0,0,0,240,4.1,9,9,6437.0,1036,0,919999999,20,0.0930,0,88,0.097,0.0,0.0 +2012,12,4,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,7.2,83,101655,0,0,330,0,0,0,0,0,0,0,250,5.1,9,9,6437.0,4877,0,919999999,20,0.0930,0,88,0.097,0.0,0.0 +2012,12,4,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,10.0,7.2,83,101655,0,0,312,0,0,0,0,0,0,0,250,5.1,5,5,6437.0,4877,0,919999999,20,0.0930,0,88,0.097,0.0,0.0 +2012,12,4,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,6.7,83,101745,0,0,308,0,0,0,0,0,0,0,250,4.1,5,5,6437.0,77777,0,919999999,19,0.0930,0,88,0.097,0.0,0.0 +2012,12,4,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,8.9,6.7,86,101784,0,0,306,0,0,0,0,0,0,0,240,5.7,5,5,9656.0,77777,0,919999999,19,0.0930,0,88,0.097,0.0,0.0 +2012,12,4,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,8.9,6.7,86,101784,114,685,302,24,135,14,2805,0,1638,526,240,5.7,3,3,9000.0,77777,0,919999999,19,0.0930,0,88,0.097,0.0,0.0 +2012,12,4,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,7.2,77,101925,316,1408,312,121,395,41,14169,8346,4811,1654,260,5.7,3,3,9000.0,77777,0,919999999,20,0.0930,0,88,0.097,0.0,0.0 +2012,12,4,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,6.7,66,101975,472,1408,324,245,627,66,28819,27758,7784,2810,300,7.7,5,5,9000.0,77777,0,919999999,19,0.0930,0,88,0.097,0.0,0.0 +2012,12,4,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,6.7,66,101975,572,1408,324,335,686,83,39556,36410,9830,3653,300,7.7,5,5,9000.0,77777,0,919999999,19,0.0930,0,88,0.097,0.0,0.0 +2012,12,4,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,3.9,51,101925,609,1408,325,394,738,86,46783,41382,10242,3853,320,6.7,5,5,9000.0,77777,0,919999999,14,0.0930,0,88,0.097,0.0,0.0 +2012,12,4,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,3.9,49,101965,580,1408,328,411,803,77,48939,42806,9194,3443,310,4.6,5,5,9000.0,77777,0,919999999,14,0.0930,0,88,0.097,0.0,0.0 +2012,12,4,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,3.9,49,101965,487,1408,328,362,773,72,42483,37008,8473,3057,310,4.6,5,5,9000.0,77777,0,919999999,14,0.0930,0,88,0.097,0.0,0.0 +2012,12,4,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,3.9,51,102045,337,1408,325,264,690,62,30151,22625,7101,2369,310,4.1,5,5,9000.0,77777,0,919999999,14,0.0930,0,88,0.097,0.0,0.0 +2012,12,4,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,3.9,55,102135,140,1408,320,137,501,43,14866,0,4682,1284,330,3.6,5,5,9000.0,77777,0,919999999,15,0.0930,0,88,0.097,0.0,0.0 +2012,12,4,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,3.9,55,102135,0,852,320,0,0,0,0,0,0,0,330,3.6,5,5,9000.0,77777,0,919999999,15,0.0930,0,88,0.097,0.0,0.0 +2012,12,4,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,3.3,63,102294,0,0,307,0,0,0,0,0,0,0,360,2.1,5,5,9000.0,77777,0,919999999,14,0.0930,0,88,0.097,0.0,0.0 +2012,12,4,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,3.3,68,102384,0,0,303,0,0,0,0,0,0,0,60,1.5,5,5,9000.0,77777,0,919999999,14,0.0930,0,88,0.097,0.0,0.0 +2012,12,4,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,3.3,68,102384,0,0,286,0,0,0,0,0,0,0,60,1.5,0,0,9000.0,77777,9,999999999,14,0.0930,0,88,0.097,0.0,0.0 +2012,12,4,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,2.2,79,102494,0,0,271,0,0,0,0,0,0,0,30,3.1,0,0,9000.0,77777,9,999999999,12,0.0930,0,88,0.097,0.0,0.0 +2012,12,4,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,2.2,79,102524,0,0,271,0,0,0,0,0,0,0,30,2.1,0,0,9000.0,77777,9,999999999,12,0.0930,0,88,0.097,0.0,0.0 +2012,12,4,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,2.2,79,102524,0,0,271,0,0,0,0,0,0,0,30,2.1,0,0,9000.0,77777,9,999999999,12,0.0930,0,88,0.097,0.0,0.0 +2012,12,4,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,2.2,79,102544,0,0,271,0,0,0,0,0,0,0,360,2.1,0,0,9000.0,77777,9,999999999,12,0.0930,0,88,0.097,0.0,0.0 +2012,12,5,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,2.2,82,102553,0,0,269,0,0,0,0,0,0,0,56,0.0,0,0,9000.0,77777,9,999999999,12,0.0920,0,88,0.097,0.0,0.0 +2012,12,5,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,2.2,82,102553,0,0,302,0,0,0,0,0,0,0,73,0.0,9,9,9000.0,77777,9,999999999,12,0.0920,0,88,0.097,0.0,0.0 +2012,12,5,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,3.3,89,102553,0,0,312,0,0,0,0,0,0,0,96,0.0,10,10,9000.0,549,9,999999999,14,0.0920,0,88,0.097,0.0,0.0 +2012,12,5,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,3.3,89,102563,0,0,312,0,0,0,0,0,0,0,124,0.0,10,10,9000.0,488,9,999999999,14,0.0920,0,88,0.097,0.0,0.0 +2012,12,5,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.0,3.3,89,102563,0,0,303,0,0,0,0,0,0,0,149,0.0,9,9,9000.0,488,9,999999999,14,0.0920,0,88,0.097,0.0,0.0 +2012,12,5,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.0,3.0,93,101279,0,0,307,0,0,0,0,0,0,0,163,0.0,10,10,9000.0,427,9,999999999,13,0.0920,0,88,0.097,0.0,0.0 +2012,12,5,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,3.0,87,101279,0,0,311,0,0,0,0,0,0,0,169,0.0,10,10,9000.0,244,9,999999999,13,0.0920,0,88,0.097,0.0,0.0 +2012,12,5,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.0,3.3,89,102623,110,661,312,5,0,5,485,0,488,204,160,1.5,10,10,9000.0,244,0,999999999,14,0.0920,0,88,0.097,0.0,0.0 +2012,12,5,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,5.0,4.0,93,101279,312,1409,285,25,0,25,2465,0,2483,1064,170,2.1,4,4,402.0,61,0,999999999,15,0.0920,0,88,0.097,0.0,0.0 +2012,12,5,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,6.0,4.0,87,101279,468,1409,317,49,0,49,4894,0,4933,2163,160,2.6,10,10,402.0,61,0,999999999,15,0.0920,0,88,0.097,0.0,0.0 +2012,12,5,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,6.1,5.0,93,102604,569,1409,319,54,0,54,5435,0,5480,2500,180,1.5,10,10,9000.0,61,0,919999999,16,0.0920,0,88,0.097,0.0,0.0 +2012,12,5,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.0,6.0,93,101279,606,1409,324,58,0,58,5853,0,5902,2719,160,2.6,10,10,8047.0,914,0,919999999,18,0.0920,0,88,0.097,0.0,0.0 +2012,12,5,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,8.0,7.0,93,101280,577,1409,330,60,0,60,6038,0,6088,2761,160,2.1,10,10,9656.0,853,0,919999999,20,0.0920,0,88,0.097,0.0,0.0 +2012,12,5,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,8.3,7.2,93,102294,485,1409,331,59,0,59,5892,0,5939,2574,160,3.1,10,10,8000.0,853,0,919999999,20,0.0920,0,88,0.097,0.0,0.0 +2012,12,5,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,10.0,9.0,93,101280,335,1409,341,48,0,48,4730,0,4766,1923,190,3.6,10,10,8000.0,914,0,919999999,24,0.0920,0,88,0.097,0.0,0.0 +2012,12,5,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.0,9.0,87,101280,138,1409,346,41,63,35,4513,0,3863,1127,200,3.1,10,10,8000.0,396,0,919999999,24,0.0920,0,88,0.097,0.0,0.0 +2012,12,5,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,11.1,9.4,89,102135,0,846,347,0,0,0,0,0,0,0,200,3.1,10,10,9000.0,396,0,919999999,25,0.0920,0,88,0.097,0.0,0.0 +2012,12,5,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.0,10.0,94,101280,0,0,347,0,0,0,0,0,0,0,190,4.6,10,10,9000.0,457,0,919999999,27,0.0920,0,88,0.097,0.0,0.0 +2012,12,5,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.0,11.0,94,101280,0,0,353,0,0,0,0,0,0,0,200,5.1,10,10,9000.0,396,0,919999999,29,0.0920,0,88,0.097,0.0,0.0 +2012,12,5,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,10.6,93,101965,0,0,352,0,0,0,0,0,0,0,200,4.1,10,10,9000.0,396,9,999999999,28,0.0920,0,88,0.097,0.0,0.0 +2012,12,5,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,11.1,89,101745,0,0,358,0,0,0,0,0,0,0,200,6.7,10,10,9000.0,457,9,999999999,30,0.0920,0,88,0.097,0.0,0.0 +2012,12,5,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.0,11.0,88,101280,0,0,358,0,0,0,0,0,0,0,200,8.2,10,10,9000.0,396,9,999999999,29,0.0920,0,88,0.097,0.0,0.0 +2012,12,5,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,11.7,90,101645,0,0,361,0,0,0,0,0,0,0,200,7.7,10,10,9000.0,396,9,999999999,32,0.0920,0,88,0.097,0.0,0.0 +2012,12,5,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,12.2,89,101475,0,0,364,0,0,0,0,0,0,0,210,6.2,10,10,9000.0,396,9,999999999,33,0.0920,0,88,0.097,0.0,0.0 +2012,12,6,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.0,12.0,88,101280,0,0,365,0,0,0,0,0,0,0,210,7.2,10,10,9000.0,457,9,999999999,32,0.0910,0,88,0.097,0.0,0.0 +2012,12,6,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.9,11.7,87,101355,0,0,354,0,0,0,0,0,0,0,210,7.2,9,9,9000.0,457,9,999999999,31,0.0910,0,88,0.097,0.0,0.0 +2012,12,6,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.0,12.0,94,101280,0,0,325,0,0,0,0,0,0,0,200,6.2,3,3,9000.0,77777,9,999999999,32,0.0910,0,88,0.097,0.0,0.0 +2012,12,6,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,11.1,93,101025,0,0,321,0,0,0,0,0,0,0,200,6.2,3,3,9000.0,77777,9,999999999,30,0.0910,0,88,0.097,0.0,0.0 +2012,12,6,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,11.1,93,101025,0,0,345,0,0,0,0,0,0,0,200,6.2,9,9,9000.0,77777,9,999999999,30,0.0910,0,88,0.097,0.0,0.0 +2012,12,6,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.0,11.0,88,101280,0,0,358,0,0,0,0,0,0,0,240,6.7,10,10,9000.0,853,9,999999999,29,0.0910,0,88,0.097,0.0,0.0 +2012,12,6,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.0,11.0,88,101280,0,0,358,0,0,0,0,0,0,0,250,3.6,10,10,9000.0,1402,0,919999999,29,0.0910,0,88,0.097,0.0,0.0 +2012,12,6,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,10.0,80,101095,106,637,359,2,0,2,193,0,195,84,270,5.1,10,10,9000.0,1402,0,919999999,26,0.0910,0,88,0.097,0.0,0.0 +2012,12,6,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,6.1,66,101225,308,1409,339,11,0,11,1083,0,1091,490,290,4.1,9,9,9000.0,2896,0,919999999,18,0.0910,0,88,0.097,0.0,0.0 +2012,12,6,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.2,3.9,57,101275,465,1409,337,145,176,87,16677,8866,10039,3499,310,7.2,9,9,9000.0,6096,0,919999999,14,0.0910,0,88,0.097,0.0,0.0 +2012,12,6,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,12.2,3.9,57,101275,565,1409,318,304,563,85,35815,30652,10044,3710,310,7.2,5,5,9000.0,6096,0,919999999,14,0.0910,0,88,0.097,0.0,0.0 +2012,12,6,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,2.2,48,101195,603,1409,319,304,384,149,34541,26516,17003,5920,300,4.6,5,5,9000.0,77777,0,919999999,12,0.0910,0,88,0.097,0.0,0.0 +2012,12,6,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.7,0.6,46,101185,575,1409,330,303,354,157,34099,25116,17748,5974,300,7.2,9,9,9000.0,7620,0,919999999,10,0.0910,0,88,0.097,0.0,0.0 +2012,12,6,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,11.7,0.6,46,101185,483,1409,330,242,246,150,26774,16750,16671,5215,300,7.2,9,9,9000.0,7620,0,919999999,10,0.0910,0,88,0.097,0.0,0.0 +2012,12,6,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,11.1,-0.6,44,101225,334,1409,326,202,383,96,22268,17616,10624,3201,300,7.2,9,9,9000.0,7620,0,919999999,9,0.0910,0,88,0.097,0.0,0.0 +2012,12,6,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,-2.2,43,101305,137,1409,317,109,301,55,11586,1489,5869,1420,290,9.3,9,9,9000.0,7620,0,919999999,8,0.0910,0,88,0.097,0.0,0.0 +2012,12,6,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,9.4,-2.2,43,101305,0,840,299,0,0,0,0,0,0,0,290,9.3,5,5,9000.0,7620,0,919999999,8,0.0910,0,88,0.097,0.0,0.0 +2012,12,6,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-3.3,47,101534,0,0,304,0,0,0,0,0,0,0,290,7.7,9,9,9000.0,1676,0,919999999,7,0.0910,0,88,0.097,0.0,0.0 +2012,12,6,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-6.1,40,101634,0,0,304,0,0,0,0,0,0,0,310,7.7,10,10,9000.0,1524,0,919999999,5,0.0910,0,88,0.097,0.0,0.0 +2012,12,6,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.6,-6.1,40,101634,0,0,304,0,0,0,0,0,0,0,310,7.7,10,10,9000.0,1524,9,999999999,5,0.0910,0,88,0.097,0.0,0.0 +2012,12,6,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-6.1,45,101774,0,0,297,0,0,0,0,0,0,0,320,9.3,10,10,9000.0,1341,9,999999999,5,0.0910,0,88,0.097,0.0,0.0 +2012,12,6,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-7.2,44,101813,0,0,291,0,0,0,0,0,0,0,320,8.8,10,10,9000.0,1311,9,999999999,5,0.0910,0,88,0.097,0.0,0.0 +2012,12,6,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,-7.2,44,101813,0,0,283,0,0,0,0,0,0,0,320,8.7,9,9,9000.0,1311,9,999999999,5,0.0910,0,88,0.097,0.0,0.0 +2012,12,6,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-10.0,39,102033,0,0,258,0,0,0,0,0,0,0,330,8.2,5,5,9000.0,77777,9,999999999,4,0.0910,0,88,0.097,0.0,0.0 +2012,12,7,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-10.0,41,102063,0,0,256,0,0,0,0,0,0,0,330,9.8,5,5,9000.0,77777,9,999999999,4,0.0900,0,88,0.097,0.0,0.0 +2012,12,7,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-10.0,41,102063,0,0,256,0,0,0,0,0,0,0,330,9.8,5,5,9000.0,77777,9,999999999,4,0.0900,0,88,0.097,0.0,0.0 +2012,12,7,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-8.9,49,102173,0,0,252,0,0,0,0,0,0,0,330,5.7,5,5,9000.0,77777,9,999999999,4,0.0900,0,88,0.097,0.0,0.0 +2012,12,7,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-8.9,49,102203,0,0,238,0,0,0,0,0,0,0,330,5.1,0,0,9000.0,77777,9,999999999,4,0.0900,0,88,0.097,0.0,0.0 +2012,12,7,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-8.9,49,102203,0,0,238,0,0,0,0,0,0,0,330,5.1,0,0,9000.0,77777,9,999999999,4,0.0900,0,88,0.097,0.0,0.0 +2012,12,7,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-9.4,49,102402,0,0,236,0,0,0,0,0,0,0,320,6.2,0,0,9000.0,77777,9,999999999,4,0.0900,0,88,0.097,0.0,0.0 +2012,12,7,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-8.9,51,102462,0,0,237,0,0,0,0,0,0,0,330,5.7,0,0,9000.0,77777,9,999999999,4,0.0900,0,88,0.097,0.0,0.0 +2012,12,7,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-8.9,51,102462,102,614,251,26,201,12,3064,0,1415,452,330,5.7,5,5,9000.0,77777,9,999999999,4,0.0900,0,88,0.097,0.0,0.0 +2012,12,7,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-8.9,47,102603,304,1409,255,130,508,32,15525,10504,3827,1321,320,4.6,5,5,9000.0,77777,9,999999999,4,0.0900,0,88,0.097,0.0,0.0 +2012,12,7,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-9.4,41,102633,461,1409,258,262,766,51,31479,33858,6140,2231,340,5.7,5,5,9000.0,77777,9,999999999,4,0.0900,0,88,0.097,0.0,0.0 +2012,12,7,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-9.4,41,102633,562,1409,254,370,865,58,39162,82480,8831,1262,340,5.7,3,3,9000.0,77777,9,999999999,4,0.0900,0,88,0.097,0.0,0.0 +2012,12,7,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-9.4,37,102503,600,1409,261,429,901,62,45352,86713,9364,1338,320,4.1,3,3,9000.0,77777,9,999999999,4,0.0900,0,88,0.097,0.0,0.0 +2012,12,7,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-9.4,35,102443,572,1409,263,432,901,62,45644,86103,9396,1293,270,3.1,3,3,9000.0,77777,9,999999999,4,0.0900,0,88,0.097,0.0,0.0 +2012,12,7,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-9.4,35,102443,481,1409,263,381,870,58,45535,41223,6947,2530,270,3.1,3,3,9000.0,77777,9,999999999,4,0.0900,0,88,0.097,0.0,0.0 +2012,12,7,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-9.4,33,102463,332,1409,267,280,792,51,32529,25101,5939,2016,280,2.6,3,3,9000.0,77777,9,999999999,4,0.0900,0,88,0.097,0.0,0.0 +2012,12,7,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-10.0,34,102523,136,1409,262,147,611,36,16209,0,3981,1142,280,2.6,3,3,9000.0,77777,9,999999999,4,0.0900,0,88,0.097,0.0,0.0 +2012,12,7,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-10.0,34,102523,0,836,262,0,0,0,0,0,0,0,280,2.6,3,3,9000.0,77777,9,999999999,4,0.0900,0,88,0.097,0.0,0.0 +2012,12,7,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-8.9,41,102543,0,0,257,0,0,0,0,0,0,0,30,2.1,3,3,9000.0,77777,9,999999999,4,0.0900,0,88,0.097,0.0,0.0 +2012,12,7,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-7.8,44,102553,0,0,260,0,0,0,0,0,0,0,318,0.0,3,3,9000.0,77777,9,999999999,5,0.0900,0,88,0.097,0.0,0.0 +2012,12,7,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-7.8,44,102553,0,0,260,0,0,0,0,0,0,0,306,0.0,3,3,9000.0,77777,9,999999999,5,0.0900,0,88,0.097,0.0,0.0 +2012,12,7,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-7.8,48,102573,0,0,256,0,0,0,0,0,0,0,200,2.1,3,3,9000.0,77777,9,999999999,5,0.0900,0,88,0.097,0.0,0.0 +2012,12,7,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-7.8,52,102603,0,0,256,0,0,0,0,0,0,0,230,2.6,5,5,9000.0,77777,9,999999999,5,0.0900,0,88,0.097,0.0,0.0 +2012,12,7,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-7.8,52,102603,0,0,256,0,0,0,0,0,0,0,230,2.6,5,5,9000.0,77777,9,999999999,5,0.0900,0,88,0.097,0.0,0.0 +2012,12,7,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-7.8,57,102572,0,0,252,0,0,0,0,0,0,0,240,2.1,5,5,9000.0,77777,9,999999999,5,0.0900,0,88,0.097,0.0,0.0 +2012,12,8,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-7.2,57,102572,0,0,250,0,0,0,0,0,0,0,230,3.1,3,3,9000.0,77777,9,999999999,5,0.0900,0,88,0.097,0.0,0.0 +2012,12,8,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-7.2,57,102572,0,0,250,0,0,0,0,0,0,0,230,3.1,3,3,9000.0,77777,9,999999999,5,0.0900,0,88,0.097,0.0,0.0 +2012,12,8,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-6.1,63,102483,0,0,251,0,0,0,0,0,0,0,210,3.1,3,3,9000.0,77777,9,999999999,5,0.0900,0,88,0.097,0.0,0.0 +2012,12,8,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-5.6,62,102463,0,0,243,0,0,0,0,0,0,0,210,2.6,0,0,9000.0,77777,9,999999999,6,0.0900,0,88,0.097,0.0,0.0 +2012,12,8,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-5.6,62,102463,0,0,254,0,0,0,0,0,0,0,210,2.6,3,3,9000.0,77777,9,999999999,6,0.0900,0,88,0.097,0.0,0.0 +2012,12,8,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-3.9,69,102403,0,0,285,0,0,0,0,0,0,0,204,0.0,10,10,9000.0,823,9,999999999,7,0.0900,0,88,0.097,0.0,0.0 +2012,12,8,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-3.3,70,102403,0,0,288,0,0,0,0,0,0,0,201,0.0,10,10,9000.0,823,9,999999999,7,0.0900,0,88,0.097,0.0,0.0 +2012,12,8,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.1,-3.3,70,102403,98,591,288,11,0,11,1068,0,1075,416,196,0.0,10,10,9000.0,823,9,999999999,7,0.0900,0,88,0.097,0.0,0.0 +2012,12,8,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-2.8,68,102353,301,1410,293,52,11,50,5984,286,5768,1919,190,2.6,10,10,9000.0,884,9,999999999,8,0.0900,0,88,0.097,0.0,0.0 +2012,12,8,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.0,-3.0,63,101279,458,1410,296,117,51,103,13278,2870,11732,3948,210,2.1,10,10,9000.0,945,9,999999999,7,0.0900,0,88,0.097,0.0,0.0 +2012,12,8,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,-2.8,65,102343,559,1410,296,173,75,146,19534,5203,16556,5598,200,2.1,10,10,9000.0,945,9,999999999,8,0.0900,0,88,0.097,0.0,0.0 +2012,12,8,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-1.7,63,102124,597,1410,304,216,105,173,24245,7875,19509,6512,160,2.6,10,10,9000.0,4877,9,999999999,8,0.0900,0,88,0.097,0.0,0.0 +2012,12,8,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-0.6,67,102064,570,1410,308,261,227,168,29190,16702,18877,6209,170,2.1,10,10,9000.0,6096,9,999999999,9,0.0900,0,88,0.097,0.0,0.0 +2012,12,8,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.0,-0.6,67,102064,479,1410,299,257,331,137,28630,21557,15328,4912,170,2.1,9,9,9000.0,6096,9,999999999,9,0.0900,0,88,0.097,0.0,0.0 +2012,12,8,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,0.6,65,101934,331,1410,316,157,155,103,17185,7431,11321,3317,200,3.1,10,10,9000.0,1463,9,999999999,11,0.0900,0,88,0.097,0.0,0.0 +2012,12,8,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,1.1,67,101914,135,1410,317,70,41,58,7391,257,6150,1429,200,2.6,10,10,9000.0,1463,0,919999999,11,0.0900,0,88,0.097,0.0,0.0 +2012,12,8,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.7,1.1,67,101914,0,832,317,0,0,0,0,0,0,0,200,2.6,10,10,9000.0,1463,0,919999999,11,0.0900,0,88,0.097,0.0,0.0 +2012,12,8,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.0,3.0,81,101279,0,0,316,0,0,0,0,0,0,0,160,2.6,10,10,9000.0,853,0,919999999,13,0.0900,0,88,0.097,0.0,0.0 +2012,12,8,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,3.3,85,101834,0,0,315,0,0,0,0,0,0,0,170,2.6,10,10,9000.0,1036,0,919999999,14,0.0900,0,88,0.097,0.0,0.0 +2012,12,8,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.6,3.3,85,101834,0,0,315,0,0,0,0,0,0,0,170,2.6,10,10,9000.0,1036,0,919999999,14,0.0900,0,88,0.097,5.0,0.0 +2012,12,8,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,3.9,89,101814,0,0,315,0,0,0,0,0,0,0,170,2.1,10,10,9000.0,1189,0,919999999,15,0.0900,0,88,0.097,0.1,0.0 +2012,12,8,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,4.4,92,101764,0,0,316,0,0,0,0,0,0,0,190,2.6,10,10,9000.0,2286,0,919999999,15,0.0900,0,88,0.097,0.0,0.0 +2012,12,8,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.6,4.4,92,101764,0,0,316,0,0,0,0,0,0,0,190,2.6,10,10,9000.0,2286,0,919999999,15,0.0900,0,88,0.097,0.0,0.0 +2012,12,8,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,4.4,89,101684,0,0,318,0,0,0,0,0,0,0,190,2.1,10,10,9000.0,1524,0,919999999,15,0.0900,0,88,0.097,0.0,0.0 +2012,12,9,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.0,5.0,93,101279,0,0,318,0,0,0,0,0,0,0,200,2.1,10,10,9000.0,1128,0,919999999,16,0.0890,0,88,0.097,0.0,0.0 +2012,12,9,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,6.1,5.0,93,101664,0,0,319,0,0,0,0,0,0,0,190,1.5,10,10,9000.0,1128,0,919999999,16,0.0890,0,88,0.097,0.0,0.0 +2012,12,9,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,6.0,5.0,93,101279,0,0,318,0,0,0,0,0,0,0,170,2.1,10,10,8047.0,488,0,919999999,16,0.0890,0,88,0.097,0.0,0.0 +2012,12,9,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,6.1,5.0,93,101614,0,0,319,0,0,0,0,0,0,0,170,2.1,10,10,6437.0,335,0,919999999,16,0.0890,0,88,0.097,0.0,0.0 +2012,12,9,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,6.1,5.0,93,101614,0,0,319,0,0,0,0,0,0,0,170,2.1,10,10,6000.0,335,0,919999999,16,0.0890,0,88,0.097,0.0,0.0 +2012,12,9,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,6.0,6.0,100,101279,0,0,319,0,0,0,0,0,0,0,130,1.5,10,10,4828.0,1311,0,919999999,18,0.0890,0,88,0.097,0.0,0.0 +2012,12,9,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.0,6.0,93,101279,0,0,324,0,0,0,0,0,0,0,110,1.5,10,10,4023.0,152,0,919999999,18,0.0890,0,88,0.097,0.0,0.0 +2012,12,9,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,6.7,5.6,93,101544,94,569,322,8,0,8,774,0,779,311,82,0.0,10,10,3200.0,152,0,919999999,17,0.0890,0,88,0.097,0.0,0.0 +2012,12,9,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.0,6.0,93,101279,297,1410,324,30,0,30,2952,0,2974,1240,60,2.1,10,10,4023.0,610,0,919999999,18,0.0890,0,88,0.097,0.0,0.0 +2012,12,9,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.0,6.0,93,101279,454,1410,324,75,2,75,8699,92,8725,3081,60,3.1,10,10,805.0,122,0,919999999,18,0.0890,0,88,0.097,0.0,0.0 +2012,12,9,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,6.7,6.1,96,101314,556,1410,323,21,0,21,2111,0,2128,1024,50,4.1,10,10,800.0,122,0,919999999,18,0.0890,0,88,0.097,0.0,0.0 +2012,12,9,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.2,6.1,93,101164,595,1410,325,59,0,59,5948,0,5997,2745,360,4.1,10,10,3219.0,183,0,919999999,18,0.0890,0,88,0.097,0.0,0.0 +2012,12,9,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,6.7,5.6,93,101104,568,1410,322,85,0,85,8553,0,8623,3716,340,3.1,10,10,3219.0,152,0,919999999,17,0.0890,0,88,0.097,0.0,0.0 +2012,12,9,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,6.7,5.6,93,101104,478,1410,322,68,0,68,6792,0,6846,2892,340,3.1,10,10,3200.0,152,0,919999999,17,0.0890,0,88,0.097,0.0,0.0 +2012,12,9,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,6.0,5.0,93,101279,330,1410,318,47,0,47,4639,0,4674,1880,10,2.1,10,10,3219.0,122,0,919999999,16,0.0890,0,88,0.097,0.0,0.0 +2012,12,9,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,6.0,5.0,93,101279,135,1410,318,68,165,47,7298,0,5063,1319,360,2.1,10,10,8047.0,152,0,919999999,16,0.0890,0,88,0.097,0.0,0.0 +2012,12,9,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,6.1,5.0,93,101164,0,829,319,0,0,0,0,0,0,0,289,0.0,10,10,8000.0,152,0,919999999,16,0.0890,0,88,0.097,0.0,0.0 +2012,12,9,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,6.1,5.0,93,101184,0,0,319,0,0,0,0,0,0,0,258,0.0,10,10,6437.0,152,0,919999999,16,0.0890,0,88,0.097,0.0,0.0 +2012,12,9,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,6.1,5.6,97,101234,0,0,319,0,0,0,0,0,0,0,242,0.0,10,10,4828.0,152,0,919999999,17,0.0890,0,88,0.097,0.0,0.0 +2012,12,9,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,6.1,5.6,97,101234,0,0,319,0,0,0,0,0,0,0,231,0.0,10,10,4800.0,152,9,999999999,17,0.0890,0,88,0.097,4.0,0.0 +2012,12,9,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,5.6,97,101264,0,0,319,0,0,0,0,0,0,0,200,1.5,10,10,4800.0,305,9,999999999,17,0.0890,0,88,0.097,0.3,0.0 +2012,12,9,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,5.6,93,101314,0,0,322,0,0,0,0,0,0,0,230,3.1,10,10,4800.0,213,9,999999999,17,0.0890,0,88,0.097,0.0,0.0 +2012,12,9,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.7,5.6,93,101314,0,0,313,0,0,0,0,0,0,0,230,3.1,9,9,4800.0,213,9,999999999,17,0.0890,0,88,0.097,0.0,0.0 +2012,12,9,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,6.7,90,101365,0,0,322,0,0,0,0,0,0,0,240,5.1,9,9,4800.0,3962,9,999999999,19,0.0890,0,88,0.097,0.0,0.0 +2012,12,10,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,6.7,86,101425,0,0,324,0,0,0,0,0,0,0,270,3.6,9,9,4800.0,3962,9,999999999,19,0.0880,0,88,0.097,0.0,0.0 +2012,12,10,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.9,6.7,86,101425,0,0,306,0,0,0,0,0,0,0,270,3.6,5,5,4800.0,3962,9,999999999,19,0.0880,0,88,0.097,0.0,0.0 +2012,12,10,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,5.6,83,101614,0,0,298,0,0,0,0,0,0,0,280,4.1,3,3,4800.0,77777,9,999999999,17,0.0880,0,88,0.097,0.0,0.0 +2012,12,10,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,5.6,83,101694,0,0,298,0,0,0,0,0,0,0,270,5.1,3,3,4800.0,77777,9,999999999,17,0.0880,0,88,0.097,0.0,0.0 +2012,12,10,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,5.6,83,101694,0,0,286,0,0,0,0,0,0,0,270,5.1,0,0,4800.0,77777,9,999999999,17,0.0880,0,88,0.097,0.0,0.0 +2012,12,10,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,3.9,80,101954,0,0,279,0,0,0,0,0,0,0,300,3.6,0,0,4800.0,77777,9,999999999,15,0.0880,0,88,0.097,0.0,0.0 +2012,12,10,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,3.3,79,102074,0,0,289,0,0,0,0,0,0,0,300,4.6,3,3,4800.0,77777,9,999999999,14,0.0880,0,88,0.097,0.0,0.0 +2012,12,10,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,3.3,79,102074,91,547,311,11,0,11,1065,0,1072,412,300,4.6,9,9,4800.0,77777,9,999999999,14,0.0880,0,88,0.097,0.0,0.0 +2012,12,10,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,1.7,68,102324,294,1411,311,76,137,49,8729,3194,5642,1874,320,3.1,9,9,4800.0,7620,9,999999999,12,0.0880,0,88,0.097,0.0,0.0 +2012,12,10,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,1.1,67,102414,451,1411,308,132,117,101,14964,6353,11491,3865,350,5.7,9,9,4800.0,7620,9,999999999,11,0.0880,0,88,0.097,0.0,0.0 +2012,12,10,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.7,1.1,67,102414,553,1411,317,190,136,144,21429,9216,16311,5512,350,5.7,10,10,4800.0,7620,9,999999999,11,0.0880,0,88,0.097,0.0,0.0 +2012,12,10,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-1.1,57,102344,592,1411,315,223,127,171,25024,9452,19278,6430,330,5.1,10,10,4800.0,4572,9,999999999,9,0.0880,0,88,0.097,0.0,0.0 +2012,12,10,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-2.2,52,102354,566,1411,313,202,78,170,22558,5804,19074,6226,360,2.6,10,10,4800.0,4572,9,999999999,8,0.0880,0,88,0.097,0.0,0.0 +2012,12,10,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.7,-2.2,52,102354,476,1411,313,221,235,139,24581,15504,15528,4937,360,2.6,10,10,4800.0,4572,9,999999999,8,0.0880,0,88,0.097,0.0,0.0 +2012,12,10,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-2.2,54,102464,329,1411,302,178,324,94,19635,14690,10409,3134,40,2.6,9,9,4800.0,7620,9,999999999,8,0.0880,0,88,0.097,0.0,0.0 +2012,12,10,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-1.7,61,102453,134,1411,298,122,430,48,13094,0,5170,1329,60,1.5,9,9,4800.0,6096,9,999999999,8,0.0880,0,88,0.097,0.0,0.0 +2012,12,10,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.0,-1.7,61,102453,0,828,306,0,0,0,0,0,0,0,60,1.5,10,10,4800.0,6096,9,999999999,8,0.0880,0,88,0.097,0.0,0.0 +2012,12,10,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,0.0,67,102504,0,0,311,0,0,0,0,0,0,0,50,1.5,10,10,4800.0,3353,9,999999999,10,0.0880,0,88,0.097,0.0,0.0 +2012,12,10,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,0.0,67,102534,0,0,311,0,0,0,0,0,0,0,40,3.1,10,10,4800.0,3048,9,999999999,10,0.0880,0,88,0.097,0.0,0.0 +2012,12,10,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.6,0.0,67,102534,0,0,311,0,0,0,0,0,0,0,40,3.1,10,10,4800.0,3048,9,999999999,10,0.0880,0,88,0.098,0.0,0.0 +2012,12,10,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,1.1,70,102394,0,0,314,0,0,0,0,0,0,0,100,5.7,10,10,4800.0,2134,0,919999999,11,0.0880,0,88,0.098,0.0,0.0 +2012,12,10,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,1.7,73,102334,0,0,315,0,0,0,0,0,0,0,100,4.6,10,10,4800.0,1829,0,919999999,12,0.0880,0,88,0.098,0.0,0.0 +2012,12,10,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.1,1.7,73,102334,0,0,315,0,0,0,0,0,0,0,100,4.6,10,10,4800.0,1829,0,919999999,12,0.0880,0,88,0.098,0.0,0.0 +2012,12,10,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,6.1,3.9,86,102154,0,0,317,0,0,0,0,0,0,0,140,5.7,10,10,9656.0,884,0,919999999,15,0.0880,0,88,0.098,6.0,0.0 +2012,12,11,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,6.0,4.0,87,101279,0,0,317,0,0,0,0,0,0,0,120,3.1,10,10,9656.0,671,0,919999999,15,0.0870,0,88,0.098,6.0,0.0 +2012,12,11,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.1,5.0,93,101974,0,0,319,0,0,0,0,0,0,0,110,5.7,10,10,9656.0,671,0,919999999,16,0.0870,0,88,0.098,0.4,0.0 +2012,12,11,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.0,5.0,87,101279,0,0,323,0,0,0,0,0,0,0,100,7.2,10,10,8047.0,518,0,919999999,16,0.0870,0,88,0.098,0.0,0.0 +2012,12,11,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.0,6.0,93,101279,0,0,324,0,0,0,0,0,0,0,100,6.7,10,10,8047.0,427,0,919999999,18,0.0870,0,88,0.098,0.0,0.0 +2012,12,11,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,7.2,6.1,93,101494,0,0,325,0,0,0,0,0,0,0,110,7.2,10,10,9000.0,427,0,919999999,18,0.0870,0,88,0.098,0.0,0.0 +2012,12,11,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.2,7.2,100,101124,0,0,326,0,0,0,0,0,0,0,90,1.5,10,10,6437.0,152,0,919999999,20,0.0870,0,88,0.098,0.0,0.0 +2012,12,11,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,7.8,100,100975,0,0,330,0,0,0,0,0,0,0,181,0.0,10,10,6437.0,152,0,919999999,21,0.0870,0,88,0.098,0.0,0.0 +2012,12,11,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.8,7.8,100,100975,87,526,330,2,0,2,193,0,194,83,213,0.0,10,10,6437.0,152,0,919999999,21,0.0870,0,88,0.098,0.0,0.0 +2012,12,11,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,8.9,8.3,96,100885,290,1411,335,30,0,30,2947,0,2968,1233,221,0.0,10,10,6437.0,213,0,919999999,22,0.0870,0,88,0.098,0.0,0.0 +2012,12,11,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,8.3,96,100835,448,1411,335,89,17,83,10214,788,9556,3322,211,1.5,10,10,6437.0,152,0,919999999,22,0.0870,0,88,0.098,0.0,0.0 +2012,12,11,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.9,8.3,96,100835,551,1411,335,120,4,119,13698,237,13637,4796,208,0.8,10,10,6437.0,152,0,919999999,22,0.0870,0,88,0.098,0.0,0.0 +2012,12,11,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,10.0,9.0,93,101280,590,1411,341,125,0,125,12578,0,12683,5146,207,0.0,10,10,8047.0,427,0,919999999,24,0.0870,0,88,0.098,0.0,0.0 +2012,12,11,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.4,13.9,97,100396,565,1411,369,94,0,94,9408,0,9486,4029,200,5.1,10,10,8047.0,213,0,919999999,39,0.0870,0,88,0.098,0.0,0.0 +2012,12,11,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,14.4,13.9,97,100396,475,1411,369,97,0,97,9637,0,9715,3841,200,5.1,10,10,8047.0,213,0,919999999,39,0.0870,0,88,0.098,0.0,0.0 +2012,12,11,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,16.0,14.0,88,101281,328,1411,367,71,0,71,6968,0,7022,2594,210,5.1,9,9,8047.0,3900,0,919999999,39,0.0870,0,88,0.098,0.0,0.0 +2012,12,11,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,14.4,13.9,97,100186,134,1411,369,42,0,42,4056,0,4085,1242,190,3.6,10,10,9656.0,579,0,919999999,39,0.0870,0,88,0.098,0.0,0.0 +2012,12,11,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,14.4,13.9,97,100186,0,827,369,0,0,0,0,0,0,0,190,3.6,10,10,9000.0,579,0,919999999,39,0.0870,0,88,0.098,0.0,0.0 +2012,12,11,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,14.0,13.0,94,101280,0,0,366,0,0,0,0,0,0,0,200,3.6,10,10,9000.0,1189,0,919999999,36,0.0870,0,88,0.098,0.0,0.0 +2012,12,11,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.0,13.0,100,101280,0,0,361,0,0,0,0,0,0,0,190,3.6,10,10,9000.0,1189,0,919999999,36,0.0870,0,88,0.098,0.0,0.0 +2012,12,11,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,13.3,100,99936,0,0,363,0,0,0,0,0,0,0,200,2.6,10,10,9000.0,1189,9,999999999,37,0.0870,0,88,0.098,4.0,0.0 +2012,12,11,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,13.3,96,99836,0,0,366,0,0,0,0,0,0,0,240,4.6,10,10,9000.0,1341,9,999999999,36,0.0870,0,88,0.098,0.0,0.0 +2012,12,11,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.9,12.8,93,99836,0,0,365,0,0,0,0,0,0,0,240,4.1,10,10,9000.0,1402,9,999999999,35,0.0870,0,88,0.098,0.0,0.0 +2012,12,11,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.9,12.8,93,99836,0,0,355,0,0,0,0,0,0,0,240,4.1,9,9,9000.0,1402,9,999999999,35,0.0870,0,88,0.098,0.0,0.0 +2012,12,11,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,12.8,12.2,96,99916,0,0,359,0,0,0,0,0,0,0,220,3.6,10,10,9000.0,2134,9,999999999,33,0.0870,0,88,0.098,0.0,0.0 +2012,12,12,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,13.0,12.0,94,101280,0,0,360,0,0,0,0,0,0,0,240,3.6,10,10,9000.0,853,9,999999999,32,0.0870,0,88,0.098,0.0,0.0 +2012,12,12,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,13.3,11.7,90,99996,0,0,361,0,0,0,0,0,0,0,240,3.6,10,10,9000.0,853,9,999999999,31,0.0870,0,88,0.098,0.0,0.0 +2012,12,12,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,5.6,83,100295,0,0,329,0,0,0,0,0,0,0,340,3.6,10,10,9000.0,1311,9,999999999,17,0.0870,0,88,0.098,0.0,0.0 +2012,12,12,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,5.6,83,100375,0,0,329,0,0,0,0,0,0,0,320,3.6,10,10,9000.0,1372,9,999999999,17,0.0870,0,88,0.098,0.0,0.0 +2012,12,12,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,8.3,5.6,83,100375,0,0,320,0,0,0,0,0,0,0,320,3.6,9,9,9000.0,1372,9,999999999,17,0.0870,0,88,0.098,0.0,0.0 +2012,12,12,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,4.4,76,100535,0,0,328,0,0,0,0,0,0,0,300,4.6,10,10,9000.0,1372,0,919999999,15,0.0870,0,88,0.098,0.0,0.0 +2012,12,12,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,3.9,76,100585,0,0,325,0,0,0,0,0,0,0,320,3.1,10,10,9000.0,1676,0,919999999,14,0.0870,0,88,0.098,0.0,0.0 +2012,12,12,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.8,3.9,76,100585,84,506,325,5,0,5,484,0,487,199,320,3.1,10,10,9000.0,1676,0,919999999,14,0.0870,0,88,0.098,0.0,0.0 +2012,12,12,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.0,3.0,71,101280,287,1411,325,24,0,24,2362,0,2380,1007,300,4.6,10,10,9000.0,1829,0,919999999,13,0.0870,0,88,0.098,0.0,0.0 +2012,12,12,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,2.8,74,100955,445,1411,321,57,0,57,5685,0,5729,2431,280,5.7,10,10,9000.0,2438,0,919999999,13,0.0870,0,88,0.098,0.0,0.0 +2012,12,12,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.2,2.8,74,100955,548,1411,295,290,602,64,34806,29850,7699,2874,280,5.7,5,5,9000.0,2438,0,919999999,13,0.0870,0,88,0.098,0.0,0.0 +2012,12,12,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,1.1,60,101015,588,1411,298,396,825,67,47768,43329,8101,3063,280,5.7,5,5,9000.0,77777,0,919999999,11,0.0870,0,88,0.098,0.0,0.0 +2012,12,12,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,0.0,56,101055,563,1411,297,343,562,116,39455,34997,13393,4753,290,5.7,5,5,9000.0,77777,0,919999999,10,0.0870,0,88,0.098,0.0,0.0 +2012,12,12,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,0.0,56,101055,474,1411,297,339,714,82,39302,36354,9536,3365,290,5.7,5,5,9000.0,77777,0,919999999,10,0.0870,0,88,0.098,0.0,0.0 +2012,12,12,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,-2.2,48,101224,328,1411,292,266,732,56,30590,23040,6457,2163,310,6.7,5,5,9000.0,77777,0,919999999,8,0.0870,0,88,0.098,0.0,0.0 +2012,12,12,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-3.3,47,101344,134,1411,287,138,544,40,15042,0,4374,1207,300,5.1,5,5,9000.0,77777,0,919999999,7,0.0870,0,88,0.098,0.0,0.0 +2012,12,12,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-3.3,47,101344,0,827,287,0,0,0,0,0,0,0,300,5.1,5,5,9000.0,77777,0,919999999,7,0.0870,0,88,0.098,0.0,0.0 +2012,12,12,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-3.3,51,101564,0,0,282,0,0,0,0,0,0,0,310,2.6,5,5,9000.0,77777,0,919999999,7,0.0870,0,88,0.098,0.0,0.0 +2012,12,12,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-4.4,48,101694,0,0,303,0,0,0,0,0,0,0,300,4.1,10,10,9000.0,4877,0,919999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,12,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-4.4,52,101794,0,0,299,0,0,0,0,0,0,0,290,5.7,10,10,9000.0,3962,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,12,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-5.0,54,101853,0,0,269,0,0,0,0,0,0,0,290,4.6,5,5,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,12,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-5.6,53,101903,0,0,266,0,0,0,0,0,0,0,280,6.7,5,5,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,12,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-5.6,53,101903,0,0,266,0,0,0,0,0,0,0,280,6.7,5,5,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,12,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-6.1,53,102043,0,0,264,0,0,0,0,0,0,0,290,5.1,5,5,9000.0,77777,9,999999999,5,0.0870,0,88,0.098,0.0,0.0 +2012,12,13,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-6.1,55,102103,0,0,262,0,0,0,0,0,0,0,290,5.1,5,5,9000.0,77777,9,999999999,5,0.0870,0,88,0.098,0.0,0.0 +2012,12,13,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-6.1,55,102103,0,0,262,0,0,0,0,0,0,0,290,5.1,5,5,9000.0,77777,9,999999999,5,0.0870,0,88,0.098,0.0,0.0 +2012,12,13,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-6.7,54,102223,0,0,245,0,0,0,0,0,0,0,300,4.6,0,0,9000.0,77777,9,999999999,5,0.0870,0,88,0.098,0.0,0.0 +2012,12,13,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-6.7,57,102293,0,0,242,0,0,0,0,0,0,0,310,4.6,0,0,9000.0,77777,9,999999999,5,0.0870,0,88,0.098,0.0,0.0 +2012,12,13,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-6.7,57,102293,0,0,242,0,0,0,0,0,0,0,310,4.6,0,0,9000.0,77777,9,999999999,5,0.0870,0,88,0.098,0.0,0.0 +2012,12,13,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-6.7,57,102523,0,0,242,0,0,0,0,0,0,0,320,4.1,0,0,9000.0,77777,9,999999999,5,0.0870,0,88,0.098,0.0,0.0 +2012,12,13,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-6.7,57,102583,0,0,272,0,0,0,0,0,0,0,330,4.6,9,9,9000.0,7620,9,999999999,5,0.0870,0,88,0.098,0.0,0.0 +2012,12,13,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.0,-6.7,57,102583,81,487,272,9,0,9,873,0,879,340,330,4.6,9,9,9000.0,7620,9,999999999,5,0.0870,0,88,0.098,0.0,0.0 +2012,12,13,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-6.7,54,102693,284,1412,274,59,54,49,6768,1299,5634,1853,350,1.5,9,9,9000.0,7620,9,999999999,5,0.0870,0,88,0.098,0.0,0.0 +2012,12,13,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-6.7,54,102773,443,1412,274,165,270,89,18887,14181,10221,3487,320,3.6,9,9,9000.0,7620,9,999999999,5,0.0870,0,88,0.098,0.0,0.0 +2012,12,13,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.6,-6.7,54,102773,546,1412,274,260,417,114,29881,26253,13150,4623,320,3.6,9,9,9000.0,7620,9,999999999,5,0.0870,0,88,0.098,0.0,0.0 +2012,12,13,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-6.7,48,102713,586,1412,281,278,312,153,31473,22458,17397,5934,300,3.6,9,9,9000.0,7620,9,999999999,5,0.0870,0,88,0.098,0.0,0.0 +2012,12,13,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-6.7,46,102673,562,1412,283,295,365,148,33313,25790,16785,5662,290,2.6,9,9,9000.0,7620,9,999999999,5,0.0870,0,88,0.098,0.0,0.0 +2012,12,13,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,-6.7,46,102673,473,1412,283,278,445,119,31319,27503,13459,4444,290,2.6,9,9,9000.0,7620,9,999999999,5,0.0870,0,88,0.098,0.0,0.0 +2012,12,13,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-7.2,40,102693,327,1412,289,213,459,84,23724,19570,9389,2910,290,3.6,9,9,9000.0,7620,9,999999999,5,0.0870,0,88,0.098,0.0,0.0 +2012,12,13,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-7.8,41,102753,134,1412,284,112,330,50,11989,538,5372,1348,300,2.1,9,9,9000.0,7620,9,999999999,5,0.0870,0,88,0.098,0.0,0.0 +2012,12,13,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,-7.8,41,102753,0,828,284,0,0,0,0,0,0,0,300,2.1,9,9,9000.0,7620,9,999999999,5,0.0870,0,88,0.098,0.0,0.0 +2012,12,13,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-6.7,45,102843,0,0,269,0,0,0,0,0,0,0,290,3.1,5,5,9000.0,77777,9,999999999,5,0.0870,0,88,0.098,0.0,0.0 +2012,12,13,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-6.1,47,102903,0,0,286,0,0,0,0,0,0,0,290,4.1,9,9,9000.0,7620,9,999999999,5,0.0870,0,88,0.098,0.0,0.0 +2012,12,13,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-5.6,53,102903,0,0,282,0,0,0,0,0,0,0,290,3.1,9,9,9000.0,7620,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,13,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-5.6,53,102903,0,0,282,0,0,0,0,0,0,0,310,4.1,9,9,9000.0,7620,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,13,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-5.0,56,102993,0,0,283,0,0,0,0,0,0,0,310,2.6,9,9,9000.0,7620,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,13,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.2,-5.0,56,102993,0,0,283,0,0,0,0,0,0,0,310,2.6,9,9,9000.0,7620,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,13,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-5.0,58,102983,0,0,281,0,0,0,0,0,0,0,300,2.1,9,9,9000.0,7620,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,14,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-5.0,61,102963,0,0,263,0,0,0,0,0,0,0,300,2.6,5,5,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,14,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-5.0,61,102963,0,0,263,0,0,0,0,0,0,0,300,2.6,5,5,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,14,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-6.1,63,102972,0,0,255,0,0,0,0,0,0,0,327,0.0,5,5,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,14,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-5.0,66,102932,0,0,254,0,0,0,0,0,0,0,310,2.1,3,3,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,14,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-5.0,66,102932,0,0,254,0,0,0,0,0,0,0,310,2.1,3,3,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,14,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-5.0,63,102992,0,0,261,0,0,0,0,0,0,0,300,3.6,5,5,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,14,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-5.0,63,103042,0,0,261,0,0,0,0,0,0,0,280,2.1,5,5,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,14,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-5.0,63,103042,78,468,261,10,0,10,970,0,976,371,280,2.1,5,5,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,14,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-3.9,62,103163,281,1412,268,76,163,45,8763,3485,5201,1725,332,0.0,5,5,9000.0,77777,9,999999999,7,0.0870,0,88,0.098,0.0,0.0 +2012,12,14,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-4.4,55,103063,440,1412,272,208,492,65,24382,22327,7639,2705,330,2.1,5,5,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,14,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-4.4,55,103063,544,1412,272,321,688,76,38051,37179,9033,3325,330,2.1,5,5,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,14,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-3.9,51,102973,585,1412,279,393,798,77,46924,44506,9219,3451,140,2.6,5,5,9000.0,77777,9,999999999,7,0.0870,0,88,0.098,0.0,0.0 +2012,12,14,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-3.9,51,102873,560,1412,279,400,801,78,47481,44108,9284,3437,290,1.5,5,5,9000.0,77777,9,999999999,7,0.0870,0,88,0.098,0.0,0.0 +2012,12,14,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-3.9,51,102873,473,1412,279,354,775,73,41437,38397,8569,3056,282,1.5,5,5,9000.0,77777,9,999999999,7,0.0870,0,88,0.098,0.0,0.0 +2012,12,14,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-3.3,55,102793,327,1412,277,260,692,62,29657,23408,7092,2340,100,1.5,5,5,9000.0,77777,9,999999999,7,0.0870,0,88,0.098,0.0,0.0 +2012,12,14,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-3.3,60,102783,134,1412,273,134,497,43,14518,0,4674,1257,90,1.5,5,5,9000.0,77777,9,999999999,7,0.0870,0,88,0.098,0.0,0.0 +2012,12,14,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-3.3,60,102783,0,830,273,0,0,0,0,0,0,0,90,1.5,5,5,9000.0,77777,9,999999999,7,0.0870,0,88,0.098,0.0,0.0 +2012,12,14,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-3.9,55,102783,0,0,270,0,0,0,0,0,0,0,258,0.0,3,3,9000.0,77777,9,999999999,7,0.0870,0,88,0.098,0.0,0.0 +2012,12,14,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-2.8,65,102763,0,0,267,0,0,0,0,0,0,0,190,2.6,3,3,9000.0,77777,9,999999999,8,0.0870,0,88,0.098,0.0,0.0 +2012,12,14,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-2.8,65,102763,0,0,256,0,0,0,0,0,0,0,190,2.6,0,0,9000.0,77777,9,999999999,8,0.0870,0,88,0.098,0.0,0.0 +2012,12,14,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-3.3,67,102693,0,0,252,0,0,0,0,0,0,0,230,2.1,0,0,9000.0,77777,9,999999999,7,0.0870,0,88,0.098,0.0,0.0 +2012,12,14,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-3.9,67,102643,0,0,249,0,0,0,0,0,0,0,230,2.6,0,0,9000.0,77777,9,999999999,7,0.0870,0,88,0.098,0.0,0.0 +2012,12,14,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-2.8,68,102773,0,0,265,0,0,0,0,0,0,0,210,1.5,3,3,9000.0,77777,9,999999999,8,0.0870,0,88,0.098,0.0,0.0 +2012,12,14,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-5.0,66,102553,0,0,254,0,0,0,0,0,0,0,200,1.5,3,3,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,15,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-5.0,66,102463,0,0,254,0,0,0,0,0,0,0,220,3.1,3,3,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,15,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-5.0,66,102463,0,0,254,0,0,0,0,0,0,0,220,3.1,3,3,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,15,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-5.0,63,102423,0,0,257,0,0,0,0,0,0,0,260,3.1,3,3,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,15,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-5.0,66,102363,0,0,244,0,0,0,0,0,0,0,240,3.1,0,0,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,15,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-5.0,66,102363,0,0,254,0,0,0,0,0,0,0,240,3.1,3,3,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,15,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-5.0,66,102293,0,0,254,0,0,0,0,0,0,0,230,5.1,3,3,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,15,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-5.0,66,102263,0,0,258,0,0,0,0,0,0,0,220,4.6,5,5,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,15,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-5.0,66,102263,75,449,258,16,119,10,1874,0,1172,369,220,4.6,5,5,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,15,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-3.9,64,102203,278,1412,266,107,416,34,12601,6777,4010,1361,230,5.1,5,5,9000.0,77777,9,999999999,7,0.0870,0,88,0.098,0.0,0.0 +2012,12,15,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-3.9,55,102173,438,1412,270,230,667,54,27332,28063,6431,2307,230,5.1,3,3,9000.0,77777,9,999999999,7,0.0870,0,88,0.098,0.0,0.0 +2012,12,15,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-3.9,55,102173,542,1412,270,336,786,64,40336,40222,7701,2863,230,5.1,3,3,9000.0,77777,9,999999999,7,0.0870,0,88,0.098,0.0,0.0 +2012,12,15,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,-5.0,40,101894,583,1412,282,398,832,69,47915,45179,8327,3134,240,5.7,3,3,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,15,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,-6.1,33,101764,559,1412,286,405,833,70,48483,44783,8401,3129,230,7.2,3,3,9000.0,77777,9,999999999,5,0.0870,0,88,0.098,0.0,0.0 +2012,12,15,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.3,-6.1,33,101764,472,1412,286,358,800,67,42198,38753,7917,2843,230,7.2,3,3,9000.0,77777,9,999999999,5,0.0870,0,88,0.098,0.0,0.0 +2012,12,15,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,8.9,-7.8,28,101744,327,1412,286,262,715,58,30069,23784,6674,2222,270,6.2,3,3,9000.0,77777,9,999999999,5,0.0870,0,88,0.098,0.0,0.0 +2012,12,15,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,-7.2,31,101844,134,1412,283,136,524,40,14838,0,4378,1209,280,6.2,3,3,9000.0,77777,9,999999999,5,0.0870,0,88,0.098,0.0,0.0 +2012,12,15,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.8,-7.2,31,101844,0,834,283,0,0,0,0,0,0,0,280,6.2,3,3,9000.0,77777,9,999999999,5,0.0870,0,88,0.098,0.0,0.0 +2012,12,15,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-5.6,39,101964,0,0,280,0,0,0,0,0,0,0,290,4.6,3,3,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,15,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-4.4,45,102014,0,0,279,0,0,0,0,0,0,0,300,3.6,3,3,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,15,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-4.4,45,102014,0,0,279,0,0,0,0,0,0,0,300,3.6,3,3,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,15,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.4,-3.9,53,102064,0,0,261,0,0,0,0,0,0,0,280,4.1,0,0,9000.0,77777,9,999999999,7,0.0870,0,88,0.098,0.0,0.0 +2012,12,15,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-3.3,53,102064,0,0,264,0,0,0,0,0,0,0,280,4.6,0,0,9000.0,77777,9,999999999,7,0.0870,0,88,0.098,0.0,0.0 +2012,12,15,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-3.3,53,102064,0,0,264,0,0,0,0,0,0,0,280,4.6,0,0,9000.0,77777,9,999999999,7,0.0870,0,88,0.098,0.0,0.0 +2012,12,15,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-3.3,57,102063,0,0,260,0,0,0,0,0,0,0,290,4.1,0,0,9000.0,77777,9,999999999,7,0.0870,0,88,0.098,0.0,0.0 +2012,12,16,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-2.8,63,102133,0,0,258,0,0,0,0,0,0,0,290,4.6,0,0,9000.0,77777,9,999999999,8,0.0870,0,88,0.098,0.0,0.0 +2012,12,16,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-2.8,63,102133,0,0,258,0,0,0,0,0,0,0,290,4.6,0,0,9000.0,77777,9,999999999,8,0.0870,0,88,0.098,0.0,0.0 +2012,12,16,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-3.3,62,102223,0,0,256,0,0,0,0,0,0,0,310,3.6,0,0,9000.0,77777,9,999999999,7,0.0870,0,88,0.098,0.0,0.0 +2012,12,16,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-3.3,65,102253,0,0,253,0,0,0,0,0,0,0,290,4.1,0,0,9000.0,77777,9,999999999,7,0.0870,0,88,0.098,0.0,0.0 +2012,12,16,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-3.3,65,102253,0,0,253,0,0,0,0,0,0,0,290,4.1,0,0,9000.0,77777,9,999999999,7,0.0870,0,88,0.098,0.0,0.0 +2012,12,16,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-4.4,61,102373,0,0,251,0,0,0,0,0,0,0,330,5.1,0,0,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,16,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-5.6,55,102403,0,0,250,0,0,0,0,0,0,0,330,5.7,0,0,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,16,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-5.6,55,102403,72,432,264,17,147,9,2003,0,1061,335,330,5.7,5,5,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,16,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-5.6,53,102593,276,1412,266,112,465,31,13276,6935,3680,1253,360,4.6,5,5,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,16,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-5.6,49,102633,435,1412,271,238,726,49,28487,29667,5876,2116,20,3.6,5,5,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,16,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-5.6,49,102633,540,1412,271,347,839,58,36802,79642,8858,1226,20,3.6,5,5,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,16,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-6.1,45,102553,582,1412,272,410,883,62,43422,84744,9389,1307,50,1.5,5,5,9000.0,77777,9,999999999,5,0.0870,0,88,0.098,0.0,0.0 +2012,12,16,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-5.0,50,102523,558,1412,274,418,886,63,44264,84548,9560,1269,100,3.1,5,5,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,16,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-5.0,50,102523,472,1412,274,371,856,60,44092,39729,7147,2587,100,3.1,5,5,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,16,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-5.0,52,102523,327,1412,271,275,780,53,31773,24119,6138,2068,90,4.1,5,5,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,16,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-5.6,53,102563,135,1412,266,145,602,37,15923,0,4075,1155,100,3.1,5,5,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,16,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-5.6,53,102563,0,838,266,0,0,0,0,0,0,0,100,3.1,5,5,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,16,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-4.4,64,102613,0,0,263,0,0,0,0,0,0,0,90,3.1,5,5,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,16,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-4.4,64,102633,0,0,263,0,0,0,0,0,0,0,100,4.1,5,5,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,16,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-4.4,64,102633,0,0,279,0,0,0,0,0,0,0,100,4.1,9,9,9000.0,77777,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,16,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-3.9,67,102673,0,0,279,0,0,0,0,0,0,0,90,4.1,9,9,9000.0,7620,9,999999999,7,0.0870,0,88,0.098,0.0,0.0 +2012,12,16,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-3.9,64,102673,0,0,290,0,0,0,0,0,0,0,90,4.1,10,10,9000.0,1006,9,999999999,7,0.0870,0,88,0.098,0.0,0.0 +2012,12,16,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.7,-3.9,64,102673,0,0,290,0,0,0,0,0,0,0,90,4.1,10,10,9000.0,1006,9,999999999,7,0.0870,0,88,0.098,0.0,0.0 +2012,12,16,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-5.0,61,102653,0,0,286,0,0,0,0,0,0,0,80,6.2,10,10,9000.0,1158,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,17,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-5.6,58,102653,0,0,285,0,0,0,0,0,0,0,90,4.6,10,10,9000.0,1067,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,17,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.1,-5.6,58,102653,0,0,285,0,0,0,0,0,0,0,90,4.6,10,10,9000.0,1067,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,17,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-5.6,58,102603,0,0,285,0,0,0,0,0,0,0,100,4.1,10,10,9000.0,1067,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,17,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-5.0,61,102583,0,0,286,0,0,0,0,0,0,0,100,3.6,10,10,9000.0,1006,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,17,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.1,-5.0,61,102583,0,0,286,0,0,0,0,0,0,0,100,3.6,10,10,9000.0,1006,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,17,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-5.0,61,102573,0,0,286,0,0,0,0,0,0,0,90,3.6,10,10,9000.0,945,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,17,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-5.0,61,102553,0,0,286,0,0,0,0,0,0,0,80,4.6,10,10,9000.0,945,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,17,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.1,-5.0,61,102553,69,415,286,3,0,3,291,0,293,121,80,4.6,10,10,9000.0,945,9,999999999,6,0.0870,0,88,0.098,0.0,0.0 +2012,12,17,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-3.9,64,102543,273,1413,290,13,0,13,1281,0,1290,564,100,5.1,10,10,9000.0,914,9,999999999,7,0.0870,0,88,0.098,0.0,0.0 +2012,12,17,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.0,-4.0,62,101279,433,1413,291,21,0,21,2096,0,2113,969,100,5.1,10,10,9000.0,853,9,999999999,7,0.0870,0,88,0.098,0.0,0.0 +2012,12,17,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.2,-3.3,65,102573,538,1413,293,32,0,32,3221,0,3247,1517,100,5.1,10,10,9000.0,853,9,999999999,7,0.0870,0,88,0.098,0.0,0.0 +2012,12,17,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-2.8,68,102373,580,1413,293,38,0,38,3838,0,3869,1818,100,7.7,10,10,9000.0,701,9,999999999,8,0.0870,0,88,0.098,0.0,0.0 +2012,12,17,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-2.2,68,102303,558,1413,296,91,0,91,9173,0,9247,3903,110,7.7,10,10,9000.0,701,9,999999999,8,0.0870,0,88,0.098,0.0,0.0 +2012,12,17,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,-2.2,68,102303,471,1413,296,72,0,72,7207,0,7264,3018,110,7.7,10,10,9000.0,701,0,999099999,8,0.0870,0,88,0.098,0.0,0.0 +2012,12,17,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.0,-1.0,80,101279,327,1413,294,35,0,35,3461,0,3487,1455,120,8.8,10,10,4828.0,396,0,919099999,9,0.0870,0,88,0.098,0.0,0.0 +2012,12,17,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.0,0.0,87,101279,135,1413,295,18,0,18,1751,0,1763,672,130,7.7,10,10,4023.0,335,0,919099999,10,0.0870,0,88,0.098,0.0,0.0 +2012,12,17,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,1.7,0.0,88,102163,0,843,294,0,0,0,0,0,0,0,130,6.7,10,10,4000.0,335,0,919099999,10,0.0870,0,88,0.098,0.0,0.0 +2012,12,17,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.0,1.0,93,101279,0,0,296,0,0,0,0,0,0,0,130,6.7,10,10,9656.0,274,0,919099999,11,0.0870,0,88,0.098,0.0,0.0 +2012,12,17,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.0,1.0,93,101279,0,0,296,0,0,0,0,0,0,0,120,8.8,10,10,4023.0,274,0,919099999,11,0.0870,0,88,0.098,0.0,0.0 +2012,12,17,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,2.2,1.1,92,102053,0,0,297,0,0,0,0,0,0,0,100,7.2,10,10,6000.0,274,0,919999999,11,0.0870,0,88,0.098,4.0,0.0 +2012,12,17,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.0,1.0,87,101279,0,0,301,0,0,0,0,0,0,0,100,8.8,10,10,9656.0,366,0,919999999,11,0.0870,0,88,0.098,4.0,0.0 +2012,12,17,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.0,2.0,93,101279,0,0,302,0,0,0,0,0,0,0,100,7.7,10,10,9656.0,610,0,919999999,12,0.0870,0,88,0.098,0.4,0.0 +2012,12,17,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,3.3,1.7,89,101933,0,0,303,0,0,0,0,0,0,0,100,8.2,10,10,4800.0,610,0,919999999,12,0.0870,0,88,0.098,0.0,0.0 +2012,12,17,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.3,2.2,92,101833,0,0,303,0,0,0,0,0,0,0,90,8.2,10,10,4023.0,274,0,919999999,12,0.0870,0,88,0.098,0.0,0.0 +2012,12,18,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,4.0,3.0,93,101279,0,0,307,0,0,0,0,0,0,0,80,8.8,10,10,4828.0,274,0,919999999,13,0.0860,0,88,0.098,0.0,0.0 +2012,12,18,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,3.9,2.8,93,101784,0,0,306,0,0,0,0,0,0,0,80,9.3,10,10,6000.0,274,0,919999999,13,0.0860,0,88,0.098,0.0,0.0 +2012,12,18,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.9,2.8,93,101704,0,0,306,0,0,0,0,0,0,0,70,8.2,10,10,6437.0,305,0,919999999,13,0.0860,0,88,0.098,0.0,0.0 +2012,12,18,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,4.0,3.0,93,101279,0,0,307,0,0,0,0,0,0,0,40,8.2,10,10,6437.0,457,0,919999999,13,0.0860,0,88,0.098,0.0,0.0 +2012,12,18,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,3.9,3.3,96,101634,0,0,307,0,0,0,0,0,0,0,70,8.2,10,10,4800.0,457,0,919999999,14,0.0860,0,88,0.098,0.0,0.0 +2012,12,18,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,4.4,3.3,93,101574,0,0,309,0,0,0,0,0,0,0,70,6.2,10,10,4828.0,427,0,919999999,14,0.0860,0,88,0.098,0.0,0.0 +2012,12,18,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,4.0,3.0,93,101279,0,0,307,0,0,0,0,0,0,0,70,7.2,10,10,4828.0,244,0,919999999,13,0.0860,0,88,0.098,0.0,0.0 +2012,12,18,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,4.4,3.3,93,101574,66,399,309,2,0,2,193,0,195,81,70,7.7,10,10,6000.0,244,0,919999999,14,0.0860,0,88,0.098,0.0,0.0 +2012,12,18,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,5.0,4.4,96,101534,271,1413,313,6,0,6,589,0,594,267,60,7.7,10,10,2816.0,244,0,919999999,15,0.0860,0,88,0.098,0.0,0.0 +2012,12,18,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,5.6,5.0,96,101504,431,1413,316,20,0,20,1990,0,2006,924,70,8.8,10,10,2816.0,152,0,919999999,16,0.0860,0,88,0.098,0.0,0.0 +2012,12,18,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,5.6,5.0,96,101504,536,1413,316,29,0,29,2911,0,2935,1382,70,8.7,10,10,2800.0,152,0,919999999,16,0.0860,0,88,0.098,0.0,0.0 +2012,12,18,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,6.0,6.0,100,101279,579,1413,319,44,0,44,4430,0,4467,2083,60,6.2,10,10,2414.0,213,0,919999999,18,0.0860,0,88,0.098,0.0,0.0 +2012,12,18,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,6.0,6.0,100,101279,557,1413,319,195,317,70,23258,15845,8371,3124,50,5.7,10,10,1609.0,152,0,919999999,18,0.0860,0,88,0.098,0.0,0.0 +2012,12,18,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,6.1,6.1,100,101344,471,1413,320,162,269,72,18922,12358,8433,3018,60,5.7,10,10,1600.0,152,0,919999999,18,0.0860,0,88,0.098,0.0,0.0 +2012,12,18,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.0,7.0,100,101279,328,1413,325,83,6,81,9235,223,9045,2841,70,5.1,10,10,4023.0,457,0,919999999,20,0.0860,0,88,0.098,0.0,0.0 +2012,12,18,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,4.0,4.0,100,101279,136,1413,308,85,139,66,8867,1634,6916,1461,330,2.6,10,10,805.0,91,0,919999999,15,0.0860,0,88,0.098,0.0,0.0 +2012,12,18,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,3.3,2.8,97,101174,0,848,304,0,0,0,0,0,0,0,350,3.6,10,10,800.0,91,0,919999999,13,0.0860,0,88,0.098,0.0,0.0 +2012,12,18,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.0,7.0,100,101279,0,0,325,0,0,0,0,0,0,0,70,5.1,10,10,2414.0,152,0,919999999,20,0.0860,0,88,0.098,0.0,0.0 +2012,12,18,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.0,7.0,100,101279,0,0,325,0,0,0,0,0,0,0,70,5.1,10,10,2414.0,91,0,919999999,20,0.0860,0,88,0.098,0.0,0.0 +2012,12,18,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,7.2,6.7,97,101204,0,0,326,0,0,0,0,0,0,0,70,5.1,10,10,2400.0,91,0,919999999,19,0.0860,0,88,0.100,5.0,0.0 +2012,12,18,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.2,6.7,97,101124,0,0,326,0,0,0,0,0,0,0,60,4.6,10,10,2414.0,91,0,919999999,19,0.0860,0,88,0.100,5.0,0.0 +2012,12,18,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.2,6.7,97,101024,0,0,326,0,0,0,0,0,0,0,70,5.7,10,10,2414.0,91,0,919999999,19,0.0860,0,88,0.100,5.0,0.0 +2012,12,18,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,7.2,6.7,97,101024,0,0,326,0,0,0,0,0,0,0,70,5.7,10,10,2400.0,91,0,919999999,19,0.0860,0,88,0.100,5.0,0.0 +2012,12,18,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.0,7.0,100,101279,0,0,325,0,0,0,0,0,0,0,50,5.7,10,10,2414.0,91,0,919999999,20,0.0860,0,88,0.100,3.9,0.0 +2012,12,19,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.2,7.2,100,100775,0,0,326,0,0,0,0,0,0,0,60,5.7,10,10,2414.0,91,0,919999999,20,0.0860,0,88,0.100,0.0,0.0 +2012,12,19,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,7.2,7.2,100,100775,0,0,326,0,0,0,0,0,0,0,60,5.7,10,10,2400.0,91,0,919999999,20,0.0860,0,88,0.100,0.0,0.0 +2012,12,19,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.0,7.0,100,101279,0,0,325,0,0,0,0,0,0,0,50,6.7,10,10,3219.0,91,0,919999999,20,0.0860,0,88,0.100,0.0,0.0 +2012,12,19,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.2,7.2,100,100395,0,0,326,0,0,0,0,0,0,0,70,6.7,10,10,3219.0,91,0,919999999,20,0.0860,0,88,0.100,0.0,0.0 +2012,12,19,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,7.2,7.2,100,100395,0,0,326,0,0,0,0,0,0,0,70,6.7,10,10,3200.0,91,0,919999999,20,0.0860,0,88,0.100,0.0,0.0 +2012,12,19,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.8,7.2,96,100155,0,0,329,0,0,0,0,0,0,0,80,7.2,10,10,4828.0,183,0,919999999,20,0.0860,0,88,0.100,0.0,0.0 +2012,12,19,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.8,7.2,96,100025,0,0,329,0,0,0,0,0,0,0,80,6.7,10,10,1207.0,122,0,919999999,20,0.0860,0,88,0.100,0.0,0.0 +2012,12,19,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,7.8,7.2,96,100025,64,383,329,6,0,6,579,0,582,230,80,6.7,10,10,1200.0,122,0,919999999,20,0.0860,0,88,0.100,0.0,0.0 +2012,12,19,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,8.0,8.0,100,101280,268,1413,331,80,212,40,9235,2766,4628,1545,80,7.7,10,10,1207.0,335,0,919999999,22,0.0860,0,88,0.100,0.0,0.0 +2012,12,19,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,8.3,8.3,100,99805,429,1413,332,194,453,64,22617,18035,7481,2647,80,3.6,10,10,402.0,61,0,919999999,22,0.0860,0,88,0.100,0.0,0.0 +2012,12,19,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,8.3,8.3,100,99805,535,1413,332,166,313,71,19667,15044,8434,3119,80,3.6,10,10,400.0,61,0,919999999,22,0.0860,0,88,0.100,0.0,0.0 +2012,12,19,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,9.0,9.0,100,101280,578,1413,307,138,173,78,16372,8827,9280,3475,80,3.1,4,4,402.0,122,0,919999999,24,0.0860,0,88,0.100,0.0,0.0 +2012,12,19,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,9.0,9.0,100,101280,557,1413,337,234,378,85,27455,19543,10004,3685,220,1.5,10,10,402.0,122,0,919999999,24,0.0860,0,88,0.100,0.0,0.0 +2012,12,19,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,9.4,9.4,100,99545,471,1413,339,92,21,84,10600,994,9709,3421,213,0.0,10,10,400.0,122,0,919999999,25,0.0860,0,88,0.100,0.0,0.0 +2012,12,19,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,9.0,9.0,100,101280,328,1413,337,205,431,93,22532,17484,10262,3107,240,4.1,10,10,9656.0,274,0,919999999,24,0.0860,0,88,0.100,0.0,0.0 +2012,12,19,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.2,6.7,97,99575,137,1413,326,126,385,52,13412,0,5557,1388,280,4.1,10,10,9656.0,152,0,919999999,19,0.0860,0,88,0.100,0.0,0.0 +2012,12,19,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,7.2,6.7,97,99575,0,855,326,0,0,0,0,0,0,0,280,4.1,10,10,9000.0,152,0,919999999,19,0.0860,0,88,0.100,0.0,0.0 +2012,12,19,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,6.1,96,99595,0,0,323,0,0,0,0,0,0,0,270,3.6,10,10,9000.0,274,0,919999999,18,0.0860,0,88,0.100,0.0,0.0 +2012,12,19,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.0,6.0,93,101279,0,0,315,0,0,0,0,0,0,0,260,5.1,9,9,9000.0,305,0,919999999,18,0.0860,0,88,0.100,0.0,0.0 +2012,12,19,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.7,5.0,89,99605,0,0,313,0,0,0,0,0,0,0,260,5.1,9,9,9000.0,305,9,999999999,16,0.0860,0,88,0.100,4.0,0.0 +2012,12,19,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.0,4.0,87,101279,0,0,317,0,0,0,0,0,0,0,270,5.1,10,10,9000.0,457,9,999999999,15,0.0860,0,88,0.100,4.0,0.0 +2012,12,19,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,3.9,89,99605,0,0,306,0,0,0,0,0,0,0,280,4.6,9,9,9000.0,457,9,999999999,14,0.0860,0,88,0.100,0.1,0.0 +2012,12,19,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.6,3.9,89,99605,0,0,306,0,0,0,0,0,0,0,280,4.6,9,9,9000.0,457,9,999999999,14,0.0860,0,88,0.100,0.0,0.0 +2012,12,19,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,3.0,87,101279,0,0,311,0,0,0,0,0,0,0,280,6.7,10,10,9000.0,488,9,999999999,13,0.0860,0,88,0.100,0.0,0.0 +2012,12,20,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,3.0,87,101279,0,0,311,0,0,0,0,0,0,0,280,6.2,10,10,9000.0,914,9,999999999,13,0.0860,0,88,0.100,0.0,0.0 +2012,12,20,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.0,3.3,89,99635,0,0,312,0,0,0,0,0,0,0,280,5.7,10,10,9000.0,914,9,999999999,14,0.0860,0,88,0.100,0.0,0.0 +2012,12,20,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.0,3.0,81,101279,0,0,316,0,0,0,0,0,0,0,280,5.7,10,10,9000.0,671,9,999999999,13,0.0860,0,88,0.100,0.0,0.0 +2012,12,20,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,1.7,79,99715,0,0,310,0,0,0,0,0,0,0,290,6.2,10,10,9000.0,792,9,999999999,12,0.0860,0,88,0.100,0.0,0.0 +2012,12,20,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.0,1.7,79,99715,0,0,302,0,0,0,0,0,0,0,290,6.2,9,9,9000.0,792,9,999999999,12,0.0860,0,88,0.100,0.0,0.0 +2012,12,20,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,1.0,75,101279,0,0,309,0,0,0,0,0,0,0,290,7.2,10,10,9000.0,914,9,999999999,11,0.0860,0,88,0.100,0.0,0.0 +2012,12,20,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.0,1.0,81,101279,0,0,305,0,0,0,0,0,0,0,290,6.7,10,10,9000.0,1402,0,919999999,11,0.0860,0,88,0.100,0.0,0.0 +2012,12,20,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,4.4,0.6,76,99905,61,369,306,4,0,4,387,0,389,158,290,6.7,10,10,9000.0,1402,0,919999999,10,0.0860,0,88,0.100,0.0,0.0 +2012,12,20,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,0.0,70,99995,266,1413,308,33,0,33,3246,0,3270,1311,310,10.3,10,10,9000.0,1676,0,919999999,10,0.0860,0,88,0.100,0.0,0.0 +2012,12,20,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,0.0,65,100095,427,1413,304,88,19,82,10085,913,9427,3225,320,9.8,9,9,9000.0,1341,0,919999999,10,0.0860,0,88,0.100,0.0,0.0 +2012,12,20,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.1,0.0,65,100095,534,1413,304,208,242,118,23739,14981,13519,4691,320,9.8,9,9,9000.0,1341,0,919999999,10,0.0860,0,88,0.100,0.0,0.0 +2012,12,20,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-0.6,59,100205,578,1413,306,344,612,97,40255,36001,11388,4170,310,7.2,9,9,9000.0,1097,0,919999999,9,0.0860,0,88,0.100,0.0,0.0 +2012,12,20,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-1.1,57,100305,557,1413,315,187,194,110,21575,11854,12737,4536,320,6.7,10,10,9000.0,1097,0,919999999,9,0.0860,0,88,0.100,0.0,0.0 +2012,12,20,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.7,-1.1,57,100305,472,1413,306,102,18,96,11673,983,11024,3796,320,6.7,9,9,9000.0,1097,0,919999999,9,0.0860,0,88,0.100,0.0,0.0 +2012,12,20,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.7,-1.7,54,100585,329,1413,305,178,485,55,20502,15072,6351,2134,320,11.3,9,9,9000.0,1158,0,919999999,8,0.0860,0,88,0.100,0.0,0.0 +2012,12,20,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,-1.7,56,100714,138,1413,303,136,498,44,14736,0,4784,1290,330,8.8,9,9,9000.0,1219,0,919999999,8,0.0860,0,88,0.100,0.0,0.0 +2012,12,20,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.1,-1.7,56,100714,0,863,303,0,0,0,0,0,0,0,330,8.7,9,9,9000.0,1219,0,919999999,8,0.0860,0,88,0.100,0.0,0.0 +2012,12,20,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-1.7,61,100994,0,0,281,0,0,0,0,0,0,0,330,7.7,5,5,9000.0,77777,0,919999999,8,0.0860,0,88,0.100,0.0,0.0 +2012,12,20,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-1.7,61,101164,0,0,298,0,0,0,0,0,0,0,330,6.2,9,9,9000.0,1341,0,919999999,8,0.0860,0,88,0.100,0.0,0.0 +2012,12,20,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.0,-1.7,61,101164,0,0,298,0,0,0,0,0,0,0,330,6.2,9,9,9000.0,1341,9,999999999,8,0.0860,0,88,0.100,0.0,0.0 +2012,12,20,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-1.7,66,101394,0,0,293,0,0,0,0,0,0,0,340,5.1,9,9,9000.0,1280,9,999999999,8,0.0860,0,88,0.100,0.0,0.0 +2012,12,20,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-1.7,66,101484,0,0,293,0,0,0,0,0,0,0,340,5.1,9,9,9000.0,1280,9,999999999,8,0.0860,0,88,0.100,0.0,0.0 +2012,12,20,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.9,-1.7,66,101484,0,0,293,0,0,0,0,0,0,0,340,5.1,9,9,9000.0,1280,9,999999999,8,0.0860,0,88,0.100,0.0,0.0 +2012,12,20,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-2.2,66,101644,0,0,290,0,0,0,0,0,0,0,320,4.6,9,9,9000.0,1402,9,999999999,8,0.0860,0,88,0.100,0.0,0.0 +2012,12,21,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-2.2,66,101684,0,0,298,0,0,0,0,0,0,0,340,5.1,10,10,9000.0,1341,9,999999999,8,0.0860,0,88,0.100,0.0,0.0 +2012,12,21,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,-2.2,66,101684,0,0,298,0,0,0,0,0,0,0,340,5.1,10,10,9000.0,1341,9,999999999,8,0.0860,0,88,0.100,0.0,0.0 +2012,12,21,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-2.2,66,101843,0,0,298,0,0,0,0,0,0,0,330,5.1,10,10,9000.0,1280,9,999999999,8,0.0860,0,88,0.100,0.0,0.0 +2012,12,21,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-2.2,71,101853,0,0,254,0,0,0,0,0,0,0,340,2.6,0,0,9000.0,77777,9,999999999,8,0.0860,0,88,0.100,0.0,0.0 +2012,12,21,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-2.2,71,101853,0,0,265,0,0,0,0,0,0,0,340,2.6,3,3,9000.0,77777,9,999999999,8,0.0860,0,88,0.100,0.0,0.0 +2012,12,21,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-2.2,74,101943,0,0,264,0,0,0,0,0,0,0,340,2.6,3,3,9000.0,77777,9,999999999,8,0.0860,0,88,0.100,0.0,0.0 +2012,12,21,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-2.2,74,102063,0,0,264,0,0,0,0,0,0,0,350,3.1,3,3,9000.0,77777,9,999999999,8,0.0860,0,88,0.100,0.0,0.0 +2012,12,21,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-2.2,74,102063,59,355,268,13,109,9,1514,0,1049,327,350,3.1,5,5,9000.0,77777,9,999999999,8,0.0860,0,88,0.100,0.0,0.0 +2012,12,21,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-2.2,68,102203,264,1414,288,43,12,41,4964,199,4743,1569,340,3.6,9,9,9000.0,1036,9,999999999,8,0.0860,0,88,0.100,0.0,0.0 +2012,12,21,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-1.7,66,102253,426,1414,293,118,86,94,13376,4453,10692,3567,330,3.6,9,9,9000.0,1036,9,999999999,8,0.0860,0,88,0.100,0.0,0.0 +2012,12,21,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.9,-1.7,66,102253,532,1414,293,170,88,138,19162,5884,15620,5237,330,3.6,9,9,9000.0,1036,9,999999999,8,0.0860,0,88,0.100,0.0,0.0 +2012,12,21,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.0,-2.2,58,102184,577,1414,297,210,107,168,23523,7922,18906,6247,350,3.6,9,9,9000.0,1158,9,999999999,8,0.0860,0,88,0.100,0.0,0.0 +2012,12,21,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-1.7,58,102074,556,1414,284,356,649,97,41488,37936,11342,4106,60,5.1,5,5,9000.0,77777,9,999999999,8,0.0860,0,88,0.100,0.0,0.0 +2012,12,21,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,5.6,-1.7,58,102074,472,1414,284,360,802,68,42345,38242,8019,2878,60,5.1,5,5,9000.0,77777,9,999999999,8,0.0860,0,88,0.100,0.0,0.0 +2012,12,21,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-1.1,69,102063,330,1414,294,267,719,60,30543,23594,6882,2288,70,4.1,9,9,9000.0,1036,9,999999999,9,0.0860,0,88,0.100,0.0,0.0 +2012,12,21,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-1.1,72,102063,139,1414,300,141,530,43,15316,0,4686,1280,70,3.1,10,10,9000.0,1097,9,999999999,9,0.0860,0,88,0.100,0.0,0.0 +2012,12,21,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,-1.1,72,102063,0,872,275,0,0,0,0,0,0,0,70,3.1,5,5,9000.0,1097,9,999999999,9,0.0860,0,88,0.100,0.0,0.0 +2012,12,21,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-1.1,72,102023,0,0,291,0,0,0,0,0,0,0,60,3.6,9,9,9000.0,1006,9,999999999,9,0.0860,0,88,0.100,0.0,0.0 +2012,12,21,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.0,-1.0,74,101279,0,0,298,0,0,0,0,0,0,0,60,3.1,10,10,9000.0,853,9,999999999,9,0.0860,0,88,0.100,0.0,0.0 +2012,12,21,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.9,-0.6,72,102013,0,0,294,0,0,0,0,0,0,0,90,4.1,9,9,9000.0,853,9,999999999,9,0.0860,0,88,0.100,0.0,0.0 +2012,12,21,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,1.1,85,101883,0,0,302,0,0,0,0,0,0,0,100,3.6,10,10,9000.0,914,0,919999999,11,0.0860,0,88,0.100,0.8,0.0 +2012,12,21,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.0,1.0,87,101279,0,0,301,0,0,0,0,0,0,0,160,3.1,10,10,9000.0,579,0,919999999,11,0.0860,0,88,0.100,0.0,0.0 +2012,12,21,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,1.1,85,101873,0,0,302,0,0,0,0,0,0,0,170,4.1,10,10,9000.0,579,0,919999999,11,0.0860,0,88,0.100,0.0,0.0 +2012,12,21,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,1.7,89,101714,0,0,294,0,0,0,0,0,0,0,200,2.6,9,9,9000.0,457,0,919999999,12,0.0860,0,88,0.100,0.0,0.0 +2012,12,22,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,2.2,92,101594,0,0,303,0,0,0,0,0,0,0,130,2.6,10,10,9000.0,671,0,919999999,12,0.0860,0,88,0.100,0.0,0.0 +2012,12,22,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,2.2,92,101594,0,0,303,0,0,0,0,0,0,0,130,2.6,10,10,9000.0,671,0,919999999,12,0.0860,0,88,0.100,0.0,0.0 +2012,12,22,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.0,3.0,93,101279,0,0,307,0,0,0,0,0,0,0,120,4.1,10,10,9000.0,1128,0,919999999,13,0.0860,0,88,0.100,0.0,0.0 +2012,12,22,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.0,3.0,93,101279,0,0,307,0,0,0,0,0,0,0,110,6.2,10,10,9000.0,1463,0,919999999,13,0.0860,0,88,0.100,0.0,0.0 +2012,12,22,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,5.0,3.9,93,101054,0,0,312,0,0,0,0,0,0,0,110,9.3,10,10,9000.0,1463,0,919999999,15,0.0860,0,88,0.100,0.0,0.0 +2012,12,22,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,4.4,89,100694,0,0,318,0,0,0,0,0,0,0,120,9.8,10,10,9000.0,488,0,919999999,15,0.0860,0,88,0.100,0.0,0.0 +2012,12,22,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,6.1,3.9,86,100425,0,0,317,0,0,0,0,0,0,0,110,12.4,10,10,9000.0,610,0,919999999,15,0.0860,0,88,0.100,0.0,0.0 +2012,12,22,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,6.1,3.9,86,100425,57,342,317,1,0,1,97,0,97,41,110,12.3,10,10,9000.0,610,0,919999999,15,0.0860,0,88,0.100,0.0,0.0 +2012,12,22,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,6.7,5.0,89,100185,262,1414,321,14,0,14,1374,0,1384,601,120,11.8,10,10,6437.0,427,0,919999999,16,0.0860,0,88,0.100,0.0,0.0 +2012,12,22,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.0,5.0,87,101279,424,1414,323,12,0,12,1194,0,1203,563,120,11.8,10,10,3219.0,427,0,919999999,16,0.0860,0,88,0.100,0.0,0.0 +2012,12,22,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,7.2,6.1,93,99865,532,1414,325,29,0,29,2908,0,2932,1378,110,13.4,10,10,8000.0,427,0,919999999,18,0.0860,0,88,0.100,0.0,0.0 +2012,12,22,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,8.0,7.0,93,101280,577,1414,330,46,0,46,4628,0,4666,2167,120,14.4,10,10,6437.0,305,0,919999999,20,0.0860,0,88,0.100,0.0,0.0 +2012,12,22,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,9.0,9.0,100,101280,557,1414,337,56,0,56,5619,0,5665,2564,120,14.4,10,10,4828.0,305,0,919999999,24,0.0860,0,88,0.100,0.0,0.0 +2012,12,22,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,9.0,9.0,100,98696,473,1414,337,38,0,38,3787,0,3817,1722,120,14.9,10,10,2414.0,305,0,919999999,24,0.0860,0,88,0.100,0.0,0.0 +2012,12,22,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,11.0,10.0,94,101280,331,1414,338,68,9,66,7690,274,7486,2464,170,11.8,9,9,4828.0,366,0,919999999,27,0.0860,0,88,0.100,0.0,0.0 +2012,12,22,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,5.0,74,98546,141,1414,307,67,204,40,7314,0,4380,1233,200,11.3,5,5,4828.0,77777,0,919999999,16,0.0860,0,88,0.100,0.0,0.0 +2012,12,22,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,9.4,5.0,74,98546,0,881,307,0,0,0,0,0,0,0,200,11.3,5,5,4828.0,77777,0,919999999,16,0.0860,0,88,0.100,0.0,0.0 +2012,12,22,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,3.3,76,98686,0,0,295,0,0,0,0,0,0,0,210,6.7,5,5,4828.0,77777,0,919999999,13,0.0860,0,88,0.100,0.0,0.0 +2012,12,22,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.2,2.8,74,98726,0,0,312,0,0,0,0,0,0,0,220,6.7,9,9,4828.0,2591,0,919999999,13,0.0860,0,88,0.100,0.0,0.0 +2012,12,22,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,7.2,2.8,74,98726,0,0,321,0,0,0,0,0,0,0,220,6.7,10,10,4828.0,2591,9,999999999,13,0.0860,0,88,0.100,5.0,0.0 +2012,12,22,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,7.0,3.0,76,101279,0,0,321,0,0,0,0,0,0,0,220,8.8,10,10,4828.0,762,0,919999999,13,0.0860,0,88,0.100,0.7,0.0 +2012,12,22,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.0,1.0,81,101279,0,0,305,0,0,0,0,0,0,0,260,7.7,10,10,4828.0,671,0,919999999,11,0.0860,0,88,0.100,5.0,0.0 +2012,12,22,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.9,1.7,86,98915,0,0,305,0,0,0,0,0,0,0,240,7.2,10,10,4828.0,671,0,919999999,12,0.0860,0,88,0.100,5.0,0.0 +2012,12,22,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,0.0,79,98945,0,0,301,0,0,0,0,0,0,0,240,8.2,10,10,4828.0,1433,0,919999999,10,0.0860,0,88,0.100,0.0,0.0 +2012,12,23,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-1.1,72,98945,0,0,300,0,0,0,0,0,0,0,220,5.7,10,10,4828.0,2743,0,919999999,9,0.0860,0,88,0.100,0.0,0.0 +2012,12,23,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,-1.1,72,98945,0,0,260,0,0,0,0,0,0,0,220,5.7,0,0,4828.0,2743,0,919999999,9,0.0860,0,88,0.100,0.0,0.0 +2012,12,23,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-2.2,74,99014,0,0,268,0,0,0,0,0,0,0,220,5.7,5,5,4828.0,77777,0,919999999,8,0.0860,0,88,0.100,0.0,0.0 +2012,12,23,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-2.2,74,99024,0,0,268,0,0,0,0,0,0,0,220,5.1,5,5,4828.0,77777,0,919999999,8,0.0860,0,88,0.100,0.0,0.0 +2012,12,23,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-2.2,74,99024,0,0,264,0,0,0,0,0,0,0,220,5.1,3,3,4828.0,77777,0,919999999,8,0.0860,0,88,0.100,0.0,0.0 +2012,12,23,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-2.2,74,99094,0,0,284,0,0,0,0,0,0,0,220,5.1,9,9,4828.0,3048,0,919999999,8,0.0860,0,88,0.100,0.0,0.0 +2012,12,23,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-1.7,74,99155,0,0,294,0,0,0,0,0,0,0,230,6.2,10,10,4828.0,2286,0,919999999,8,0.0860,0,88,0.100,0.0,0.0 +2012,12,23,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.2,-1.7,74,99155,55,330,294,5,0,5,483,0,487,193,230,6.2,10,10,4828.0,2286,0,919999999,8,0.0860,0,88,0.100,0.0,0.0 +2012,12,23,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-0.6,78,99295,261,1414,298,21,13,20,2558,79,2438,836,240,5.7,10,10,4828.0,2743,0,919999999,9,0.0860,0,88,0.100,0.0,0.0 +2012,12,23,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-2.2,66,99355,423,1414,298,93,48,82,10652,2320,9422,3211,280,7.7,10,10,4828.0,1372,0,919999999,8,0.0860,0,88,0.100,0.0,0.0 +2012,12,23,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,-2.2,66,99355,531,1414,290,161,80,136,18163,5320,15407,5175,280,7.7,9,9,4828.0,1372,0,919999999,8,0.0860,0,88,0.100,0.0,0.0 +2012,12,23,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-7.2,43,99335,576,1414,285,300,442,121,34534,28857,13981,4959,280,7.7,9,9,4828.0,3353,0,919999999,5,0.0860,0,88,0.100,0.0,0.0 +2012,12,23,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-6.7,46,99345,557,1414,283,225,142,168,25116,10636,18841,6106,280,9.3,9,9,4828.0,1463,0,919999999,5,0.0860,0,88,0.100,0.0,0.0 +2012,12,23,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,-6.7,46,99345,474,1414,283,174,88,140,19341,5905,15630,4934,280,9.3,9,9,4828.0,1463,0,919999999,5,0.0860,0,88,0.100,0.0,0.0 +2012,12,23,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-7.8,48,99524,332,1414,275,180,341,91,19945,15555,10121,3084,270,9.3,9,9,4828.0,1524,0,919999999,5,0.0860,0,88,0.100,0.0,0.0 +2012,12,23,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-8.9,45,99624,142,1414,272,118,330,53,12633,1724,5696,1431,280,10.3,9,9,4828.0,1524,0,919999999,4,0.0860,0,88,0.100,0.0,0.0 +2012,12,23,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.6,-8.9,45,99624,0,892,257,0,0,0,0,0,0,0,280,10.3,5,5,4828.0,1524,0,919999999,4,0.0860,0,88,0.100,0.0,0.0 +2012,12,23,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-10.6,42,99894,0,0,251,0,0,0,0,0,0,0,300,8.8,5,5,4828.0,77777,0,919999999,3,0.0860,0,88,0.100,0.0,0.0 +2012,12,23,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-10.6,42,99974,0,0,251,0,0,0,0,0,0,0,290,8.2,5,5,4828.0,77777,0,919999999,3,0.0860,0,88,0.100,0.0,0.0 +2012,12,23,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-10.6,42,99974,0,0,247,0,0,0,0,0,0,0,290,8.2,3,3,4828.0,77777,9,999999999,3,0.0860,0,88,0.100,0.0,0.0 +2012,12,23,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-10.6,44,100183,0,0,245,0,0,0,0,0,0,0,290,7.7,3,3,4828.0,77777,9,999999999,3,0.0860,0,88,0.100,0.0,0.0 +2012,12,23,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-8.9,51,100223,0,0,247,0,0,0,0,0,0,0,290,6.7,3,3,4828.0,77777,9,999999999,4,0.0860,0,88,0.100,0.0,0.0 +2012,12,23,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-8.9,51,100223,0,0,247,0,0,0,0,0,0,0,290,6.7,3,3,4828.0,77777,9,999999999,4,0.0860,0,88,0.100,0.0,0.0 +2012,12,23,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-9.4,49,100303,0,0,246,0,0,0,0,0,0,0,280,7.7,3,3,4828.0,77777,9,999999999,4,0.0860,0,88,0.100,0.0,0.0 +2012,12,24,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-9.4,49,100373,0,0,236,0,0,0,0,0,0,0,290,6.2,0,0,4828.0,77777,9,999999999,4,0.0860,0,88,0.100,0.0,0.0 +2012,12,24,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-9.4,49,100373,0,0,236,0,0,0,0,0,0,0,290,6.2,0,0,4828.0,77777,9,999999999,4,0.0860,0,88,0.100,0.0,0.0 +2012,12,24,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-10.6,46,100583,0,0,233,0,0,0,0,0,0,0,280,6.2,0,0,4828.0,77777,9,999999999,3,0.0860,0,88,0.100,0.0,0.0 +2012,12,24,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-10.0,49,100653,0,0,233,0,0,0,0,0,0,0,280,5.1,0,0,4828.0,77777,9,999999999,4,0.0860,0,88,0.100,0.0,0.0 +2012,12,24,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-10.0,49,100653,0,0,233,0,0,0,0,0,0,0,280,5.1,0,0,4828.0,77777,9,999999999,4,0.0860,0,88,0.100,0.0,0.0 +2012,12,24,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-10.0,47,100803,0,0,236,0,0,0,0,0,0,0,250,3.6,0,0,4828.0,77777,9,999999999,4,0.0860,0,88,0.100,0.0,0.0 +2012,12,24,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-10.0,47,100883,0,0,236,0,0,0,0,0,0,0,270,4.6,0,0,4828.0,77777,9,999999999,4,0.0860,0,88,0.100,0.0,0.0 +2012,12,24,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-10.0,47,100883,53,318,236,12,114,8,1405,0,937,292,270,4.6,0,0,4828.0,77777,9,999999999,4,0.0860,0,88,0.100,0.0,0.0 +2012,12,24,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-10.0,41,100963,259,1414,242,101,430,31,11912,5471,3662,1234,260,6.7,0,0,4828.0,77777,9,999999999,4,0.0860,0,88,0.100,0.0,0.0 +2012,12,24,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-10.0,38,101024,422,1414,275,188,500,70,21828,23191,8150,2831,260,7.2,9,9,4828.0,7620,9,999999999,4,0.0860,0,88,0.100,0.0,0.0 +2012,12,24,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.7,-10.0,38,101024,530,1414,275,255,447,113,29236,28068,13003,4527,260,7.2,9,9,4828.0,7620,9,999999999,4,0.0860,0,88,0.100,0.0,0.0 +2012,12,24,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-8.3,42,100924,576,1414,279,309,465,125,35483,30833,14409,5081,250,7.7,9,9,4828.0,7620,9,999999999,4,0.0860,0,88,0.100,0.0,0.0 +2012,12,24,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-7.8,42,100884,557,1414,282,324,498,125,37054,32777,14351,4999,250,8.8,9,9,4828.0,7620,9,999999999,5,0.0860,0,88,0.100,0.0,0.0 +2012,12,24,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,-7.8,42,100884,474,1414,282,229,237,136,25526,15716,15224,4852,250,8.7,9,9,4828.0,7620,9,999999999,5,0.0860,0,88,0.100,0.0,0.0 +2012,12,24,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-6.1,49,100874,333,1414,292,171,202,112,18625,10685,12251,3476,270,6.7,10,10,4828.0,1402,9,999999999,5,0.0860,0,88,0.100,0.0,0.0 +2012,12,24,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-6.1,49,100884,144,1414,284,94,133,63,9920,1687,6677,1522,260,5.1,9,9,4828.0,1402,9,999999999,5,0.0860,0,88,0.100,0.0,0.0 +2012,12,24,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,-6.1,49,100884,0,904,268,0,0,0,0,0,0,0,260,5.1,5,5,4828.0,1402,9,999999999,5,0.0860,0,88,0.100,0.0,0.0 +2012,12,24,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-6.1,51,100954,0,0,262,0,0,0,0,0,0,0,250,2.6,3,3,4828.0,77777,9,999999999,5,0.0860,0,88,0.100,0.0,0.0 +2012,12,24,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-5.6,53,100994,0,0,282,0,0,0,0,0,0,0,210,2.6,9,9,4828.0,1829,9,999999999,6,0.0860,0,88,0.100,0.0,0.0 +2012,12,24,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.2,-5.6,53,100994,0,0,290,0,0,0,0,0,0,0,210,2.6,10,10,4828.0,1829,9,999999999,6,0.0860,0,88,0.100,0.0,0.0 +2012,12,24,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-5.6,53,101014,0,0,290,0,0,0,0,0,0,0,240,3.6,10,10,4828.0,1981,9,999999999,6,0.0860,0,88,0.100,0.0,0.0 +2012,12,24,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-5.6,55,101034,0,0,260,0,0,0,0,0,0,0,240,6.7,3,3,4828.0,77777,9,999999999,6,0.0860,0,88,0.100,0.0,0.0 +2012,12,24,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-5.6,55,101034,0,0,250,0,0,0,0,0,0,0,240,6.7,0,0,4828.0,77777,9,999999999,6,0.0860,0,88,0.100,0.0,0.0 +2012,12,24,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-6.7,50,101084,0,0,248,0,0,0,0,0,0,0,240,6.7,0,0,4828.0,77777,9,999999999,5,0.0860,0,88,0.100,0.0,0.0 +2012,12,25,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-7.2,48,101124,0,0,248,0,0,0,0,0,0,0,240,6.7,0,0,4828.0,77777,9,999999999,5,0.0860,0,88,0.100,0.0,0.0 +2012,12,25,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-7.2,48,101124,0,0,259,0,0,0,0,0,0,0,240,6.7,3,3,4828.0,77777,9,999999999,5,0.0860,0,88,0.100,0.0,0.0 +2012,12,25,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-7.8,48,101213,0,0,245,0,0,0,0,0,0,0,240,7.2,0,0,4828.0,77777,9,999999999,5,0.0860,0,88,0.100,0.0,0.0 +2012,12,25,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-7.2,48,101223,0,0,248,0,0,0,0,0,0,0,260,6.7,0,0,4828.0,77777,9,999999999,5,0.0860,0,88,0.100,0.0,0.0 +2012,12,25,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-7.2,48,101223,0,0,248,0,0,0,0,0,0,0,260,6.7,0,0,4828.0,77777,9,999999999,5,0.0860,0,88,0.100,0.0,0.0 +2012,12,25,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-7.2,52,101373,0,0,244,0,0,0,0,0,0,0,250,4.1,0,0,4828.0,77777,9,999999999,5,0.0860,0,88,0.100,0.0,0.0 +2012,12,25,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-6.7,57,101513,0,0,253,0,0,0,0,0,0,0,250,3.1,3,3,4828.0,77777,9,999999999,5,0.0860,0,88,0.100,0.0,0.0 +2012,12,25,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-6.7,57,101513,51,308,257,11,96,8,1285,0,935,291,250,3.1,5,5,4828.0,77777,9,999999999,5,0.0860,0,88,0.100,0.0,0.0 +2012,12,25,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-7.8,46,101713,258,1414,262,101,419,32,11873,5268,3768,1267,280,4.1,5,5,4828.0,77777,9,999999999,5,0.0860,0,88,0.100,0.0,0.0 +2012,12,25,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-7.8,44,101703,421,1414,264,225,682,53,26683,28047,6299,2242,300,4.1,5,5,4828.0,77777,9,999999999,5,0.0860,0,88,0.100,0.0,0.0 +2012,12,25,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-7.8,44,101703,530,1414,264,337,815,62,40474,41445,7463,2763,300,4.1,5,5,4828.0,77777,9,999999999,5,0.0860,0,88,0.100,0.0,0.0 +2012,12,25,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-7.8,41,101644,576,1414,268,405,865,67,48817,46809,8095,3041,280,4.1,5,5,4828.0,77777,9,999999999,5,0.0860,0,88,0.100,0.0,0.0 +2012,12,25,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-8.3,37,101584,558,1414,270,417,869,69,49969,46787,8289,3086,260,3.6,5,5,4828.0,77777,9,999999999,4,0.0860,0,88,0.100,0.0,0.0 +2012,12,25,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-8.3,37,101584,476,1414,270,373,837,66,44061,40815,7816,2813,260,3.6,5,5,4828.0,77777,9,999999999,4,0.0860,0,88,0.100,0.0,0.0 +2012,12,25,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-9.4,34,101714,335,1414,269,279,753,60,32013,26420,6903,2301,290,3.1,5,5,4828.0,77777,9,999999999,4,0.0860,0,88,0.100,0.0,0.0 +2012,12,25,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-9.4,35,101704,146,1414,267,139,468,45,15121,0,4912,1340,310,3.6,5,5,4828.0,77777,9,999999999,4,0.0860,0,88,0.100,0.0,0.0 +2012,12,25,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,-9.4,35,101704,0,916,267,0,0,0,0,0,0,0,310,3.6,5,5,4828.0,77777,9,999999999,4,0.0860,0,88,0.100,0.0,0.0 +2012,12,25,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-9.4,38,101683,0,0,258,0,0,0,0,0,0,0,350,1.5,3,3,4828.0,77777,9,999999999,4,0.0860,0,88,0.100,0.0,0.0 +2012,12,25,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-7.8,46,101753,0,0,262,0,0,0,0,0,0,0,360,0.0,5,5,4828.0,77777,9,999999999,5,0.0860,0,88,0.100,0.0,0.0 +2012,12,25,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-7.8,46,101753,0,0,278,0,0,0,0,0,0,0,7,0.0,9,9,4828.0,77777,9,999999999,5,0.0860,0,88,0.100,0.0,0.0 +2012,12,25,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-5.6,60,101733,0,0,276,0,0,0,0,0,0,0,190,2.1,9,9,4828.0,6706,9,999999999,6,0.0860,0,88,0.100,0.0,0.0 +2012,12,25,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-6.7,52,101693,0,0,284,0,0,0,0,0,0,0,360,1.5,10,10,4828.0,5486,9,999999999,5,0.0860,0,88,0.100,0.0,0.0 +2012,12,25,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.1,-6.7,52,101693,0,0,284,0,0,0,0,0,0,0,360,1.5,10,10,4828.0,5486,9,999999999,5,0.0860,0,88,0.100,0.0,0.0 +2012,12,25,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-6.7,52,101633,0,0,276,0,0,0,0,0,0,0,360,2.1,9,9,4828.0,3353,9,999999999,5,0.0860,0,88,0.100,0.0,0.0 +2012,12,26,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-7.8,49,101593,0,0,281,0,0,0,0,0,0,0,10,2.6,10,10,4828.0,3353,9,999999999,5,0.0850,0,88,0.100,0.0,0.0 +2012,12,26,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.6,-7.8,49,101593,0,0,281,0,0,0,0,0,0,0,10,2.6,10,10,4828.0,3353,9,999999999,5,0.0850,0,88,0.100,0.0,0.0 +2012,12,26,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-5.6,58,101573,0,0,285,0,0,0,0,0,0,0,90,0.0,10,10,4828.0,1036,9,999999999,6,0.0850,0,88,0.100,0.0,0.0 +2012,12,26,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-3.9,67,101553,0,0,287,0,0,0,0,0,0,0,180,3.1,10,10,4828.0,945,9,999999999,7,0.0850,0,88,0.100,0.0,0.0 +2012,12,26,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.1,-3.9,67,101553,0,0,287,0,0,0,0,0,0,0,180,3.1,10,10,4828.0,945,9,999999999,7,0.0850,0,88,0.100,0.0,0.0 +2012,12,26,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-4.4,66,101563,0,0,285,0,0,0,0,0,0,0,350,3.6,10,10,4828.0,853,0,999099999,6,0.0850,0,88,0.100,0.0,0.0 +2012,12,26,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-3.9,72,101543,0,0,283,0,0,0,0,0,0,0,340,3.6,10,10,4828.0,914,0,999099999,7,0.0850,0,88,0.100,0.0,0.0 +2012,12,26,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.0,-3.9,72,101543,50,298,283,1,0,1,97,0,97,41,340,3.6,10,10,4828.0,914,0,999099999,7,0.0850,0,88,0.100,0.0,0.0 +2012,12,26,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-1.0,-4.0,78,101278,257,1414,278,9,0,9,886,0,892,393,330,4.6,10,10,3219.0,488,0,999099999,7,0.0850,0,88,0.100,0.0,0.0 +2012,12,26,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-1.0,-4.0,78,101278,420,1414,278,33,0,33,3291,0,3316,1468,330,3.6,10,10,4828.0,518,0,999099999,7,0.0850,0,88,0.100,0.0,0.0 +2012,12,26,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-0.6,-3.3,80,101693,529,1414,281,69,0,69,6941,0,6996,3031,340,4.1,10,10,4828.0,518,0,999099999,7,0.0850,0,88,0.100,0.0,0.0 +2012,12,26,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-2.8,79,101643,577,1414,284,84,0,84,8481,0,8550,3696,350,3.6,10,10,4828.0,488,0,999099999,8,0.0850,0,88,0.100,0.0,0.0 +2012,12,26,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-2.8,76,101623,559,1414,286,70,0,70,7057,0,7114,3126,340,4.1,10,10,4828.0,457,0,999099999,8,0.0850,0,88,0.100,0.0,0.0 +2012,12,26,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.6,-2.8,76,101623,477,1414,286,119,42,105,13541,2417,11992,4077,340,4.1,10,10,4828.0,457,0,999099999,8,0.0850,0,88,0.100,0.0,0.0 +2012,12,26,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-3.3,70,101753,337,1414,288,110,51,97,12131,2406,10739,3230,330,4.1,10,10,4828.0,518,0,999099999,7,0.0850,0,88,0.100,0.0,0.0 +2012,12,26,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-3.3,70,101823,148,1414,288,92,140,72,9612,2690,7557,1583,330,4.1,10,10,4828.0,579,0,999099999,7,0.0850,0,88,0.100,0.0,0.0 +2012,12,26,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.1,-3.3,70,101823,0,929,288,0,0,0,0,0,0,0,330,4.1,10,10,4828.0,579,0,999099999,7,0.0850,0,88,0.100,0.0,0.0 +2012,12,26,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-4.4,66,101923,0,0,257,0,0,0,0,0,0,0,330,4.6,3,3,4828.0,77777,0,999099999,6,0.0850,0,88,0.100,0.0,0.0 +2012,12,26,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-5.0,66,102023,0,0,244,0,0,0,0,0,0,0,320,4.1,0,0,4828.0,77777,0,999099999,6,0.0850,0,88,0.100,0.0,0.0 +2012,12,26,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-5.0,66,102023,0,0,244,0,0,0,0,0,0,0,320,4.1,0,0,4828.0,77777,9,999999999,6,0.0850,0,88,0.100,0.0,0.0 +2012,12,26,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-7.2,60,102133,0,0,238,0,0,0,0,0,0,0,320,4.6,0,0,4828.0,77777,9,999999999,5,0.0850,0,88,0.100,0.0,0.0 +2012,12,26,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-7.8,59,102202,0,0,235,0,0,0,0,0,0,0,330,5.1,0,0,4828.0,77777,9,999999999,5,0.0850,0,88,0.100,0.0,0.0 +2012,12,26,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-7.8,59,102202,0,0,235,0,0,0,0,0,0,0,330,5.1,0,0,4828.0,77777,9,999999999,5,0.0850,0,88,0.100,0.0,0.0 +2012,12,26,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-8.9,56,102302,0,0,233,0,0,0,0,0,0,0,330,4.6,0,0,4828.0,77777,9,999999999,4,0.0850,0,88,0.100,0.0,0.0 +2012,12,27,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-9.4,57,102332,0,0,230,0,0,0,0,0,0,0,320,5.7,0,0,4828.0,77777,9,999999999,4,0.0850,0,88,0.100,0.0,0.0 +2012,12,27,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-9.4,57,102332,0,0,244,0,0,0,0,0,0,0,320,5.7,5,5,4828.0,77777,9,999999999,4,0.0850,0,88,0.100,0.0,0.0 +2012,12,27,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-10.6,53,102532,0,0,228,0,0,0,0,0,0,0,320,5.7,0,0,4828.0,77777,9,999999999,4,0.0850,0,88,0.100,0.0,0.0 +2012,12,27,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.9,-11.1,53,102492,0,0,225,0,0,0,0,0,0,0,330,4.1,0,0,4828.0,77777,9,999999999,3,0.0850,0,88,0.100,0.0,0.0 +2012,12,27,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.9,-11.1,53,102492,0,0,235,0,0,0,0,0,0,0,330,4.1,3,3,4828.0,77777,9,999999999,3,0.0850,0,88,0.100,0.0,0.0 +2012,12,27,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-11.1,59,102482,0,0,221,0,0,0,0,0,0,0,330,1.5,0,0,4828.0,77777,9,999999999,3,0.0850,0,88,0.100,0.0,0.0 +2012,12,27,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-11.1,59,102512,0,0,231,0,0,0,0,0,0,0,320,3.1,3,3,4828.0,77777,9,999999999,3,0.0850,0,88,0.100,0.0,0.0 +2012,12,27,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-11.1,59,102512,48,289,235,11,118,7,1296,0,825,258,320,3.1,5,5,4828.0,77777,9,999999999,3,0.0850,0,88,0.100,0.0,0.0 +2012,12,27,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-10.6,53,102612,256,1415,241,74,236,40,8544,3837,4628,1522,330,3.1,5,5,4828.0,77777,9,999999999,4,0.0850,0,88,0.100,0.0,0.0 +2012,12,27,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-8.9,51,102622,420,1415,251,223,699,49,26600,27982,5856,2092,350,2.1,5,5,4828.0,77777,9,999999999,4,0.0850,0,88,0.100,0.0,0.0 +2012,12,27,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-8.9,51,102622,529,1415,265,332,801,62,39875,40856,7464,2762,350,2.1,9,9,4828.0,77777,9,999999999,4,0.0850,0,88,0.100,0.0,0.0 +2012,12,27,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-5.6,58,102403,577,1415,278,334,585,109,38760,36556,12694,4575,40,5.7,9,9,4828.0,9000,9,999999999,6,0.0850,0,88,0.100,0.0,0.0 +2012,12,27,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-4.4,61,102403,559,1415,289,290,342,152,32641,24287,17184,5745,30,4.6,10,10,4828.0,7620,9,999999999,6,0.0850,0,88,0.100,0.0,0.0 +2012,12,27,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.7,-4.4,61,102403,478,1415,289,222,203,143,24650,13705,15948,5027,30,4.6,10,10,4828.0,7620,9,999999999,6,0.0850,0,88,0.100,0.0,0.0 +2012,12,27,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.0,-4.0,67,101278,338,1415,287,188,280,108,20562,14374,11861,3444,40,4.6,10,10,4828.0,762,9,999999999,7,0.0850,0,88,0.100,0.0,0.0 +2012,12,27,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-3.3,67,102283,150,1415,290,73,39,61,7748,432,6501,1555,60,6.2,10,10,4828.0,762,9,999999999,7,0.0850,0,88,0.100,0.0,0.0 +2012,12,27,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,1.7,-3.3,67,102283,0,943,290,0,0,0,0,0,0,0,60,6.2,10,10,4828.0,762,9,999999999,7,0.0850,0,88,0.100,0.0,0.0 +2012,12,27,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-1.7,71,102143,0,0,297,0,0,0,0,0,0,0,90,7.7,10,10,4828.0,701,9,999999999,8,0.0850,0,88,0.100,0.0,0.0 +2012,12,27,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-0.6,78,102083,0,0,298,0,0,0,0,0,0,0,90,10.3,10,10,4828.0,640,0,919099999,9,0.0850,0,88,0.100,0.0,0.0 +2012,12,27,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,-0.6,78,102083,0,0,298,0,0,0,0,0,0,0,90,10.3,10,10,4828.0,640,0,999099999,9,0.0850,0,88,0.100,0.0,0.0 +2012,12,27,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.9,-0.6,72,101824,0,0,303,0,0,0,0,0,0,0,90,12.4,10,10,4828.0,762,0,999099999,9,0.0850,0,88,0.100,0.0,0.0 +2012,12,27,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,0.0,82,101683,0,0,299,0,0,0,0,0,0,0,90,12.9,10,10,4828.0,518,0,919099999,10,0.0850,0,88,0.100,5.0,0.0 +2012,12,27,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,2.8,0.0,82,101683,0,0,299,0,0,0,0,0,0,0,90,12.9,10,10,4828.0,518,0,919099999,10,0.0850,0,88,0.100,5.0,0.0 +2012,12,27,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.8,1.1,89,101304,0,0,300,0,0,0,0,0,0,0,90,13.4,10,10,6437.0,305,0,919099999,11,0.0850,0,88,0.100,5.0,0.0 +2012,12,28,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.3,1.7,89,101144,0,0,303,0,0,0,0,0,0,0,90,13.9,10,10,6437.0,396,0,919099999,12,0.0850,0,88,0.100,5.0,0.0 +2012,12,28,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,3.3,1.7,89,101144,0,0,303,0,0,0,0,0,0,0,90,13.9,10,10,6000.0,396,0,919099999,12,0.0850,0,88,0.100,1.1,0.0 +2012,12,28,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,3.3,1.7,89,100604,0,0,303,0,0,0,0,0,0,0,80,16.0,10,10,8047.0,396,0,919099999,12,0.0850,0,88,0.100,0.0,0.0 +2012,12,28,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,4.0,2.0,87,101279,0,0,306,0,0,0,0,0,0,0,70,17.5,10,10,4023.0,549,0,919099999,12,0.0850,0,88,0.100,0.0,0.0 +2012,12,28,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,4.4,3.3,93,100214,0,0,309,0,0,0,0,0,0,0,70,15.9,10,10,4800.0,549,0,919099999,14,0.0850,0,88,0.100,0.0,0.0 +2012,12,28,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,6.0,4.0,87,101279,0,0,317,0,0,0,0,0,0,0,70,15.4,10,10,4023.0,335,0,919099999,15,0.0850,0,88,0.100,0.0,0.0 +2012,12,28,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,6.0,5.0,93,101279,0,0,318,0,0,0,0,0,0,0,70,14.4,10,10,2414.0,274,0,919099999,16,0.0850,0,88,0.100,0.0,0.0 +2012,12,28,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,6.7,5.6,93,99745,47,281,322,6,0,6,578,0,582,225,70,14.9,10,10,2400.0,274,0,919099999,17,0.0850,0,88,0.100,0.0,0.0 +2012,12,28,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.0,7.0,100,101279,255,1415,325,74,113,54,8300,1998,6075,1916,60,8.8,10,10,3219.0,274,0,919099999,20,0.0850,0,88,0.100,0.0,0.0 +2012,12,28,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,8.0,7.0,93,101280,419,1415,330,70,90,50,8302,3208,5943,2128,70,12.4,10,10,4828.0,274,0,919099999,20,0.0850,0,88,0.100,0.0,0.0 +2012,12,28,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,7.8,6.7,93,99245,529,1415,328,59,71,42,7269,2980,5183,1945,70,11.8,10,10,4000.0,274,0,919099999,19,0.0850,0,88,0.100,0.0,0.0 +2012,12,28,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,8.0,7.0,93,101280,577,1415,330,22,0,22,2214,0,2232,1080,360,4.6,10,10,4828.0,152,0,919099999,20,0.0850,0,88,0.100,0.0,0.0 +2012,12,28,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,7.0,7.0,100,101279,561,1415,325,197,305,75,23376,15467,8924,3322,10,8.8,10,10,4023.0,396,0,919099999,20,0.0850,0,88,0.100,0.0,0.0 +2012,12,28,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,6.7,5.6,93,98905,480,1415,322,241,449,81,27946,21951,9421,3344,10,12.9,10,10,9000.0,396,0,919099999,17,0.0850,0,88,0.100,0.0,0.0 +2012,12,28,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,4.0,3.0,93,101279,340,1415,307,244,489,97,26892,22294,10733,3250,10,10.8,10,10,9000.0,244,0,919099999,13,0.0850,0,88,0.100,0.0,0.0 +2012,12,28,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,3.3,2.2,92,99235,152,1415,303,127,275,69,13332,4298,7276,1619,340,9.3,10,10,9000.0,244,0,919099999,12,0.0850,0,88,0.100,0.0,0.0 +2012,12,28,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,3.3,2.2,92,99235,0,958,303,0,0,0,0,0,0,0,340,9.3,10,10,9000.0,244,0,919099999,12,0.0850,0,88,0.100,0.0,0.0 +2012,12,28,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,0.0,-1.0,92,101278,0,0,286,0,0,0,0,0,0,0,330,8.2,10,10,4023.0,305,0,919099999,9,0.0850,0,88,0.100,0.0,0.0 +2012,12,28,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-0.6,-1.1,96,99644,0,0,283,0,0,0,0,0,0,0,340,7.2,10,10,4023.0,366,0,919099999,9,0.0850,0,88,0.100,0.0,0.0 +2012,12,28,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-0.6,-1.1,96,99644,0,0,283,0,0,0,0,0,0,0,340,7.2,10,10,4000.0,366,0,919099999,9,0.0850,0,88,0.100,5.0,0.0 +2012,12,28,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-1.0,-2.0,92,101278,0,0,280,0,0,0,0,0,0,0,330,8.2,10,10,6437.0,457,0,919099999,8,0.0850,0,88,0.100,5.0,0.0 +2012,12,28,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-1.0,-2.0,92,101278,0,0,280,0,0,0,0,0,0,0,330,7.2,10,10,6437.0,457,0,919099999,8,0.0850,0,88,0.100,5.0,0.0 +2012,12,28,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-1.1,-2.2,91,100074,0,0,280,0,0,0,0,0,0,0,320,8.2,10,10,4800.0,457,0,919099999,8,0.0850,0,88,0.100,5.0,0.0 +2012,12,28,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-2.8,79,100214,0,0,284,0,0,0,0,0,0,0,300,5.1,10,10,4800.0,853,0,919099999,7,0.0850,0,88,0.100,5.0,0.0 +2012,12,29,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-3.9,76,100314,0,0,280,0,0,0,0,0,0,0,300,7.7,10,10,4800.0,732,0,919099999,7,0.0850,0,88,0.100,2.2,0.0 +2012,12,29,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-0.6,-3.9,76,100314,0,0,280,0,0,0,0,0,0,0,300,7.7,10,10,4800.0,732,0,919099999,7,0.0850,0,88,0.100,0.0,0.0 +2012,12,29,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-5.6,68,100553,0,0,276,0,0,0,0,0,0,0,310,8.2,10,10,4800.0,853,0,919099999,6,0.0850,0,88,0.100,0.0,0.0 +2012,12,29,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-6.1,69,100653,0,0,273,0,0,0,0,0,0,0,310,7.2,10,10,4800.0,732,0,919099999,5,0.0850,0,88,0.100,0.0,0.0 +2012,12,29,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-1.7,-6.1,69,100653,0,0,266,0,0,0,0,0,0,0,310,7.2,9,9,4800.0,732,0,919099999,5,0.0850,0,88,0.100,0.0,0.0 +2012,12,29,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-7.2,65,100853,0,0,248,0,0,0,0,0,0,0,310,6.2,5,5,4800.0,77777,0,919099999,5,0.0850,0,88,0.100,0.0,0.0 +2012,12,29,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-7.8,62,100923,0,0,248,0,0,0,0,0,0,0,300,7.2,5,5,4800.0,77777,0,919099999,5,0.0850,0,88,0.100,0.0,0.0 +2012,12,29,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-7.8,62,100923,46,274,248,11,0,11,1064,0,1071,374,300,7.2,5,5,4800.0,77777,0,919099999,5,0.0850,0,88,0.100,0.0,0.0 +2012,12,29,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-7.8,57,101163,254,1415,252,97,425,29,11474,4435,3435,1159,300,6.7,5,5,4800.0,77777,0,919099999,5,0.0850,0,88,0.100,0.0,0.0 +2012,12,29,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-7.2,57,101193,419,1415,254,218,677,49,25991,26855,5854,2091,310,7.2,5,5,4800.0,77777,0,919099999,5,0.0850,0,88,0.100,0.0,0.0 +2012,12,29,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-7.2,57,101193,529,1415,254,329,797,59,39656,39887,7127,2644,310,7.2,5,5,4800.0,77777,0,919099999,5,0.0850,0,88,0.100,0.0,0.0 +2012,12,29,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-6.7,50,101173,578,1415,263,396,845,64,47906,45093,7760,2923,300,7.2,5,5,4800.0,77777,0,919099999,5,0.0850,0,88,0.100,0.0,0.0 +2012,12,29,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-6.1,51,101164,562,1415,266,410,852,66,49318,45131,7958,2975,310,7.2,5,5,4800.0,77777,0,919099999,5,0.0850,0,88,0.100,0.0,0.0 +2012,12,29,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.2,-6.1,51,101164,481,1415,262,369,825,63,43788,39588,7494,2715,310,7.2,3,3,4800.0,77777,0,919099999,5,0.0850,0,88,0.100,0.0,0.0 +2012,12,29,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,2.8,-5.6,51,101274,342,1415,265,279,749,57,32196,25610,6594,2226,310,5.1,3,3,4800.0,77777,0,919099999,6,0.0850,0,88,0.100,0.0,0.0 +2012,12,29,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-6.1,53,101303,154,1415,264,153,577,42,16814,0,4630,1321,300,6.2,5,5,4800.0,77777,0,919099999,5,0.0850,0,88,0.100,0.0,0.0 +2012,12,29,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.7,-6.1,53,101303,0,974,264,0,0,0,0,0,0,0,300,6.2,5,5,4800.0,77777,0,919099999,5,0.0850,0,88,0.100,0.0,0.0 +2012,12,29,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,1.1,-6.1,55,101473,0,0,258,0,0,0,0,0,0,0,290,6.7,3,3,4800.0,77777,0,919099999,5,0.0850,0,88,0.100,0.0,0.0 +2012,12,29,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-5.6,60,101523,0,0,260,0,0,0,0,0,0,0,270,5.1,5,5,4800.0,77777,0,919099999,6,0.0850,0,88,0.100,0.0,0.0 +2012,12,29,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.6,-5.6,60,101523,0,0,260,0,0,0,0,0,0,0,270,5.1,5,5,4800.0,77777,9,999999999,6,0.0850,0,88,0.866,0.0,0.0 +2012,12,29,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-5.6,62,101553,0,0,273,0,0,0,0,0,0,0,280,2.6,9,9,4800.0,6706,9,999999999,6,0.0850,0,88,0.866,0.0,0.0 +2012,12,29,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-5.6,66,101543,0,0,256,0,0,0,0,0,0,0,280,3.6,5,5,4800.0,77777,9,999999999,6,0.0850,0,88,0.866,0.0,0.0 +2012,12,29,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-5.6,66,101543,0,0,256,0,0,0,0,0,0,0,280,3.6,5,5,4800.0,77777,9,999999999,6,0.0850,0,88,0.866,0.0,0.0 +2012,12,29,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-5.6,66,101563,0,0,256,0,0,0,0,0,0,0,290,2.6,5,5,4800.0,77777,9,999999999,6,0.0850,0,88,0.866,0.0,0.0 +2012,12,30,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-5.0,69,101503,0,0,256,0,0,0,0,0,0,0,280,3.1,5,5,4800.0,77777,9,999999999,6,0.0850,0,88,0.866,0.0,0.0 +2012,12,30,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-5.0,69,101503,0,0,252,0,0,0,0,0,0,0,280,3.1,3,3,4800.0,77777,9,999999999,6,0.0850,0,88,0.866,0.0,0.0 +2012,12,30,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-5.0,72,101583,0,0,254,0,0,0,0,0,0,0,280,3.6,5,5,4800.0,77777,9,999999999,6,0.0850,0,88,0.866,0.0,0.0 +2012,12,30,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-5.0,72,101543,0,0,269,0,0,0,0,0,0,0,280,3.6,9,9,4800.0,3962,9,999999999,6,0.0850,0,88,0.866,0.0,0.0 +2012,12,30,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-1.1,-5.0,72,101543,0,0,277,0,0,0,0,0,0,0,280,3.6,10,10,4800.0,3962,9,999999999,6,0.0850,0,88,0.866,0.0,0.0 +2012,12,30,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-5.6,68,101473,0,0,276,0,0,0,0,0,0,0,290,2.1,10,10,4800.0,3962,9,999999999,6,0.0850,0,88,0.866,0.0,0.0 +2012,12,30,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-5.6,66,101463,0,0,271,0,0,0,0,0,0,0,290,2.6,9,9,4800.0,3962,9,999999999,6,0.0850,0,88,0.866,0.0,0.0 +2012,12,30,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-0.6,-5.6,66,101463,45,268,271,4,0,4,387,0,389,155,290,2.6,9,9,4800.0,3962,9,999999999,6,0.0850,0,88,0.866,0.0,0.0 +2012,12,30,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-5.0,69,101463,253,1415,279,13,0,13,1279,0,1288,557,14,0.0,10,10,4800.0,2743,9,999999999,6,0.0850,0,88,0.866,0.0,0.0 +2012,12,30,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-0.6,-4.4,73,101363,419,1415,280,130,191,73,15017,8779,8457,2919,6,0.0,10,10,4800.0,1829,9,999999999,6,0.0850,0,88,0.866,0.0,0.0 +2012,12,30,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-0.6,-4.4,73,101363,530,1415,280,58,0,58,5836,0,5883,2605,26,0.0,10,10,4800.0,1829,9,999999999,6,0.0850,0,88,0.866,0.0,0.0 +2012,12,30,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-5.0,66,101133,579,1415,282,93,0,93,9396,0,9473,4030,48,0.0,10,10,4800.0,3353,9,999999999,6,0.0850,0,88,0.866,0.0,0.0 +2012,12,30,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-5.6,62,100923,563,1415,281,29,0,29,2927,0,2950,1398,30,4.1,10,10,4800.0,2438,9,999999999,6,0.0850,0,88,0.866,0.0,0.0 +2012,12,30,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,0.0,-5.6,62,100923,483,1415,281,150,171,91,17301,9398,10530,3679,30,4.1,10,10,4800.0,2438,9,999999999,6,0.0850,0,88,0.866,0.0,0.0 +2012,12,30,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,0.0,-4.0,72,101278,345,1415,283,73,0,73,7235,0,7289,2700,20,4.1,10,10,4800.0,762,9,999999999,7,0.0850,0,88,0.866,0.0,0.0 +2012,12,30,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.0,-3.0,72,101278,157,1415,280,43,0,43,4195,0,4224,1350,30,3.6,9,9,3219.0,427,0,999099999,7,0.0850,0,88,0.866,0.0,0.0 +2012,12,30,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,0.0,-2.0,85,100534,0,991,285,0,0,0,0,0,0,0,360,4.6,10,10,2414.0,457,0,999099999,8,0.0850,0,88,0.866,0.0,0.0 +2012,12,30,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,0.0,-1.0,92,101278,0,0,286,0,0,0,0,0,0,0,20,5.1,10,10,2414.0,244,0,919099999,9,0.0850,0,88,0.866,0.0,0.0 +2012,12,30,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,2.0,1.0,93,101279,0,0,296,0,0,0,0,0,0,0,60,7.2,10,10,9656.0,305,0,919099999,11,0.0850,0,88,0.866,0.0,0.0 +2012,12,30,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,2.8,1.1,89,99904,0,0,300,0,0,0,0,0,0,0,60,8.2,10,10,9000.0,305,0,919999999,11,0.0850,0,88,0.866,4.0,0.0 +2012,12,30,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.7,0.6,92,99454,0,0,294,0,0,0,0,0,0,0,30,9.8,10,10,9656.0,305,0,919099999,10,0.0850,0,88,0.866,4.0,0.0 +2012,12,30,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,1.0,-1.0,86,101278,0,0,282,0,0,0,0,0,0,0,10,6.7,9,9,6437.0,244,0,919099999,9,0.0850,0,88,0.866,4.0,0.0 +2012,12,30,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,0.0,-1.1,91,99514,0,0,272,0,0,0,0,0,0,0,10,5.1,8,8,1600.0,244,0,919099999,9,0.0850,0,88,0.866,4.0,0.0 +2012,12,30,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-2.0,-2.0,100,101278,0,0,276,0,0,0,0,0,0,0,340,7.7,10,10,1609.0,183,0,919099999,8,0.0850,0,88,0.866,1.5,0.0 +2012,12,31,1,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9,-2.0,-3.0,92,101278,0,0,275,0,0,0,0,0,0,0,330,7.7,10,10,1609.0,549,0,919099999,7,0.0850,0,88,0.866,0.0,0.0 +2012,12,31,2,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9,-2.2,-2.8,95,99584,0,0,267,0,0,0,0,0,0,0,330,7.7,9,9,1600.0,549,0,919099999,7,0.0850,0,88,0.866,0.0,0.0 +2012,12,31,3,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-3.9,87,99694,0,0,266,0,0,0,0,0,0,0,310,6.2,9,9,1600.0,6706,0,919099999,7,0.0850,0,88,0.866,0.0,0.0 +2012,12,31,4,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-3.9,87,99724,0,0,251,0,0,0,0,0,0,0,300,4.6,5,5,1600.0,77777,0,919099999,7,0.0850,0,88,0.866,0.0,0.0 +2012,12,31,5,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-3.9,87,99724,0,0,251,0,0,0,0,0,0,0,300,4.6,5,5,1600.0,77777,0,919099999,7,0.0850,0,88,0.866,0.0,0.0 +2012,12,31,6,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-4.4,80,99884,0,0,268,0,0,0,0,0,0,0,300,6.2,9,9,1600.0,3048,0,919099999,6,0.0850,0,88,0.866,0.0,0.0 +2012,12,31,7,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-5.6,72,100023,0,0,274,0,0,0,0,0,0,0,310,7.2,10,10,1600.0,2134,0,919099999,6,0.0850,0,88,0.866,0.0,0.0 +2012,12,31,8,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-1.7,-5.6,72,100023,44,262,266,10,0,10,967,0,973,345,310,7.2,9,9,1600.0,2134,0,919099999,6,0.0850,0,88,0.866,0.0,0.0 +2012,12,31,9,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-7.8,65,100223,253,1415,267,97,371,37,11252,5173,4301,1423,300,9.3,10,10,1600.0,1676,0,919099999,5,0.0850,0,88,0.866,0.0,0.0 +2012,12,31,10,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-8.3,59,100323,419,1415,269,220,601,68,25572,27208,7926,2757,300,12.9,10,10,1600.0,1829,0,919099999,4,0.0850,0,88,0.866,0.0,0.0 +2012,12,31,11,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-2.2,-8.3,59,100323,530,1415,269,334,721,90,38980,41319,10537,3788,300,12.9,10,10,1600.0,1829,0,919099999,4,0.0850,0,88,0.866,0.0,0.0 +2012,12,31,12,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.2,-8.3,59,100373,580,1415,269,261,287,155,29479,20838,17584,5943,310,8.8,10,10,1600.0,2134,0,919099999,4,0.0850,0,88,0.866,0.0,0.0 +2012,12,31,13,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.7,-8.3,57,100383,565,1415,271,213,97,173,23765,7400,19393,6271,290,9.3,10,10,1600.0,2286,0,919099999,4,0.0850,0,88,0.866,0.0,0.0 +2012,12,31,14,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9*9*9*9*9*9,-1.7,-8.3,57,100383,485,1415,271,259,330,137,28929,22086,15368,4940,290,9.3,10,10,1600.0,2286,0,919099999,4,0.0850,0,88,0.866,0.0,0.0 +2012,12,31,15,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-10.6,44,100503,347,1415,264,218,356,98,24128,17662,10888,3307,300,10.8,9,9,1600.0,7620,0,919099999,3,0.0850,0,88,0.866,0.0,0.0 +2012,12,31,16,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-11.1,42,100623,160,1415,249,143,474,58,15348,5386,6249,1593,310,7.2,5,5,1600.0,77777,0,919099999,3,0.0850,0,88,0.866,0.0,0.0 +2012,12,31,17,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-1.1,-11.1,42,100623,0,1008,245,0,0,0,0,0,0,0,310,7.2,3,3,1600.0,77777,0,919099999,3,0.0850,0,88,0.866,0.0,0.0 +2012,12,31,18,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-2.8,-11.7,46,100953,0,0,228,0,0,0,0,0,0,0,300,9.3,0,0,1600.0,77777,0,919099999,3,0.0850,0,88,0.866,0.0,0.0 +2012,12,31,19,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-12.8,44,101083,0,0,226,0,0,0,0,0,0,0,290,10.3,0,0,1600.0,77777,0,919099999,3,0.0850,0,88,0.866,0.0,0.0 +2012,12,31,20,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-3.3,-12.8,44,101083,0,0,226,0,0,0,0,0,0,0,290,10.3,0,0,1600.0,77777,9,999999999,3,0.0850,0,88,0.866,0.0,0.0 +2012,12,31,21,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-4.4,-13.3,46,101252,0,0,221,0,0,0,0,0,0,0,300,10.3,0,0,1600.0,77777,9,999999999,3,0.0850,0,88,0.866,0.0,0.0 +2012,12,31,22,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-13.3,48,101332,0,0,220,0,0,0,0,0,0,0,300,10.8,0,0,1600.0,77777,9,999999999,3,0.0850,0,88,0.866,0.0,0.0 +2012,12,31,23,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.0,-13.3,48,101332,0,0,220,0,0,0,0,0,0,0,300,10.8,0,0,1600.0,77777,9,999999999,3,0.0850,0,88,0.866,0.0,0.0 +2012,12,31,24,60,?9?9?9?9E0?9?9?9?9?9?9?9?9?9?9?9*9?9*9*9*9*9,-5.6,-13.9,48,101412,0,0,217,0,0,0,0,0,0,0,300,7.2,0,0,1600.0,77777,9,999999999,3,0.0850,0,88,0.866,0.0,0.0 diff --git a/tests/resources/weather/USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2004-2018.stat b/tests/resources/weather/USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2004-2018.stat new file mode 100644 index 0000000..bb40ae5 --- /dev/null +++ b/tests/resources/weather/USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2004-2018.stat @@ -0,0 +1,702 @@ + -EnergyPlus Weather Converter Version 2020.03.11 + Statistics for USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2004-2018 + Location -- Boston Logan Intl AP MA USA + {N 42° 21.66'} {W 71° 0.60'} {GMT -5.0 Hours} + Elevation -- 4 m above sea level + Standard Pressure at Elevation -- 101281 Pa + Data Source -- ISD-TMYx + + WMO Station 725090 + -alternate WMO Station same + + Comment 1: NCEI ISD - #years=[15] Period of Record=2004-2018; Jan=2010; + Feb=2013; Mar=2008; Apr=2015; May=2014; Jun=2013; Jul=2008; Aug=2015; Sep=2011; + Oct=2010; Nov=2016; Dec=2012 + + Comment 2: Downloaded from Climate.Onebuilding.org -- Ground temps represent + undisturbed earth temperatures - calculated from this weather data. + + - Actual Data Years for Monthly Data** + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + 2010 2013 2008 2015 2014 2013 2008 2015 2011 2010 2016 2012 + - ** Not all weather data sources represent contiguous years. + - ** Monthly data values may come from different years. + + ========================= Handbook Conditions for Design ========================= + - Displaying Design Conditions from "2017 ASHRAE Handbook -- Fundamentals - Chapter 14 Climatic Design Information" + - ASHRAE design conditions are carefully generated from a period of record + - (typically 30 years) to be representative of that location and to be suitable + - for use in heating/cooling load calculations. + + DesignStat Coldest Month Heating DB Humidification DP/MC Coldest Month WS/MCD MCWS/PCWD to 99.6% D + Units {} {°C} {°C} {°C} {} {°C} {°C} {} {°C} {m/s} {°C} {m/s} {°C} {m/s} {deg} + Heating 1 -13.1 -10.3 -23.7 0.4 -11.7 -21.1 0.6 -8.6 14.2 3.2 12.6 0 7 290 + + DesignStat HottestMonth Cooling DB/MCWB Evaporation WB/MCDB MCWS/PCWD to 0.4% DB Dehumidification DP/ Enthaply/MCDB Extreme Max WB + Units {} {°C} {°C} {°C} {°C} {°C} {°C} {°C} {°C} {°C} {°C} {°C} {°C} {°C} {m/s} {deg} {°C} {} {°C} {°C} {} {°C} {°C} {} {°C} {kJ/kg} {°C} {kJ/kg} {°C} {kJ/kg} {°C} {°C} + Cooling 7 8.2 32.6 22.6 30.9 22 29.1 21.1 24.3 29.8 23.4 28.3 22.6 27.1 6.3 240 22.6 17.3 26.9 21.8 16.5 25.9 21.1 15.7 25.3 73.1 30.1 69.5 28.3 66.5 27.1 27 + + DesignStat Extreme Annual WS Extreme Annual DB n-Year Return Period + Units {m/s} {m/s} {m/s} {°C} {°C} {°C} {°C} {°C} {°C} {°C} {°C} {°C} {°C} {°C} {°C} {°C} + Extremes 12 10.7 9.3 -16 35.3 2.4 1.8 -17.7 36.7 -19.1 37.7 -20.4 38.8 -22.2 40.1 -17.1 + + - Monthly Optical Sky Depth Beam (taub) and Diffuse (taud) + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + taub (beam) 0.293 0.302 0.325 0.37 0.406 0.452 0.472 0.434 0.376 0.335 0.311 0.295 + taud (diffuse) 2.505 2.493 2.487 2.392 2.329 2.234 2.185 2.278 2.423 2.543 2.571 2.568 + + taub - Clear Sky Optical Depth for Beam Irradiance + taud - Clear Sky Optical Depth for Diffuse Irradiance + + - Monthly Solar Irradiance Wh/m² (noon on 21st of month) + ib (beam) 861 909 923 899 870 827 805 826 856 859 834 830 + id (diffuse) 71 85 96 114 125 138 143 127 102 80 67 63 + + ib - Clear Sky Noon Beam Normal Irradiance on 21st Day + id - Clear Sky Noon Diffuse Horizontal Irradiance on 21st Day + + - Average Monthly Mean Daily All-Sky Radiation Wh/m² + Avg Rad 1780 2710 3670 4820 5250 5620 5940 5360 4360 2840 1900 1450 + + - Monthly Drybulb and Mean Coincident Wetbulb Temperatures [C] + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + Drybulb 0.4% 16 15.1 22.5 28.5 31.2 33.6 35.3 34 31.3 26.8 21.2 17.4 + Coincident Wetbulb 0.4% 13.2 11.6 14.1 16.8 20.1 23 24.5 23.5 22.4 18.6 15.5 14.1 + Drybulb 2.0% 12.1 11.4 16.2 22.4 27.2 31.3 32.7 31.6 28.3 23 18.2 13.8 + Coincident Wetbulb 2.0% 9.9 7.8 10.8 13.9 18.1 21.7 22.9 22.6 21 17.4 14.3 11.4 + Drybulb 5.0% 8.9 8.6 12.9 18.8 24.1 29 31 29.5 26.1 20.7 16 11.3 + Coincident Wetbulb 5.0% 6.5 5.2 8.3 12.2 16.4 20.7 22.3 21.8 20.1 16.1 12.6 8.6 + Drybulb 10.% 6.3 6.4 10.2 15.9 21.3 26.9 29.2 27.8 24 18.6 13.8 8.8 + Coincident Wetbulb 10.% 4 3.5 6.4 10.6 15.1 19.6 21.5 21 19.1 14.7 10.8 6.2 + + Drybulb 0.4% - 0.4% Monthly Design Drybulb Temperature + Coincident Wetbulb 0.4% - 0.4% Monthly Mean Coincident Wetbulb Temperature + Drybulb 2.0% - 2.0% Monthly Design Drybulb Temperature + Coincident Wetbulb 2.0% - 2.0% Monthly Mean Coincident Wetbulb Temperature + Drybulb 5.0% - 5.0% Monthly Design Drybulb Temperature + Coincident Wetbulb 5.0% - 5.0% Monthly Mean Coincident Wetbulb Temperature + Drybulb 10.% - 10.% Monthly Design Drybulb Temperature + Coincident Wetbulb 10.% - 10.% Monthly Mean Coincident Wetbulb Temperature + + - Monthly Drybulb and Wetbulb Daily Ranges [deltaC] + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + Drybulb 7.2 7.4 7.5 8.1 8.2 8.5 8.2 7.7 7.7 7.7 7 6.8 + Drybulb range - DB 5% 10 10 12.1 13.8 13.2 11.9 10.8 10.4 10.2 10.4 9.8 9.5 + Wetbulb range - DB 5% 9.2 8 8.5 7.8 6.6 5.7 4.5 4.5 5.4 6.5 7.7 8.6 + + Drybulb - Mean Daily Dry Bulb Temperature Range + Drybulb range - DB 5% - Mean Daily Dry Bulb Temperature Range Coincident with 5% Design Dry Bulb Temperature + Wetbulb range - DB 5% - Mean Daily Wet Bulb Temperature Range Coincident with 5% Design Dry Bulb Temperature + + - Monthly Standard Heating/Cooling Degree Days/Hours + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + HDD base 10C 343 281 203 62 6 0 0 0 1 17 106 246 + HDD base 18.3C 600 514 454 273 134 29 2 3 41 180 333 500 + + CDD base 10C 2 1 8 42 146 300 410 386 254 101 23 4 + CDD base 18.3C 0 0 1 2 16 79 154 130 45 5 1 0 + + CDH base 23.3C 0 0 4 38 144 599 1217 864 242 28 1 0 + CDH base 26.7C 0 0 1 13 44 203 441 265 60 4 0 0 + + - 1676 annual (standard) cooling degree-days (10C baseline) + - 1264 annual (standard) heating degree-days (10C baseline) + + - 431 annual (standard) cooling degree-days (18.3C baseline) + - 3062 annual (standard) heating degree-days (18.3C baseline) + + - Monthly Standard Average Liquid Precipitation mm + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + Average 91 92 94 91 83 78 72 82 78 84 107 102 + Maximum 268 180 200 167 186 172 132 203 179 220 208 247 + Minimum 19 22 38 32 13 15 14 21 21 20 16 25 + + - 1054 annual (standard) liquid precipitation + - 1376 annual (standard) maximum liquid precipitation + - 670 annual (standard) minimum liquid precipitation + + - Monthly Standard Average Temperature [C] + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + Average -1 0 3.7 9.3 14.5 20 23.2 22.4 18.5 12.7 7.3 2.2 + + - 11.1 annual (standard) average temperature + + - Monthly Standard Average WindSpeed m/s + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + Average 5.5 5.6 5.7 5.5 4.9 4.7 4.5 4.4 4.6 5 5.1 5.5 + + - 5.1 annual (standard) wind speed + + - Climate Zone "5A" (ASHRAE Standard 169-2013) + - Cool - Humid, Probable Köppen classification=Dfa, Humid Continental (Warm Summer) + - Calculated Climate Zone based on algorithm from indicated standard (169-2013) + + ========================= Source Weather Data Statistics ========================= + - The following information is derived directly from the source weather data. + - It may not be indicative of the long term climate for this location. + + - Monthly Statistics for Dry Bulb temperatures [C] + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + Maximum 14.0 8.3 16.0 20.6 28.9 34.4 34.4 32.2 30.0 27.2 20.0 16.0 + Day:Hour 25:18 15:13 5:12 13:12 12:15 24:15 20:15 15:15 5:12 1:11 3:13 11:15 + + Minimum -14.4 -9.4 -11.1 -0.6 6.7 11.7 16.0 16.1 9.4 3.8 -0.6 -5.6 + Day:Hour 30:06 9:24 1:05 1:04 28:24 14:01 6:24 8:04 17:06 31:21 22:01 31:24 + + Daily Avg -1.3 -0.6 2.8 8.8 14.6 20.6 23.6 23.2 19.4 12.9 7.7 3.6 + + Daily Range 6.4 6.0 7.1 8.0 7.8 8.6 7.8 7.9 7.1 7.3 7.4 5.9 + + - Maximum Dry Bulb temperature of 34.4C on Jun 24 + - Minimum Dry Bulb temperature of -14.4C on Jan 30 + + - Monthly Statistics for Extreme Dry Bulb temperatures [C] + #Days Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + Max >= 32 4 2 1 + Max <= 0 10 9 1 2 + Min <= 0 28 25 18 3 3 17 + Min <=-18 + + - Monthly Statistics for Dew Point temperatures [C] + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + Maximum 12.0 6.0 11.0 14.0 17.0 22.0 22.2 23.0 22.0 21.1 15.0 14.0 + Day:Hour 25:18 11:19 9:21 21:09 10:19 28:13 25:08 21:12 4:15 1:12 4:14 11:15 + + Minimum -25.0 -18.9 -20.9 -17.2 -5.0 3.3 11.7 10.0 0.6 -7.2 -9.4 -15.6 + Day:Hour 30:04 7:06 1:04 1:19 6:19 4:06 11:19 6:15 16:19 9:13 15:15 1:15 + + Daily Avg -7.8 -7.0 -5.4 0.5 7.3 14.0 17.3 16.8 14.8 5.7 1.6 -1.5 + + - Maximum Dew Point temperature of 23.0C on Aug 21 + - Minimum Dew Point temperature of -25.0C on Jan 30 + + - Average Hourly Statistics for Dry Bulb temperatures [C] + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + 0:01- 1:00 -2.3 -1.4 1.4 7.0 12.6 18.1 21.4 21.0 17.7 11.7 6.0 3.1 + 1:01- 2:00 -2.4 -1.6 1.3 6.7 12.6 18.1 21.4 21.0 17.7 11.6 5.9 3.1 + 2:01- 3:00 -2.9 -1.9 0.8 6.3 12.2 17.5 21.2 20.2 17.4 11.0 5.7 2.7 + 3:01- 4:00 -3.2 -2.0 0.7 6.1 12.0 17.2 20.9 19.9 17.2 10.9 5.4 2.6 + 4:01- 5:00 -3.2 -2.0 0.7 6.1 12.1 17.2 20.9 20.0 17.2 10.9 5.4 2.6 + 5:01- 6:00 -3.3 -2.3 0.5 6.4 12.7 18.2 21.5 20.4 17.1 10.7 5.3 2.6 + 6:01- 7:00 -3.4 -2.3 0.6 7.4 13.9 19.4 22.3 21.3 18.0 11.1 5.5 2.6 + 7:01- 8:00 -3.4 -2.3 0.7 8.1 13.8 19.3 22.4 21.4 18.0 11.1 5.5 2.6 + 8:01- 9:00 -2.5 -1.3 2.2 9.1 15.3 21.3 24.6 24.2 20.2 13.0 7.4 3.2 + 9:01-10:00 -1.6 -0.5 3.2 9.8 15.7 22.4 25.4 25.1 20.8 13.9 8.5 3.8 + 10:01-11:00 -1.5 -0.5 3.3 10.3 15.9 22.4 25.6 25.2 20.8 14.1 8.5 3.8 + 11:01-12:00 0.1 0.8 4.6 10.9 16.7 23.4 26.1 26.4 22.0 15.3 10.0 4.8 + 12:01-13:00 0.9 1.2 4.9 10.9 17.0 23.7 26.3 26.4 21.9 15.5 10.6 5.2 + 13:01-14:00 0.9 1.2 4.8 11.2 17.0 23.8 26.5 26.5 22.0 15.4 10.6 5.3 + 14:01-15:00 1.2 1.2 5.3 11.2 16.5 23.7 26.7 26.3 21.7 15.3 10.6 5.3 + 15:01-16:00 0.9 1.2 5.0 11.4 16.6 23.6 26.3 25.7 21.4 15.1 10.1 4.6 + 16:01-17:00 0.9 1.2 5.1 11.1 16.6 23.6 26.5 25.5 21.4 15.1 10.1 4.6 + 17:01-18:00 0.3 0.5 4.0 10.4 15.7 22.0 25.0 24.8 20.2 13.7 8.9 4.1 + 18:01-19:00 -0.2 0.1 3.8 9.5 15.3 21.2 24.1 23.8 19.6 13.1 8.4 4.0 + 19:01-20:00 -0.3 0.1 3.8 9.0 15.1 21.0 24.0 23.7 19.6 13.1 8.4 4.0 + 20:01-21:00 -1.1 -0.4 3.3 8.7 14.1 19.7 22.5 22.6 18.8 12.4 7.7 3.5 + 21:01-22:00 -1.4 -0.6 2.9 8.1 13.9 19.3 22.2 22.1 18.5 11.9 7.0 3.2 + 22:01-23:00 -1.4 -0.8 2.9 7.9 14.0 19.2 22.2 22.1 18.6 12.0 6.9 3.3 + 23:01-24:00 -1.9 -1.4 2.1 7.6 13.3 18.3 21.6 21.4 18.1 11.4 6.2 2.9 + Max Hour 15 13 15 16 13 14 15 14 14 13 14 15 + Min Hour 8 7 6 4 4 4 4 4 6 6 6 4 + + - Average Hourly Statistics for Dew Point temperatures [C] + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + 0:01- 1:00 -7.9 -7.0 -5.4 0.5 7.3 13.5 17.4 17.0 14.5 6.1 1.3 -1.3 + 1:01- 2:00 -8.0 -7.1 -5.3 0.4 7.4 13.5 17.4 17.0 14.5 6.1 1.3 -1.3 + 2:01- 3:00 -8.3 -7.2 -5.6 0.4 7.2 13.5 17.5 16.8 14.4 6.3 1.1 -1.6 + 3:01- 4:00 -8.5 -7.4 -5.8 0.6 7.3 13.2 17.5 16.5 14.3 6.2 1.2 -1.5 + 4:01- 5:00 -8.5 -7.5 -5.8 0.5 7.3 13.3 17.4 16.6 14.3 6.2 1.2 -1.5 + 5:01- 6:00 -8.7 -7.5 -6.2 0.6 7.3 13.5 17.6 16.8 14.3 6.1 1.1 -1.7 + 6:01- 7:00 -8.7 -7.6 -6.3 0.7 7.6 13.6 17.5 16.9 14.5 6.1 1.1 -1.7 + 7:01- 8:00 -8.7 -7.6 -6.3 0.5 7.5 13.6 17.6 16.9 14.6 6.1 1.0 -1.7 + 8:01- 9:00 -8.7 -7.2 -5.9 0.6 7.6 14.0 17.3 16.8 15.0 6.2 1.3 -1.7 + 9:01-10:00 -8.3 -7.1 -5.7 0.3 7.3 14.0 17.5 16.7 15.0 6.0 1.6 -1.7 + 10:01-11:00 -8.3 -7.1 -5.6 0.1 7.3 14.0 17.5 16.9 15.0 6.0 1.7 -1.6 + 11:01-12:00 -7.7 -7.0 -4.8 0.1 7.2 14.3 17.2 16.7 15.1 5.6 2.1 -1.6 + 12:01-13:00 -7.5 -6.7 -4.6 0.2 7.1 14.3 17.1 16.6 15.0 5.3 2.3 -1.3 + 13:01-14:00 -7.6 -6.7 -4.6 0.1 7.1 14.3 17.1 16.6 15.1 5.4 2.3 -1.3 + 14:01-15:00 -7.1 -6.5 -4.8 0.4 7.1 14.3 16.8 16.6 15.1 5.0 2.1 -1.4 + 15:01-16:00 -6.9 -6.5 -5.1 0.2 6.9 14.4 16.8 16.6 15.2 5.1 2.0 -1.8 + 16:01-17:00 -6.9 -6.5 -5.0 0.3 6.9 14.4 16.9 16.7 15.2 5.0 2.0 -1.8 + 17:01-18:00 -6.9 -6.6 -5.2 0.3 7.0 14.4 16.8 16.5 15.0 5.4 2.1 -1.5 + 18:01-19:00 -6.8 -6.5 -5.4 0.5 7.3 14.3 17.0 16.6 14.9 5.7 2.0 -1.2 + 19:01-20:00 -7.0 -6.5 -5.4 0.8 7.5 14.2 17.1 16.6 14.9 5.9 2.0 -1.3 + 20:01-21:00 -7.6 -6.5 -5.1 0.8 7.6 14.2 17.4 17.0 15.0 5.6 1.9 -1.3 + 21:01-22:00 -7.6 -6.6 -4.9 0.8 7.5 14.0 17.2 17.0 14.7 5.5 1.8 -1.3 + 22:01-23:00 -7.6 -6.8 -5.0 0.8 7.6 14.0 17.2 17.0 14.8 5.5 1.6 -1.3 + 23:01-24:00 -8.0 -7.0 -5.2 1.1 7.4 13.8 17.2 17.1 14.7 5.5 1.5 -1.5 + Max Hour 19 20 14 24 23 18 6 24 16 3 14 19 + Min Hour 6 7 7 12 17 4 15 18 6 15 8 16 + + - Monthly Statistics for Relative Humidity [%] + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + Maximum 100 100 96 100 100 100 100 100 100 100 100 100 + Day:Hour 19:12 8:19 13:14 3:22 16:15 11:24 6:24 4:06 8:10 5:14 4:07 9:06 + + Minimum 17 20 17 15 14 25 33 30 31 17 13 24 + Day:Hour 10:15 18:15 24:16 1:19 11:15 15:16 20:15 2:16 16:15 9:13 15:15 1:15 + + Daily Avg 60 62 56 60 65 69 69 70 76 64 68 69 + + - Average Hourly Relative Humidity [%] + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + 0:01- 1:00 64 66 61 65 73 76 79 79 82 70 73 72 + 1:01- 2:00 64 66 62 66 73 76 78 79 82 70 73 73 + 2:01- 3:00 65 66 62 67 73 78 80 82 83 74 73 72 + 3:01- 4:00 65 66 62 69 74 79 81 82 84 74 75 73 + 4:01- 5:00 65 66 62 68 74 79 81 81 84 74 75 74 + 5:01- 6:00 64 66 61 67 72 75 79 81 83 74 75 73 + 6:01- 7:00 65 66 60 64 69 71 75 77 81 72 74 73 + 7:01- 8:00 65 66 60 61 69 71 75 77 81 72 73 72 + 8:01- 9:00 61 64 56 58 64 66 65 65 73 65 67 70 + 9:01-10:00 59 61 54 55 61 62 63 62 71 61 64 67 + 10:01-11:00 59 61 54 53 60 62 62 62 70 60 64 68 + 11:01-12:00 56 57 52 52 58 59 60 58 66 55 61 64 + 12:01-13:00 54 57 53 51 57 58 59 58 67 54 59 64 + 13:01-14:00 53 58 53 51 57 58 58 57 67 55 59 64 + 14:01-15:00 54 58 51 52 59 59 57 58 68 54 59 63 + 15:01-16:00 57 57 52 51 57 59 59 60 70 55 60 64 + 16:01-17:00 56 57 52 52 57 59 58 61 70 55 61 64 + 17:01-18:00 59 60 54 54 60 65 62 63 73 60 65 68 + 18:01-19:00 61 62 54 58 63 68 67 67 75 63 66 69 + 19:01-20:00 60 62 54 60 64 68 67 67 76 64 66 69 + 20:01-21:00 60 63 55 61 68 73 74 72 80 65 69 70 + 21:01-22:00 61 64 57 64 68 73 74 74 79 66 70 72 + 22:01-23:00 61 64 56 64 68 74 74 74 79 66 70 72 + 23:01-24:00 62 66 59 66 70 77 77 78 81 68 72 72 + Max Hour 5 8 3 4 4 5 4 4 5 6 6 5 + Min Hour 14 16 15 14 14 14 15 14 12 15 15 15 + + - Monthly Indicators for Precipitation/Moisture [kPa] + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + 0.4 0.4 0.5 0.7 1.1 1.7 1.9 1.9 1.8 0.9 0.8 0.6 + + - Monthly Statistics for Wind Chill/Heat Index temperatures [C] ** + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + Minimum WC -32 -29 -21 -13 -1 6 -5 -14 -23 + Day:Hour 29:07 9:01 1:03 9:02 28:13 17:06 15:19 22:09 31:22 + + Average WC -10 -9 -6 -1 5 6 2 -1 -4 + Avg Del WC 9 9 8 6 4 4 6 6 7 + # Hours WC 708 650 687 397 56 1 157 460 641 + + Maximum HI 36 34 33 32 29 + Day:Hour 24:16 10:12 15:15 4:16 1:11 + + Average HI 31 30 30 30 29 + Avg Del HI 1 1 1 1 2 + # Hours HI 71 120 91 36 1 + + - **WindChill/HeatIndex Temps -- statistics...only those different from Air Temps + + + - Monthly Statistics for UTCI - Universal Thermal Climate Index [Stress] + #Hours Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + Extreme Heat + V Strong Heat + Strong Heat 3 1 + Moderate Heat 27 27 11 + Slight Heat 14 46 53 11 + Comfort 1 54 316 580 670 680 617 175 60 11 + Slight Cold 23 34 54 270 364 88 83 344 282 153 + Moderate Cold 292 268 381 328 64 8 9 223 289 366 + Strong Cold 317 267 289 68 2 89 197 + V Strong Cold 94 96 19 17 + Extreme Cold 18 7 + + - 0 annual Extreme Heat Stress hours + - 0 annual Very Strong Heat Stress hours + - 4 annual Strong Heat Stress hours + - 65 annual Moderate Heat Stress hours + - 124 annual Slight Heat Stress hours + - 3164 annual Comfort [no thermal Heat Stress] hours + - 1695 annual Slight Cold Stress hours + - 2228 annual Moderate Cold Stress hours + - 1229 annual Strong Cold Stress hours + - 226 annual Very Strong Cold Stress hours + - 25 annual Extreme Cold Stress hours + + - Monthly Wind Direction {Interval 11.25 deg from displayed deg) [%] + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + N (0) 8 9 4 4 4 4 3 4 6 4 9 8 + ENE (22.5) 2 2 5 4 3 4 1 4 3 3 2 3 + NE (45) 1 3 6 5 6 4 2 2 4 8 1 2 + ENE (67.5) 1 3 5 6 8 6 4 3 5 3 1 7 + E (90) 1 6 4 8 13 7 7 6 17 4 4 8 + ESE (112.5) 2 4 4 5 7 3 7 6 6 3 3 3 + SE (135) 1 4 4 4 5 2 5 5 5 2 2 1 + SSE (157.5) 2 3 3 1 4 1 3 3 3 1 2 1 + S (180) 2 6 5 6 9 5 8 11 7 5 4 5 + SSW (202.5) 3 4 4 6 4 15 16 8 13 8 3 7 + SW (225) 4 4 7 8 4 12 15 9 10 7 6 5 + WSW (247.5) 3 2 2 4 4 8 11 8 5 8 7 6 + W (270) 17 19 14 14 11 12 9 19 4 17 14 10 + WNW (292.5) 20 12 14 10 10 9 6 8 4 16 13 13 + NW (315) 20 10 9 7 7 4 3 3 4 8 15 10 + NNW (337.5) 11 9 11 8 4 4 1 2 3 5 13 11 + + - Monthly Statistics for Wind Speed [m/s] + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + Maximum 13.9 17.0 14.4 14.4 12.4 14.4 10.8 11.3 14.4 13.9 12.4 17.5 + Day:Hour 25:18 8:20 9:24 22:14 10:19 17:18 4:16 1:15 29:18 15:12 12:24 28:04 + + Minimum 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + Day:Hour 14:09 5:22 8:03 1:22 1:21 3:10 3:19 5:06 6:03 11:16 2:10 1:13 + + Daily Avg 5.3 5.6 5.6 5.3 4.5 4.7 4.1 3.9 3.9 5.5 4.7 4.9 + + - Maximum Wind Speed of 17.5 m/s on Dec 28 + - Minimum Wind Speed of 0.0 m/s on Jan 14 + + - Average Hourly Statistics for Wind Speed [m/s] + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + 0:01- 1:00 5.2 5.2 5.2 4.9 3.6 4.6 3.2 3.0 2.8 4.9 4.1 5.1 + 1:01- 2:00 5.1 5.3 5.3 4.8 3.7 4.6 3.2 3.0 2.9 5.0 4.1 5.2 + 2:01- 3:00 4.9 5.0 5.1 4.3 3.5 4.4 2.9 2.8 3.1 4.7 4.1 4.9 + 3:01- 4:00 4.9 5.0 5.5 4.3 3.6 4.1 2.9 3.2 3.3 4.8 4.4 4.9 + 4:01- 5:00 4.9 4.9 5.4 4.3 3.5 4.1 2.9 3.2 3.5 4.7 4.4 5.0 + 5:01- 6:00 4.8 5.3 5.4 4.1 4.0 3.8 3.1 3.1 3.4 5.1 4.2 4.6 + 6:01- 7:00 4.9 5.4 5.6 4.5 4.1 4.0 3.5 3.3 3.7 5.2 4.6 4.7 + 7:01- 8:00 4.8 5.4 5.7 4.7 4.1 4.0 3.6 3.4 3.6 5.3 4.4 4.8 + 8:01- 9:00 5.5 5.8 5.7 5.5 4.6 4.5 4.0 3.5 3.7 5.9 5.0 4.7 + 9:01-10:00 5.4 6.2 5.6 5.6 4.9 4.6 4.7 4.2 4.1 6.0 4.7 5.3 + 10:01-11:00 5.3 6.2 5.7 6.0 5.0 4.6 4.5 4.2 4.3 5.9 4.7 5.3 + 11:01-12:00 5.3 6.2 5.6 6.4 5.6 5.1 5.1 4.8 5.0 6.8 4.8 4.7 + 12:01-13:00 5.7 6.1 5.7 6.6 5.7 5.3 5.3 5.1 5.3 7.1 4.7 5.0 + 13:01-14:00 5.6 6.1 5.6 6.5 5.7 5.4 5.5 5.1 5.1 6.9 4.7 5.1 + 14:01-15:00 5.8 6.5 6.3 6.7 5.9 5.9 5.5 5.7 4.9 6.7 5.0 5.2 + 15:01-16:00 5.9 6.3 6.6 6.5 5.6 5.7 5.6 5.3 4.5 6.4 5.1 4.8 + 16:01-17:00 5.9 6.0 6.4 6.4 5.6 5.6 5.4 5.3 4.5 6.4 5.0 4.6 + 17:01-18:00 5.5 5.7 5.9 6.1 4.5 5.7 5.2 4.6 4.4 5.1 5.2 4.3 + 18:01-19:00 5.6 5.7 5.4 5.5 4.7 4.8 4.6 4.0 3.6 4.8 5.4 4.7 + 19:01-20:00 5.5 5.6 5.5 5.4 4.5 5.0 4.4 4.0 3.6 4.8 5.2 4.6 + 20:01-21:00 5.7 5.3 5.3 4.7 3.7 4.2 3.4 3.7 3.5 5.4 4.9 5.3 + 21:01-22:00 5.2 5.1 5.1 5.1 3.6 4.3 3.6 3.5 3.5 5.2 4.6 5.4 + 22:01-23:00 5.3 5.1 5.3 4.2 3.6 4.2 3.5 3.4 3.5 5.3 4.5 5.3 + 23:01-24:00 5.5 4.9 5.2 4.2 3.7 4.4 3.1 3.0 3.1 4.8 4.2 5.1 + Max Hour 16 15 16 15 15 15 16 15 13 13 19 22 + Min Hour 8 24 3 6 3 6 3 3 1 5 1 18 + + - Average Hourly Statistics for Wind Direction [Degrees] {N=0,E=90,S=180,W=270} + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + 0:01- 1:00 273 251 221 221 199 211 228 229 194 225 271 216 + 1:01- 2:00 273 249 220 215 212 211 226 229 183 225 271 217 + 2:01- 3:00 289 228 214 221 181 218 226 219 194 208 270 223 + 3:01- 4:00 269 268 223 216 201 204 230 224 216 221 266 236 + 4:01- 5:00 270 268 225 217 203 207 230 224 218 220 265 238 + 5:01- 6:00 262 261 230 219 186 225 218 222 209 236 261 233 + 6:01- 7:00 269 252 231 219 202 197 187 211 222 237 278 247 + 7:01- 8:00 269 253 232 208 192 195 190 197 213 238 279 246 + 8:01- 9:00 273 252 218 179 169 195 184 200 151 223 257 242 + 9:01-10:00 254 232 214 186 170 200 185 192 152 226 248 232 + 10:01-11:00 262 233 215 189 172 200 185 184 156 227 250 234 + 11:01-12:00 251 222 203 195 167 197 162 170 141 205 238 235 + 12:01-13:00 249 218 194 184 164 191 160 167 155 204 219 222 + 13:01-14:00 260 232 196 192 165 192 159 168 156 206 219 222 + 14:01-15:00 249 197 190 192 163 188 173 184 142 215 227 192 + 15:01-16:00 247 203 197 206 159 196 175 176 145 217 233 228 + 16:01-17:00 245 203 196 191 163 197 202 175 147 217 232 239 + 17:01-18:00 268 204 202 195 168 190 188 192 166 206 226 206 + 18:01-19:00 274 219 212 202 168 187 193 193 164 204 244 213 + 19:01-20:00 285 216 212 214 160 189 191 192 166 207 244 190 + 20:01-21:00 282 211 228 208 171 183 183 205 170 227 242 204 + 21:01-22:00 280 212 227 206 204 180 193 198 199 237 253 218 + 22:01-23:00 279 214 231 222 203 194 195 200 199 238 253 217 + 23:01-24:00 280 233 219 224 223 215 228 224 201 230 266 238 + Max Hour 3 5 8 24 24 6 4 2 7 8 8 7 + Min Hour 17 15 15 9 16 22 14 13 12 19 14 20 + + - Wind Frequency (m/s) by Direction {Interval 11.25 deg from displayed deg) [%] + <=.5 <=2 <=4 <=6 <=8 <=10 <=12 <=14 <=16 <=18 >18 Total + N (0) 0.2 0.4 2.8 1.5 0.4 0.1 0.0 0.1 0.0 0.0 0.0 5.6 + ENE (22.5) 0.2 0.2 0.9 0.8 0.5 0.2 0.0 0.1 0.0 0.0 0.0 2.9 + NE (45) 0.1 0.2 0.7 0.8 1.0 0.6 0.1 0.0 0.0 0.0 0.0 3.7 + ENE (67.5) 0.1 0.2 1.4 1.2 0.9 0.3 0.1 0.0 0.0 0.0 0.0 4.3 + E (90) 0.1 0.4 2.7 2.4 0.8 0.3 0.2 0.1 0.0 0.0 0.0 7.0 + ESE (112.5) 0.2 0.3 1.4 1.6 0.7 0.1 0.0 0.0 0.0 0.0 0.0 4.4 + SE (135) 0.2 0.3 1.8 0.9 0.2 0.0 0.0 0.0 0.0 0.0 0.0 3.3 + SSE (157.5) 0.3 0.3 1.0 0.4 0.1 0.1 0.0 0.0 0.0 0.0 0.0 2.2 + S (180) 0.4 0.3 2.5 1.6 0.9 0.2 0.1 0.1 0.0 0.0 0.0 6.0 + SSW (202.5) 0.3 0.3 2.4 2.5 1.4 0.4 0.2 0.0 0.0 0.0 0.0 7.6 + SW (225) 0.3 0.3 2.0 2.9 1.5 0.6 0.1 0.0 0.0 0.0 0.0 7.6 + WSW (247.5) 0.2 0.1 1.4 2.3 1.2 0.3 0.1 0.1 0.0 0.0 0.0 5.7 + W (270) 0.2 0.2 2.8 5.1 3.0 1.5 0.5 0.1 0.0 0.0 0.0 13.3 + WNW (292.5) 0.3 0.2 2.1 4.4 2.3 1.0 0.7 0.2 0.0 0.0 0.0 11.3 + NW (315) 0.2 0.1 1.7 3.0 2.2 0.7 0.3 0.0 0.0 0.0 0.0 8.2 + NNW (337.5) 0.2 0.2 2.4 2.5 1.0 0.4 0.0 0.0 0.0 0.0 0.0 6.8 + + Total 3.6 4.1 30.0 33.9 18.1 6.8 2.6 0.7 0.2 0.0 0.0 100.0 + + - Monthly Statistics for Liquid Precipitation [mm] + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + Total 59 94 121 69 58 282 151 55 130 99 47 150 + Max Hourly 5 6 7 5 7 6 6 6 6 6 5 6 + + - Monthly Statistics for Snow Depth [cm] + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + Total 0 0 0 0 0 0 0 0 0 0 0 0 + Max Hourly 0 0 0 0 0 0 0 0 0 0 0 0 + + - Monthly Statistics for Albedo [] + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + Average 0.762 0.785 0.192 0.150 0.097 0.099 0.102 0.103 0.102 0.097 0.097 0.153 + + - Monthly Statistics for Solar Radiation (Direct Normal, Diffuse, Global Horizontal) [Wh/m²] + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + Direct Avg 3555 3870 4578 4858 4506 4787 5428 5709 4446 3867 3859 2468 + + Direct Max 7416 8403 9605 9959 10224 11045 10632 9872 9474 8505 7006 6415 + Day 29 18 31 15 21 15 11 2 16 2 1 7 + + Diffuse Avg 709 1104 1231 1928 2334 2736 2498 2025 1616 1134 703 611 + + Global Avg 1951 2792 3653 4955 5329 5990 6229 5609 4162 2921 2126 1386 + + - Maximum Direct Normal Solar of 11045 Wh/m² on Jun 15 + + - Global Horizontal Solar Radiation 1434 kWh/m²-yr + - Direct Normal Solar Radiation 1580 kWh/m²-yr + - Diffuse Horizontal Solar Radiation 567 kWh/m²-yr + + - Average Hourly Statistics for Direct Normal Solar Radiation [Wh/m²] + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + 0:01- 1:00 0 0 0 0 0 0 0 0 0 0 0 0 + 1:01- 2:00 0 0 0 0 0 0 0 0 0 0 0 0 + 2:01- 3:00 0 0 0 0 0 0 0 0 0 0 0 0 + 3:01- 4:00 0 0 0 0 0 0 0 0 0 0 0 0 + 4:01- 5:00 0 0 0 0 5 20 3 0 0 0 0 0 + 5:01- 6:00 0 0 0 52 112 148 130 104 7 0 0 0 + 6:01- 7:00 0 0 94 225 224 291 241 275 124 96 4 0 + 7:01- 8:00 66 133 268 370 314 380 387 450 284 213 189 35 + 8:01- 9:00 263 304 416 430 374 447 446 533 396 340 346 148 + 9:01-10:00 421 440 495 455 428 410 477 571 431 415 457 268 + 10:01-11:00 503 501 494 502 421 408 533 578 465 464 487 335 + 11:01-12:00 537 498 481 476 426 424 498 543 479 464 489 352 + 12:01-13:00 503 492 466 457 395 402 470 481 454 453 495 348 + 13:01-14:00 466 458 447 459 351 377 473 437 434 421 504 340 + 14:01-15:00 397 445 457 452 343 355 456 411 432 388 476 350 + 15:01-16:00 317 343 436 432 333 338 414 444 413 349 380 292 + 16:01-17:00 82 256 348 318 332 320 394 416 346 263 30 0 + 17:01-18:00 0 0 175 219 285 284 316 338 181 0 0 0 + 18:01-19:00 0 0 0 10 164 182 189 128 0 0 0 0 + 19:01-20:00 0 0 0 0 0 0 0 0 0 0 0 0 + 20:01-21:00 0 0 0 0 0 0 0 0 0 0 0 0 + 21:01-22:00 0 0 0 0 0 0 0 0 0 0 0 0 + 22:01-23:00 0 0 0 0 0 0 0 0 0 0 0 0 + 23:01-24:00 0 0 0 0 0 0 0 0 0 0 0 0 + Max Hour* 12 11* 10* 11* 10* 9* 11* 11* 12 11* 14 12 + Min Hour 1 1 1 1 1 1 1 1 1 1 1 1 + + - Average Hourly Statistics for Diffuse Horizontal Solar Radiation [Wh/m²] + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + 0:01- 1:00 0 0 0 0 0 0 0 0 0 0 0 0 + 1:01- 2:00 0 0 0 0 0 0 0 0 0 0 0 0 + 2:01- 3:00 0 0 0 0 0 0 0 0 0 0 0 0 + 3:01- 4:00 0 0 0 0 0 0 0 0 0 0 0 0 + 4:01- 5:00 0 0 0 0 2 6 1 0 0 0 0 0 + 5:01- 6:00 0 0 0 10 30 39 36 16 2 0 0 0 + 6:01- 7:00 0 0 13 47 65 87 84 50 31 12 1 0 + 7:01- 8:00 8 24 43 93 119 140 133 92 69 44 23 7 + 8:01- 9:00 34 57 78 139 156 181 182 125 115 86 50 33 + 9:01-10:00 65 96 111 182 210 236 225 149 163 126 80 66 + 10:01-11:00 95 129 142 202 256 275 241 187 186 148 102 84 + 11:01-12:00 107 156 153 231 261 301 247 223 198 153 118 97 + 12:01-13:00 120 167 170 245 268 316 276 259 199 158 115 102 + 13:01-14:00 111 163 161 224 264 314 277 262 197 151 95 95 + 14:01-15:00 92 143 139 196 230 276 239 242 176 123 70 77 + 15:01-16:00 63 106 113 156 193 219 208 171 143 89 48 49 + 16:01-17:00 15 63 76 123 140 169 160 132 96 45 4 0 + 17:01-18:00 0 0 31 73 93 114 122 87 42 0 0 0 + 18:01-19:00 0 0 0 5 45 64 66 30 0 0 0 0 + 19:01-20:00 0 0 0 0 0 0 0 0 0 0 0 0 + 20:01-21:00 0 0 0 0 0 0 0 0 0 0 0 0 + 21:01-22:00 0 0 0 0 0 0 0 0 0 0 0 0 + 22:01-23:00 0 0 0 0 0 0 0 0 0 0 0 0 + 23:01-24:00 0 0 0 0 0 0 0 0 0 0 0 0 + Max Hour 13 13 13 13 13 13 14 14 13 13 12 13 + Min Hour 1 1 1 1 1 1 1 1 1 1 1 1 + + - Average Hourly Statistics for Global Horizontal Solar Radiation [Wh/m²] + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + 0:01- 1:00 0 0 0 0 0 0 0 0 0 0 0 0 + 1:01- 2:00 0 0 0 0 0 0 0 0 0 0 0 0 + 2:01- 3:00 0 0 0 0 0 0 0 0 0 0 0 0 + 3:01- 4:00 0 0 0 0 0 0 0 0 0 0 0 0 + 4:01- 5:00 0 0 0 0 2 7 2 0 0 0 0 0 + 5:01- 6:00 0 0 0 15 48 68 57 27 2 0 0 0 + 6:01- 7:00 0 0 25 99 134 186 159 122 53 21 1 0 + 7:01- 8:00 11 41 113 230 267 327 314 272 163 94 48 9 + 8:01- 9:00 82 136 239 365 387 468 455 419 301 205 136 59 + 9:01-10:00 181 260 367 485 532 551 582 541 421 324 241 137 + 10:01-11:00 281 366 450 586 613 627 692 646 511 407 313 201 + 11:01-12:00 339 425 486 623 644 693 697 685 559 434 351 237 + 12:01-13:00 346 444 500 625 627 693 710 677 544 432 350 243 + 13:01-14:00 307 411 465 589 570 654 699 628 509 389 312 219 + 14:01-15:00 234 355 415 518 500 568 613 553 446 307 232 177 + 15:01-16:00 141 233 326 410 416 459 501 454 351 206 132 103 + 16:01-17:00 29 122 197 265 311 349 383 331 219 101 10 0 + 17:01-18:00 0 0 71 137 194 230 251 197 85 0 0 0 + 18:01-19:00 0 0 0 7 82 110 116 58 0 0 0 0 + 19:01-20:00 0 0 0 0 0 0 0 0 0 0 0 0 + 20:01-21:00 0 0 0 0 0 0 0 0 0 0 0 0 + 21:01-22:00 0 0 0 0 0 0 0 0 0 0 0 0 + 22:01-23:00 0 0 0 0 0 0 0 0 0 0 0 0 + 23:01-24:00 0 0 0 0 0 0 0 0 0 0 0 0 + Max Hour 13 13 13 13 12 12 13 12 12 12 12 13 + Min Hour 1 1 1 1 1 1 1 1 1 1 1 1 + + - Monthly Sunshine/Daylight (Daily Average) [hours] + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + Sunshine 3.6 3.9 4.6 4.9 4.5 4.8 5.4 5.7 4.4 3.9 3.9 2.5 + Daylight 9.5 10.5 11.9 13.3 14.6 15.2 14.9 13.9 12.5 11.1 9.8 9.1 + + - Estimated Sunshine Hours per year 1613 + + - Monthly Statistics for Illuminance (Direct Normal, Diffuse, Global Horizontal) [kLux] + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + Direct Avg 173 232 313 363 329 325 362 379 285 255 211 112 + + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + Diffuse Avg 81 127 145 228 276 321 294 239 189 133 83 69 + + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + Global Avg 226 322 416 566 611 693 722 645 477 331 243 157 + + - Monthly Statistics for Zenith Luminance [kCD/m²] ** + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + ZenLum Avg 28 44 43 51 55 56 57 53 49 42 28 23 + **Missed Hrs 6 27 84 126 160 151 97 59 13 + + - Average Hourly Statistics for Total Sky Cover [%] + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + 0:01- 1:00 60 70 50 44 68 60 35 45 54 55 54 72 + 1:01- 2:00 60 72 54 48 62 52 42 37 56 63 52 70 + 2:01- 3:00 55 68 55 51 69 63 51 33 57 64 57 66 + 3:01- 4:00 56 70 52 49 69 64 52 47 55 63 59 59 + 4:01- 5:00 54 72 55 60 72 62 63 58 63 54 54 62 + 5:01- 6:00 57 71 58 62 73 62 57 59 62 62 57 67 + 6:01- 7:00 62 70 63 67 75 67 57 55 61 65 59 74 + 7:01- 8:00 65 68 60 68 75 61 56 54 58 71 59 80 + 8:01- 9:00 65 63 63 68 75 65 62 59 59 68 66 77 + 9:01-10:00 67 68 64 67 74 63 61 60 63 71 62 85 + 10:01-11:00 67 70 62 72 74 64 61 63 68 72 60 82 + 11:01-12:00 68 70 65 74 73 70 68 64 72 73 62 80 + 12:01-13:00 70 72 66 73 73 73 66 65 76 74 62 83 + 13:01-14:00 71 77 66 79 77 72 71 69 73 73 64 81 + 14:01-15:00 74 76 62 79 80 80 71 73 74 75 65 82 + 15:01-16:00 75 74 62 78 78 77 72 60 71 69 70 80 + 16:01-17:00 73 79 63 80 76 75 71 64 75 71 73 75 + 17:01-18:00 70 76 60 77 75 80 67 64 75 70 65 69 + 18:01-19:00 70 73 57 74 74 81 62 64 72 65 60 77 + 19:01-20:00 64 67 52 64 71 75 59 56 66 62 54 77 + 20:01-21:00 60 70 50 65 64 73 53 49 57 62 51 76 + 21:01-22:00 61 66 48 65 69 71 53 47 64 52 52 73 + 22:01-23:00 62 70 54 59 68 60 48 49 57 51 53 72 + 23:01-24:00 59 72 50 48 65 62 45 38 57 50 49 71 + Max Hour 16 17 13 17 15 19 16 15 13 15 17 10 + Min Hour 5 9 22 1 2 2 1 3 1 24 24 4 + + - Average Hourly Statistics for Opaque Sky Cover [%] + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + 0:01- 1:00 60 70 50 44 68 60 35 45 54 55 54 72 + 1:01- 2:00 60 72 54 48 62 52 42 37 56 63 52 70 + 2:01- 3:00 55 68 55 51 69 63 51 33 57 64 57 66 + 3:01- 4:00 56 70 52 49 69 64 52 47 55 63 59 59 + 4:01- 5:00 54 72 55 60 72 62 63 58 63 54 54 62 + 5:01- 6:00 57 71 58 62 73 62 57 59 62 62 57 67 + 6:01- 7:00 62 70 63 67 75 67 57 55 61 65 59 74 + 7:01- 8:00 65 68 60 68 75 61 56 54 58 71 59 80 + 8:01- 9:00 65 63 63 68 75 65 62 59 59 68 66 77 + 9:01-10:00 67 68 64 67 74 63 61 60 63 71 62 85 + 10:01-11:00 67 70 62 72 74 64 61 63 68 72 60 82 + 11:01-12:00 68 70 65 74 73 70 68 64 72 73 62 80 + 12:01-13:00 70 72 66 73 73 73 66 65 76 74 62 83 + 13:01-14:00 71 77 66 79 77 72 71 69 73 73 64 81 + 14:01-15:00 74 76 62 79 80 80 71 73 74 75 65 82 + 15:01-16:00 75 74 62 78 78 77 72 60 71 69 70 80 + 16:01-17:00 73 79 63 80 76 75 71 64 75 71 73 75 + 17:01-18:00 70 76 60 77 75 80 67 64 75 70 65 69 + 18:01-19:00 70 73 57 74 74 81 62 64 72 65 60 77 + 19:01-20:00 64 67 52 64 71 75 59 56 66 62 54 77 + 20:01-21:00 60 70 50 65 64 73 53 49 57 62 51 76 + 21:01-22:00 61 66 48 65 69 71 53 47 64 52 52 73 + 22:01-23:00 62 70 54 59 68 60 48 49 57 51 53 72 + 23:01-24:00 59 72 50 48 65 62 45 38 57 50 49 71 + Max Hour 16 17 13 17 15 19 16 15 13 15 17 10 + Min Hour 5 9 22 1 2 2 1 3 1 24 24 4 + + - Monthly Calculated "undisturbed" Ground Temperatures** [C] + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + 0.5 m 1.0 0.0 1.8 4.6 11.9 17.6 21.4 22.6 20.6 16.2 10.3 4.9 + 2.0 m 4.8 3.0 3.3 4.8 9.7 14.1 17.7 19.6 19.2 16.7 12.7 8.4 + 4.0 m 7.8 6.0 5.6 6.1 8.9 11.9 14.6 16.5 17.0 15.9 13.5 10.6 + + - **These ground temperatures should NOT BE USED in the GroundTemperatures object to compute building floor losses. + - The temperatures for 0.5 m depth can be used for GroundTemperatures:Surface. + - The temperatures for 4.0 m depth can be used for GroundTemperatures:Deep. + - Calculations use a standard soil diffusivity of 2.3225760E-03 {m**2/day} + + - Heating/Cooling Degree Days/Hours calculated from this weather file. + - Heating/Cooling Degree Days/Hours from design conditions shown earlier in this report. + - Monthly Weather File Heating/Cooling Degree Days/Hours [] + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + HDD base 10C 350 296 222 64 1 0 0 0 0 6 83 198 + HDD base 18C 598 520 470 276 119 15 0 0 21 166 309 445 + + CDD base 10C 0 0 0 28 144 317 423 410 282 96 13 1 + CDD base 18C 0 0 0 0 13 93 175 162 64 8 0 0 + + CDH base 20C 0 0 0 2 270 1632 2859 2546 929 128 0 0 + CDH base 23C 0 0 0 0 80 781 1291 1130 323 38 0 0 + CDH base 27C 0 0 0 0 2 247 327 247 53 0 0 0 + + - 1715 annual (wthr file) cooling degree-days (10C baseline) + - 1221 annual (wthr file) heating degree-days (10C baseline) + + - 514 annual (wthr file) cooling degree-days (18C baseline) + - 2940 annual (wthr file) heating degree-days (18C baseline) + + - 8366 annual (wthr file) cooling degree-hours (20C baseline) + - 3643 annual (wthr file) cooling degree-hours (23C baseline) + - 877 annual (wthr file) cooling degree-hours (27C baseline) + + - Psychrometric Chart Data rows=Dewpoint - columns=DryBulb [%] + <=-10 <=-5 <=0 <=5 <=10 <=15 <=20 <=25 <=30 <=35 <=40 >40 + >30 + <=30 + <=25 2.4 0.9 0.1 + <=20 5.0 8.5 3.0 1.0 + <=15 4.1 5.9 3.6 1.8 0.1 + <=10 3.5 5.8 1.9 0.4 0.1 + <=5 4.6 5.6 4.3 1.5 0.3 0.1 + <=0 2.0 7.6 3.5 1.5 0.5 0.1 0.1 + <=-5 0.4 4.9 4.6 1.2 0.3 0.2 + <=-10 0.4 2.3 3.9 1.7 0.4 + + - Climate type "Dfa" (Köppen classification)** + - Humid continental (hot summer, cold winter, no dry season, lat. 30-60°N) + - + - **Note that the Köppen classification shown here is derived from the ASHRAE design condition data. + - It "should" be indicative of the long term climate for this location. + + - Typical/Extreme Period Determination + + - Summer is Jun:Aug + Extreme Summer Week (nearest maximum temperature for summer) + Extreme Hot Week Period selected: Jul 13:Jul 19, Maximum Temp= 34.40C, Deviation=| 9.750|C + Typical Summer Week (nearest average temperature for summer) + Typical Week Period selected: Aug 3:Aug 9, Average Temp= 22.50C, Deviation=| 0.242|C + + - Winter is Dec:Feb + Extreme Winter Week (nearest minimum temperature for winter) + Extreme Cold Week Period selected: Jan 27:Feb 2, Minimum Temp= -14.40C, Deviation=|10.365|C + Typical Winter Week (nearest average temperature for winter) + Typical Week Period selected: Jan 13:Jan 19, Average Temp= 0.63C, Deviation=| 0.208|C + + - Autumn is Sep:Nov + Typical Autumn Week (nearest average temperature for autumn) + Typical Week Period selected: Oct 6:Oct 12, Average Temp= 13.33C, Deviation=| 0.876|C + + - Spring is Mar:May + Typical Spring Week (nearest average temperature for spring) + Typical Week Period selected: Apr 19:Apr 25, Average Temp= 8.74C, Deviation=| 0.183|C