diff --git a/ETLTrimmer/main.cpp b/ETLTrimmer/main.cpp index 14e0f064..f949a527 100644 --- a/ETLTrimmer/main.cpp +++ b/ETLTrimmer/main.cpp @@ -134,6 +134,7 @@ class EventCallback : public ITraceEventCallback // analysis stats int eventCount_ = 0; int keepCount_ = 0; + int metadataEventCount_ = 0; std::optional firstTimestamp_; uint64_t lastTimestamp_ = 0; std::unordered_map eventCountByProcess_; @@ -218,6 +219,9 @@ class EventCallback : public ITraceEventCallback } lastTimestamp_ = ts; eventCount_++; + if (hdr.ProviderId == Microsoft_Windows_EventMetadata::GUID) { + metadataEventCount_++; + } bool canDiscard = true; if (trimRangeQpc_) { // tail events always discardable @@ -278,6 +282,10 @@ class EventCallback : public ITraceEventCallback { trimRangeMs_ = range; } + int GetMetadataEventCount() const + { + return metadataEventCount_; + } int GetKeepCount() const { return keepCount_; @@ -416,6 +424,7 @@ int main(int argc, const char** argv) const auto dur = tsr.second - tsr.first; std::cout << std::format(" ======== Report for [ {} ] ========\n", *opt.inputFile); std::cout << std::format("Total event count: {:L}\n", pCallbackProcessor->GetEventCount()); + std::cout << std::format("Metadata event count: {:L}\n", pCallbackProcessor->GetMetadataEventCount()); std::cout << std::format("Timestamp range {:L} - {:L} (duration: {:L})\n", tsr.first, tsr.second, dur); std::cout << std::format("Duration of trace in milliseconds: {:L}\n\n", double(dur) / 10'000.); diff --git a/IntelPresentMon/AppCef/source/util/LogSetup.cpp b/IntelPresentMon/AppCef/source/util/LogSetup.cpp index 7966dea7..afc62bc6 100644 --- a/IntelPresentMon/AppCef/source/util/LogSetup.cpp +++ b/IntelPresentMon/AppCef/source/util/LogSetup.cpp @@ -166,7 +166,7 @@ namespace p2c::client::util try { const auto fullPipeName = R"(\\.\pipe\)" + pipePrefix; // wait maximum 1.5sec for pipe to be created - if (!pipe::DuplexPipe::WaitForAvailability(fullPipeName, 1500)) { + if (!pipe::DuplexPipe::WaitForAvailability(fullPipeName, 1500, true)) { pmlog_warn(std::format("Failed to connect to logging source server {} after waiting 1.5s", pipePrefix)); return; } diff --git a/IntelPresentMon/CommonUtilities/pipe/Pipe.cpp b/IntelPresentMon/CommonUtilities/pipe/Pipe.cpp index aa19111b..25587da4 100644 --- a/IntelPresentMon/CommonUtilities/pipe/Pipe.cpp +++ b/IntelPresentMon/CommonUtilities/pipe/Pipe.cpp @@ -73,8 +73,9 @@ namespace pmon::util::pipe { return writeBuf_.consume(GetWriteBufferPending()); } - bool DuplexPipe::WaitForAvailability(const std::string& name, uint32_t timeoutMs, uint32_t pollPeriodMs) + bool DuplexPipe::WaitForAvailability(const std::string& baseName, uint32_t timeoutMs, bool noSuffix, uint32_t pollPeriodMs) { + const auto name = baseName + (noSuffix ? "" : "-in"); const auto start = std::chrono::high_resolution_clock::now(); while (std::chrono::high_resolution_clock::now() - start < 1ms * timeoutMs) { if (WaitNamedPipeA(name.c_str(), 0)) { @@ -86,6 +87,22 @@ namespace pmon::util::pipe } return false; } + bool DuplexPipe::WaitForVacancy(const std::string& baseName, uint32_t timeoutMs, bool noSuffix, uint32_t pollPeriodMs) + { + const auto name = baseName + (noSuffix ? "" : "-out"); + const auto start = std::chrono::high_resolution_clock::now(); + while (std::chrono::high_resolution_clock::now() - start < 1ms * timeoutMs) { + if (!WaitNamedPipeA(name.c_str(), 0)) { + const DWORD err = GetLastError(); + if (err == ERROR_FILE_NOT_FOUND) { + return true; // Vacant: no pipe instances exist. + } + } + std::this_thread::sleep_for(1ms * pollPeriodMs); + } + return false; + } + uint32_t DuplexPipe::GetId() const { return uid_; diff --git a/IntelPresentMon/CommonUtilities/pipe/Pipe.h b/IntelPresentMon/CommonUtilities/pipe/Pipe.h index a708181f..1a8d9fa6 100644 --- a/IntelPresentMon/CommonUtilities/pipe/Pipe.h +++ b/IntelPresentMon/CommonUtilities/pipe/Pipe.h @@ -102,7 +102,8 @@ namespace pmon::util::pipe } size_t GetWriteBufferPending() const; void ClearWriteBuffer(); - static bool WaitForAvailability(const std::string& name, uint32_t timeoutMs, uint32_t pollPeriodMs = 10); + static bool WaitForAvailability(const std::string& baseName, uint32_t timeoutMs, bool noSuffix = false, uint32_t pollPeriodMs = 5); + static bool WaitForVacancy(const std::string& baseName, uint32_t timeoutMs, bool noSuffix = false, uint32_t pollPeriodMs = 5); uint32_t GetId() const; std::string GetName() const; static std::string GetSecurityString(SecurityMode mode); diff --git a/IntelPresentMon/Core/source/infra/LogSetup.cpp b/IntelPresentMon/Core/source/infra/LogSetup.cpp index a0deb72a..0400a0e4 100644 --- a/IntelPresentMon/Core/source/infra/LogSetup.cpp +++ b/IntelPresentMon/Core/source/infra/LogSetup.cpp @@ -236,7 +236,7 @@ namespace p2c try { const auto fullPipeName = R"(\\.\pipe\)" + pipePrefix; // wait maximum 1.5sec for pipe to be created - if (!pipe::DuplexPipe::WaitForAvailability(fullPipeName, 1500)) { + if (!pipe::DuplexPipe::WaitForAvailability(fullPipeName, 1500, true)) { pmlog_warn(std::format("Failed to connect to logging source server {} after waiting 1.5s", pipePrefix)); return; } diff --git a/IntelPresentMon/Core/source/kernel/InjectorComplex.cpp b/IntelPresentMon/Core/source/kernel/InjectorComplex.cpp index 5f9fac0a..a15fa18c 100644 --- a/IntelPresentMon/Core/source/kernel/InjectorComplex.cpp +++ b/IntelPresentMon/Core/source/kernel/InjectorComplex.cpp @@ -146,7 +146,7 @@ namespace p2c::kern try { int pid = std::stoi(line); const auto pipeName = inj::act::MakePipeName(pid); - ::pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 2'000, 250); + ::pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 2'000, false, 250); { std::lock_guard lk{ actionClientMutex_ }; injectionPointClient_.emplace(pipeName); diff --git a/IntelPresentMon/PresentMonAPI2/PresentMonAPI.cpp b/IntelPresentMon/PresentMonAPI2/PresentMonAPI.cpp index 796279ef..944d0263 100644 --- a/IntelPresentMon/PresentMonAPI2/PresentMonAPI.cpp +++ b/IntelPresentMon/PresentMonAPI2/PresentMonAPI.cpp @@ -194,7 +194,12 @@ PRESENTMON_API2_EXPORT PM_STATUS pmGetIntrospectionRoot(PM_SESSION_HANDLE handle return PM_STATUS_BAD_ARGUMENT; } const auto pIntro = LookupMiddleware_(handle).GetIntrospectionData(); - AddHandleMapping_(handle, pIntro); + // we don't need the middleware to free introspection data + // detaching like this (eliding handle mapping) will allow introspection data + // to not obstruct cleanup of middleware + // if the lifecycle of marshalled introspection data changes this might need to + // change as well + // AddHandleMapping_(handle, pIntro); *ppInterface = pIntro; return PM_STATUS_SUCCESS; } @@ -212,9 +217,11 @@ PRESENTMON_API2_EXPORT PM_STATUS pmFreeIntrospectionRoot(const PM_INTROSPECTION_ // freeing nullptr is a no-op return PM_STATUS_SUCCESS; } - auto& mid = LookupMiddleware_(pInterface); - RemoveHandleMapping_(pInterface); - mid.FreeIntrospectionData(pInterface); + // see note in pmGetIntrospectionRoot above + // RemoveHandleMapping_(pInterface); + // if we free directly here instead of using the middleware method + // we can support freeing even after middleware has been destroyed + free(const_cast(pInterface)); return PM_STATUS_SUCCESS; } catch (...) { diff --git a/IntelPresentMon/PresentMonAPI2Tests/EtlLoggerTests.cpp b/IntelPresentMon/PresentMonAPI2Tests/EtlLoggerTests.cpp index b78e2e6c..86f090ed 100644 --- a/IntelPresentMon/PresentMonAPI2Tests/EtlLoggerTests.cpp +++ b/IntelPresentMon/PresentMonAPI2Tests/EtlLoggerTests.cpp @@ -1,267 +1,43 @@ // Copyright (C) 2022-2023 Intel Corporation // SPDX-License-Identifier: MIT #include "../CommonUtilities/win/WinAPI.h" -#include "../CommonUtilities/file/FileUtils.h" #include "CppUnitTest.h" #include "StatusComparison.h" -#include "../PresentMonAPI2Loader/Loader.h" -#include "../CommonUtilities/pipe/Pipe.h" +#include "TestProcess.h" #include -#include -#include -#include -#include -#include -#include -#include "TestCommands.h" +#include #include "Folders.h" #include "JobManager.h" using namespace Microsoft::VisualStudio::CppUnitTestFramework; -namespace bp = boost::process; -namespace as = boost::asio; -namespace fs = std::filesystem; namespace vi = std::views; using namespace std::literals; using namespace pmon; + namespace EtlLoggerTests { - static constexpr const char* controlPipe_ = R"(\\.\pipe\pm-etllog-test-ctrl)"; - static constexpr const char* introNsm_ = "pm_etllog_test_intro"; - static constexpr const char* logLevel_ = "info"; - - class TestProcess - { - public: - TestProcess(as::io_context& ioctx, JobManager& jm, const std::string& executable, const std::vector& args) - : - pipeFrom_{ ioctx }, - pipeTo_{ ioctx }, - process_{ ioctx, executable, args, - bp::process_stdio{ pipeTo_, pipeFrom_, nullptr } } - { - jm.Attach(process_.native_handle()); - Logger::WriteMessage(std::format(" - Launched process {{{}}} [{}]\n", - executable, process_.id()).c_str()); - Assert::AreEqual("ping-ok"s, Command("ping")); - } - ~TestProcess() - { - if (process_.running()) { - Quit(); - } - } - - TestProcess(const TestProcess&) = delete; - TestProcess& operator=(const TestProcess&) = delete; - TestProcess(TestProcess&& other) noexcept = delete; - TestProcess& operator=(TestProcess&& other) noexcept = delete; - - void Quit() - { - Assert::IsTrue(process_.running()); - Assert::AreEqual("quit-ok"s, Command("quit")); - process_.wait(); - } - void Murder() - { - Assert::IsTrue(process_.running()); - ::TerminateProcess(process_.native_handle(), 0xDEAD); - process_.wait(); - } - std::string Command(const std::string command) - { - // send command - as::write(pipeTo_, as::buffer(std::format("%{}\n", command))); - - // read through the start marker and drop it (and any leading junk) - const auto n = as::read_until(pipeFrom_, readBufferFrom_, preamble_); - readBufferFrom_.consume(n); - - // read through the end marker, m counts bytes up to and including postamble - const auto m = as::read_until(pipeFrom_, readBufferFrom_, postamble_); - - // size string to accept payload - constexpr auto postambleSize = std::size(postamble_) - 1; - std::string payload; - payload.resize(m - postambleSize); - - // read into sized string using stream wrapper and discard postamble - std::istream is(&readBufferFrom_); - is.read(&payload[0], static_cast(payload.size())); - readBufferFrom_.consume(postambleSize); - - return payload; - } - uint32_t GetId() const - { - return process_.id(); - } - private: - constexpr static const char preamble_[] = "%%{"; - constexpr static const char postamble_[] = "}%%\r\n"; - as::readable_pipe pipeFrom_; - as::streambuf readBufferFrom_; - as::writable_pipe pipeTo_; - bp::process process_; - }; - - class ServiceProcess : public TestProcess + class TestFixture : public CommonTestFixture { - public: - ServiceProcess(as::io_context& ioctx, JobManager& jm, const std::vector& customArgs = {}) - : - TestProcess{ ioctx, jm, "PresentMonService.exe"s, MakeArgs_(customArgs) } - { - } - test::service::Status QueryStatus() - { - test::service::Status status; - std::istringstream is{ Command("status") }; - cereal::JSONInputArchive{ is }(status); - return status; - } - private: - std::vector MakeArgs_(const std::vector& customArgs) - { - std::vector allArgs{ - "--control-pipe"s, controlPipe_, - "--nsm-prefix"s, "pm_multi_test_nsm"s, - "--intro-nsm"s, introNsm_, - "--enable-test-control"s, - "--log-dir"s, logFolder_, - "--log-name-pid"s, - "--log-level"s, std::string(logLevel_), - }; - allArgs.append_range(customArgs); - return allArgs; - } - }; - - class ClientProcess : public TestProcess - { - public: - ClientProcess(as::io_context& ioctx, JobManager& jm, const std::vector& customArgs = {}) - : - TestProcess{ ioctx, jm, "SampleClient.exe"s, MakeArgs_(customArgs) } - { - } - test::client::FrameResponse GetFrames() - { - test::client::FrameResponse resp; - std::istringstream is{ Command("get-frames") }; - cereal::JSONInputArchive{ is }(resp); - Assert::AreEqual("get-frames-ok"s, resp.status); - return resp; - } - private: - std::vector MakeArgs_(const std::vector& customArgs) - { - std::vector allArgs{ - "--control-pipe"s, controlPipe_, - "--intro-nsm"s, introNsm_, - "--middleware-dll-path"s, "PresentMonAPI2.dll"s, - "--log-folder"s, std::string(logFolder_), - "--log-name-pid"s, - "--log-level"s, std::string(logLevel_), - "--mode"s, "EtlLogger"s, + protected: + const CommonProcessArgs& GetCommonArgs() const override + { + static CommonProcessArgs args{ + .ctrlPipe = R"(\\.\pipe\pm-etllog-test-ctrl)", + .introNsm = "pm_etllog_test_intro", + .frameNsm = "pm_etllog_test_nsm", + .logLevel = "debug", + .logFolder = logFolder_, + .sampleClientMode = "EtlLogger", }; - allArgs.append_range(customArgs); - return allArgs; - } - }; - - class PresenterProcess - { - public: - PresenterProcess(as::io_context& ioctx, JobManager& jm, const std::vector& customArgs = {}) - : - process_{ ioctx, path_, customArgs } - { - jm.Attach(process_.native_handle()); - Logger::WriteMessage(std::format(" - Launched process {{{}}} [{}]\n", - path_, process_.id()).c_str()); - } - uint32_t GetId() const - { - return process_.id(); - } - private: - static constexpr const char* path_ = R"(..\..\Tools\PresentBench.exe)"; - bp::process process_; - }; - - class OpmProcess - { - public: - OpmProcess(as::io_context& ioctx, JobManager& jm, const std::vector& customArgs = {}) - : - exePath_{ util::file::FindFilesMatchingPattern(fs::current_path(), exePattern_).at(0) }, - process_{ ioctx, exePath_.string(), customArgs} - { - jm.Attach(process_.native_handle()); - Logger::WriteMessage(std::format(" - Launched process {{{}}} [{}]\n", - exePath_.string(), process_.id()).c_str()); - } - uint32_t GetId() const - { - return process_.id(); - } - void Wait() - { - process_.wait(); - } - private: - // this will break on version up, needs a better solution - static constexpr const char* exePattern_ = R"(^PresentMon-\d+\.\d+\.\d+-x64\.exe$)"; - fs::path exePath_; - bp::process process_; - }; - - struct CommonTestFixture - { - JobManager jobMan; - std::thread ioctxRunThread; - as::io_context ioctx; - std::optional service; - - void Setup() - { - service.emplace(ioctx, jobMan); - ioctxRunThread = std::thread{ [&] {pmquell(ioctx.run()); } }; - // wait before every test to ensure that service is available - std::this_thread::sleep_for(50ms); - } - void Cleanup() - { - service.reset(); - ioctxRunThread.join(); - // sleep after every test to ensure that previous named pipe has vacated - std::this_thread::sleep_for(50ms); - } - ClientProcess LaunchClient(std::vector args = {}) - { - return ClientProcess{ ioctx, jobMan, std::move(args) }; - } - PresenterProcess LaunchPresenter(std::vector args = {}) - { - return PresenterProcess{ ioctx, jobMan, std::move(args) }; - } - OpmProcess LaunchOpm(std::vector args = {}) - { - return OpmProcess{ ioctx, jobMan, std::move(args) }; - } - std::unique_ptr LaunchClientAsPtr(std::vector args = {}) - { - return std::make_unique(ioctx, jobMan, std::move(args)); + return args; } }; TEST_CLASS(CommonFixtureTests) { - CommonTestFixture fixture_; + TestFixture fixture_; public: TEST_METHOD_INITIALIZE(Setup) @@ -291,7 +67,7 @@ namespace EtlLoggerTests TEST_CLASS(RoundTripLoggerTest) { - CommonTestFixture fixture_; + TestFixture fixture_; public: TEST_METHOD_INITIALIZE(Setup) diff --git a/IntelPresentMon/PresentMonAPI2Tests/EtlTests.cpp b/IntelPresentMon/PresentMonAPI2Tests/EtlTests.cpp index 87c76982..4f854974 100644 --- a/IntelPresentMon/PresentMonAPI2Tests/EtlTests.cpp +++ b/IntelPresentMon/PresentMonAPI2Tests/EtlTests.cpp @@ -161,7 +161,7 @@ namespace EtlTests "--etl-test-file"s, etlName, bp::std_out > out, bp::std_in < in); - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), + Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500), L"Timeout waiting for service control pipe"); std::unique_ptr pSession; @@ -204,7 +204,7 @@ namespace EtlTests "--etl-test-file"s, etlName, bp::std_out > out, bp::std_in < in); - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), + Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500), L"Timeout waiting for service control pipe"); std::unique_ptr pSession; @@ -279,7 +279,7 @@ namespace EtlTests "--etl-test-file"s, etlName, bp::std_out > out, bp::std_in < in); - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), + Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500), L"Timeout waiting for service control pipe"); std::unique_ptr pSession; @@ -328,7 +328,7 @@ namespace EtlTests "--etl-test-file"s, etlName, bp::std_out > out, bp::std_in < in); - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), + Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500), L"Timeout waiting for service control pipe"); std::unique_ptr pSession; @@ -377,7 +377,7 @@ namespace EtlTests "--etl-test-file"s, etlName, bp::std_out > out, bp::std_in < in); - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), + Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500), L"Timeout waiting for service control pipe"); std::unique_ptr pSession; @@ -426,7 +426,7 @@ namespace EtlTests "--etl-test-file"s, etlName, bp::std_out > out, bp::std_in < in); - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), + Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500), L"Timeout waiting for service control pipe"); std::unique_ptr pSession; @@ -475,7 +475,7 @@ namespace EtlTests "--etl-test-file"s, etlName, bp::std_out > out, bp::std_in < in); - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), + Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500), L"Timeout waiting for service control pipe"); std::unique_ptr pSession; @@ -524,7 +524,7 @@ namespace EtlTests "--etl-test-file"s, etlName, bp::std_out > out, bp::std_in < in); - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), + Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500), L"Timeout waiting for service control pipe"); std::unique_ptr pSession; @@ -573,7 +573,7 @@ namespace EtlTests "--etl-test-file"s, etlName, bp::std_out > out, bp::std_in < in); - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), + Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500), L"Timeout waiting for service control pipe"); std::unique_ptr pSession; @@ -622,7 +622,7 @@ namespace EtlTests "--etl-test-file"s, etlName, bp::std_out > out, bp::std_in < in); - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), + Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500), L"Timeout waiting for service control pipe"); std::unique_ptr pSession; @@ -678,7 +678,7 @@ namespace EtlTests "--etl-test-file"s, etlName, bp::std_out > out, bp::std_in < in); - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), + Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500), L"Timeout waiting for service control pipe"); std::unique_ptr pSession; @@ -727,7 +727,7 @@ namespace EtlTests "--etl-test-file"s, etlName, bp::std_out > out, bp::std_in < in); - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), + Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500), L"Timeout waiting for service control pipe"); std::unique_ptr pSession; @@ -782,7 +782,7 @@ namespace EtlTests "--etl-test-file"s, etlName, bp::std_out > out, bp::std_in < in); - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), + Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500), L"Timeout waiting for service control pipe"); std::unique_ptr pSession; @@ -831,7 +831,7 @@ namespace EtlTests "--etl-test-file"s, etlName, bp::std_out > out, bp::std_in < in); - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), + Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500), L"Timeout waiting for service control pipe"); std::unique_ptr pSession; @@ -880,7 +880,7 @@ namespace EtlTests "--etl-test-file"s, etlName, bp::std_out > out, bp::std_in < in); - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), + Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500), L"Timeout waiting for service control pipe"); std::unique_ptr pSession; @@ -929,7 +929,7 @@ namespace EtlTests "--etl-test-file"s, etlName, bp::std_out > out, bp::std_in < in); - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), + Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500), L"Timeout waiting for service control pipe"); std::unique_ptr pSession; @@ -978,7 +978,7 @@ namespace EtlTests "--etl-test-file"s, etlName, bp::std_out > out, bp::std_in < in); - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), + Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500), L"Timeout waiting for service control pipe"); std::unique_ptr pSession; @@ -1027,7 +1027,7 @@ namespace EtlTests "--etl-test-file"s, etlName, bp::std_out > out, bp::std_in < in); - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), + Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500), L"Timeout waiting for service control pipe"); std::unique_ptr pSession; @@ -1076,7 +1076,7 @@ namespace EtlTests "--etl-test-file"s, etlName, bp::std_out > out, bp::std_in < in); - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), + Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500), L"Timeout waiting for service control pipe"); std::unique_ptr pSession; @@ -1125,7 +1125,7 @@ namespace EtlTests "--etl-test-file"s, etlName, bp::std_out > out, bp::std_in < in); - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), + Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500), L"Timeout waiting for service control pipe"); std::unique_ptr pSession; @@ -1174,7 +1174,7 @@ namespace EtlTests "--etl-test-file"s, etlName, bp::std_out > out, bp::std_in < in); - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), + Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500), L"Timeout waiting for service control pipe"); std::unique_ptr pSession; @@ -1223,7 +1223,7 @@ namespace EtlTests "--etl-test-file"s, etlName, bp::std_out > out, bp::std_in < in); - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), + Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500), L"Timeout waiting for service control pipe"); std::unique_ptr pSession; @@ -1279,7 +1279,7 @@ namespace EtlTests "--etl-test-file"s, etlName, bp::std_out > out, bp::std_in < in); - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), + Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500), L"Timeout waiting for service control pipe"); std::unique_ptr pSession; @@ -1328,7 +1328,7 @@ namespace EtlTests "--etl-test-file"s, etlName, bp::std_out > out, bp::std_in < in); - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), + Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500), L"Timeout waiting for service control pipe"); std::unique_ptr pSession; @@ -1379,7 +1379,7 @@ namespace EtlTests "--etl-test-file"s, etlName, bp::std_out > out, bp::std_in < in); - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), + Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500), L"Timeout waiting for service control pipe"); std::unique_ptr pSession; @@ -1428,7 +1428,7 @@ namespace EtlTests "--etl-test-file"s, etlName, bp::std_out > out, bp::std_in < in); - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), + Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500), L"Timeout waiting for service control pipe"); std::unique_ptr pSession; @@ -1484,7 +1484,7 @@ namespace EtlTests "--etl-test-file"s, etlName, bp::std_out > out, bp::std_in < in); - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), + Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500), L"Timeout waiting for service control pipe"); std::unique_ptr pSession; @@ -1535,7 +1535,7 @@ namespace EtlTests "--etl-test-file"s, etlName, bp::std_out > out, bp::std_in < in); - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), + Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500), L"Timeout waiting for service control pipe"); std::unique_ptr pSession; @@ -1586,7 +1586,7 @@ namespace EtlTests "--etl-test-file"s, etlName, bp::std_out > out, bp::std_in < in); - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), + Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500), L"Timeout waiting for service control pipe"); std::unique_ptr pSession; @@ -1637,7 +1637,7 @@ namespace EtlTests "--etl-test-file"s, etlName, bp::std_out > out, bp::std_in < in); - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), + Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500), L"Timeout waiting for service control pipe"); std::unique_ptr pSession; @@ -1688,7 +1688,7 @@ namespace EtlTests "--etl-test-file"s, etlName, bp::std_out > out, bp::std_in < in); - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), + Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500), L"Timeout waiting for service control pipe"); std::unique_ptr pSession; @@ -1744,7 +1744,7 @@ namespace EtlTests "--etl-test-file"s, etlName, bp::std_out > out, bp::std_in < in); - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), + Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500), L"Timeout waiting for service control pipe"); std::unique_ptr pSession; @@ -1794,7 +1794,7 @@ namespace EtlTests "--etl-test-file"s, etlName, bp::std_out > out, bp::std_in < in); - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), + Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500), L"Timeout waiting for service control pipe"); std::unique_ptr pSession; @@ -1848,7 +1848,7 @@ namespace EtlTests "--etl-test-file"s, etlName, bp::std_out > out, bp::std_in < in); - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), + Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500), L"Timeout waiting for service control pipe"); std::unique_ptr pSession; diff --git a/IntelPresentMon/PresentMonAPI2Tests/Folders.h b/IntelPresentMon/PresentMonAPI2Tests/Folders.h index 18542cf9..8b7b6a9d 100644 --- a/IntelPresentMon/PresentMonAPI2Tests/Folders.h +++ b/IntelPresentMon/PresentMonAPI2Tests/Folders.h @@ -9,4 +9,10 @@ namespace EtlLoggerTests { static constexpr const char* logFolder_ = "TestLogs\\EtlLogger"; static constexpr const char* outFolder_ = "TestOutput\\EtlLogger"; +} + +namespace PacedPolling +{ + static constexpr const char* logFolder_ = "TestLogs\\PacedPolling"; + static constexpr const char* outFolder_ = "TestOutput\\PacedPolling"; } \ No newline at end of file diff --git a/IntelPresentMon/PresentMonAPI2Tests/ModuleInit.cpp b/IntelPresentMon/PresentMonAPI2Tests/ModuleInit.cpp index 954d85fc..2aa0045f 100644 --- a/IntelPresentMon/PresentMonAPI2Tests/ModuleInit.cpp +++ b/IntelPresentMon/PresentMonAPI2Tests/ModuleInit.cpp @@ -2,6 +2,8 @@ #include "CppUnitTest.h" #include #include "Folders.h" +#include "../PresentMonAPI2Loader/Loader.h" +#include "../PresentMonAPI2/Internal.h" using namespace Microsoft::VisualStudio::CppUnitTestFramework; namespace fs = std::filesystem; @@ -23,7 +25,13 @@ void WipeAndRecreate(const fs::path& path) TEST_MODULE_INITIALIZE(Api2TestModuleInit) { + // initialize c-api setting for in-module operation + pmLoaderSetPathToMiddlewareDll_("./PresentMonAPI2.dll"); + pmSetupODSLogging_(PM_DIAGNOSTIC_LEVEL_DEBUG, PM_DIAGNOSTIC_LEVEL_ERROR, false); + // setup folders WipeAndRecreate(MultiClientTests::logFolder_); WipeAndRecreate(EtlLoggerTests::logFolder_); WipeAndRecreate(EtlLoggerTests::outFolder_); + WipeAndRecreate(PacedPolling::logFolder_); + WipeAndRecreate(PacedPolling::outFolder_); } \ No newline at end of file diff --git a/IntelPresentMon/PresentMonAPI2Tests/MultiClientTests.cpp b/IntelPresentMon/PresentMonAPI2Tests/MultiClientTests.cpp index d5210b77..fc737fe4 100644 --- a/IntelPresentMon/PresentMonAPI2Tests/MultiClientTests.cpp +++ b/IntelPresentMon/PresentMonAPI2Tests/MultiClientTests.cpp @@ -3,228 +3,40 @@ #include "../CommonUtilities/win/WinAPI.h" #include "CppUnitTest.h" #include "StatusComparison.h" -#include "../PresentMonAPI2Loader/Loader.h" -#include "../CommonUtilities/pipe/Pipe.h" +#include "TestProcess.h" #include -#include -#include -#include -#include -#include -#include -#include "TestCommands.h" +#include #include "Folders.h" #include "JobManager.h" using namespace Microsoft::VisualStudio::CppUnitTestFramework; -namespace bp = boost::process; -namespace as = boost::asio; -namespace fs = std::filesystem; namespace vi = std::views; using namespace std::literals; using namespace pmon; namespace MultiClientTests { - static constexpr const char* controlPipe_ = R"(\\.\pipe\pm-multi-test-ctrl)"; - static constexpr const char* introNsm_ = "pm_multi_test_intro"; - static constexpr const char* logLevel_ = "info"; - - - class TestProcess - { - public: - TestProcess(as::io_context& ioctx, JobManager& jm, const std::string& executable, const std::vector& args) - : - pipeFrom_{ ioctx }, - pipeTo_{ ioctx }, - process_{ ioctx, executable, args, - bp::process_stdio{ pipeTo_, pipeFrom_, nullptr } } - { - jm.Attach(process_.native_handle()); - Logger::WriteMessage(std::format(" - Launched process {{{}}} [{}]\n", - executable, process_.id()).c_str()); - Assert::AreEqual("ping-ok"s, Command("ping")); - } - ~TestProcess() - { - if (process_.running()) { - Quit(); - } - } - - TestProcess(const TestProcess&) = delete; - TestProcess& operator=(const TestProcess&) = delete; - TestProcess(TestProcess&& other) noexcept = delete; - TestProcess& operator=(TestProcess&& other) noexcept = delete; - - void Quit() - { - Assert::IsTrue(process_.running()); - Assert::AreEqual("quit-ok"s, Command("quit")); - process_.wait(); - } - void Murder() - { - Assert::IsTrue(process_.running()); - ::TerminateProcess(process_.native_handle(), 0xDEAD); - process_.wait(); - } - std::string Command(const std::string command) - { - // send command - as::write(pipeTo_, as::buffer(std::format("%{}\n", command))); - - // read through the start marker and drop it (and any leading junk) - const auto n = as::read_until(pipeFrom_, readBufferFrom_, preamble_); - readBufferFrom_.consume(n); - - // read through the end marker, m counts bytes up to and including postamble - const auto m = as::read_until(pipeFrom_, readBufferFrom_, postamble_); - - // size string to accept payload - constexpr auto postambleSize = std::size(postamble_) - 1; - std::string payload; - payload.resize(m - postambleSize); - - // read into sized string using stream wrapper and discard postamble - std::istream is(&readBufferFrom_); - is.read(&payload[0], static_cast(payload.size())); - readBufferFrom_.consume(postambleSize); - - return payload; - } - private: - constexpr static const char preamble_[] = "%%{"; - constexpr static const char postamble_[] = "}%%\r\n"; - as::readable_pipe pipeFrom_; - as::streambuf readBufferFrom_; - as::writable_pipe pipeTo_; - bp::process process_; - }; - - class ServiceProcess : public TestProcess - { - public: - ServiceProcess(as::io_context& ioctx, JobManager& jm, const std::vector& customArgs = {}) - : - TestProcess{ ioctx, jm, "PresentMonService.exe"s, MakeArgs_(customArgs) } - {} - test::service::Status QueryStatus() - { - test::service::Status status; - std::istringstream is{ Command("status") }; - cereal::JSONInputArchive{ is }(status); - return status; - } - private: - std::vector MakeArgs_(const std::vector& customArgs) - { - std::vector allArgs{ - "--control-pipe"s, controlPipe_, - "--nsm-prefix"s, "pm_multi_test_nsm"s, - "--intro-nsm"s, introNsm_, - "--enable-test-control"s, - "--log-dir"s, logFolder_, - "--log-name-pid"s, - "--log-level"s, std::string(logLevel_), - }; - allArgs.append_range(customArgs); - return allArgs; - } - }; - - class ClientProcess : public TestProcess + class TestFixture : public CommonTestFixture { - public: - ClientProcess(as::io_context& ioctx, JobManager& jm, const std::vector& customArgs = {}) - : - TestProcess{ ioctx, jm, "SampleClient.exe"s, MakeArgs_(customArgs) } - {} - test::client::FrameResponse GetFrames() - { - test::client::FrameResponse resp; - std::istringstream is{ Command("get-frames") }; - cereal::JSONInputArchive{ is }(resp); - Assert::AreEqual("get-frames-ok"s, resp.status); - return resp; - } - private: - std::vector MakeArgs_(const std::vector& customArgs) - { - std::vector allArgs{ - "--control-pipe"s, controlPipe_, - "--intro-nsm"s, introNsm_, - "--middleware-dll-path"s, "PresentMonAPI2.dll"s, - "--log-folder"s, std::string(logFolder_), - "--log-name-pid"s, - "--log-level"s, std::string(logLevel_), - "--mode"s, "MultiClient"s, + protected: + const CommonProcessArgs& GetCommonArgs() const override + { + static CommonProcessArgs args{ + .ctrlPipe = R"(\\.\pipe\pm-multi-test-ctrl)", + .introNsm = "pm_multi_test_intro", + .frameNsm = "pm_multi_test_nsm", + .logLevel = "debug", + .logFolder = logFolder_, + .sampleClientMode = "MultiClient", }; - allArgs.append_range(customArgs); - return allArgs; - } - }; - - class PresenterProcess - { - public: - PresenterProcess(as::io_context& ioctx, JobManager& jm, const std::vector& customArgs = {}) - : - process_{ ioctx, path_, customArgs } - { - jm.Attach(process_.native_handle()); - Logger::WriteMessage(std::format(" - Launched process {{{}}} [{}]\n", - path_, process_.id()).c_str()); - } - uint32_t GetId() const - { - return process_.id(); - } - private: - static constexpr const char* path_ = R"(..\..\Tools\PresentBench.exe)"; - bp::process process_; - }; - - struct CommonTestFixture - { - JobManager jobMan; - std::thread ioctxRunThread; - as::io_context ioctx; - std::optional service; - - void Setup() - { - service.emplace(ioctx, jobMan); - ioctxRunThread = std::thread{ [&] {pmquell(ioctx.run()); } }; - // wait before every test to ensure that service is available - std::this_thread::sleep_for(50ms); - } - void Cleanup() - { - service.reset(); - ioctxRunThread.join(); - // sleep after every test to ensure that previous named pipe has vacated - std::this_thread::sleep_for(50ms); - } - ClientProcess LaunchClient(std::vector args = {}) - { - return ClientProcess{ ioctx, jobMan, std::move(args) }; - } - PresenterProcess LaunchPresenter(std::vector args = {}) - { - return PresenterProcess{ ioctx, jobMan, std::move(args) }; - } - std::unique_ptr LaunchClientAsPtr(std::vector args = {}) - { - return std::make_unique(ioctx, jobMan, std::move(args)); + return args; } }; TEST_CLASS(CommonFixtureTests) { - CommonTestFixture fixture_; + TestFixture fixture_; public: TEST_METHOD_INITIALIZE(Setup) @@ -281,7 +93,7 @@ namespace MultiClientTests TEST_CLASS(TelemetryPeriodTests) { - CommonTestFixture fixture_; + TestFixture fixture_; public: TEST_METHOD_INITIALIZE(Setup) @@ -461,7 +273,7 @@ namespace MultiClientTests TEST_CLASS(EtwFlushPeriodTests) { - CommonTestFixture fixture_; + TestFixture fixture_; public: TEST_METHOD_INITIALIZE(Setup) @@ -637,7 +449,7 @@ namespace MultiClientTests TEST_CLASS(TrackingTests) { - CommonTestFixture fixture_; + TestFixture fixture_; public: TEST_METHOD_INITIALIZE(Setup) @@ -721,13 +533,13 @@ namespace MultiClientTests { // launch target for tracking auto presenter = fixture_.LaunchPresenter(); - std::this_thread::sleep_for(250ms); + std::this_thread::sleep_for(150ms); // launch clients std::vector> clientPtrs; for (int i = 0; i < 32; i++) { clientPtrs.push_back(fixture_.LaunchClientAsPtr({ "--process-id"s, std::to_string(presenter.GetId()), - "--run-time"s, "2.25"s, + "--run-time"s, "1.25"s, "--etw-flush-period-ms"s, "8"s, })); } @@ -736,7 +548,7 @@ namespace MultiClientTests const auto frames = std::move(pClient->GetFrames().frames); Logger::WriteMessage(std::format("Read [{}] frames from client #{}\n", frames.size(), i).c_str()); - Assert::IsTrue(frames.size() >= 100ull, L"Minimum threshold frames received"); + Assert::IsTrue(frames.size() >= 40ull, L"Minimum threshold frames received"); } } }; diff --git a/IntelPresentMon/PresentMonAPI2Tests/PacedPollingTests.cpp b/IntelPresentMon/PresentMonAPI2Tests/PacedPollingTests.cpp new file mode 100644 index 00000000..34e51c94 --- /dev/null +++ b/IntelPresentMon/PresentMonAPI2Tests/PacedPollingTests.cpp @@ -0,0 +1,529 @@ +// Copyright (C) 2022-2023 Intel Corporation +// SPDX-License-Identifier: MIT +#include "../CommonUtilities/win/WinAPI.h" +#include "../CommonUtilities/str/String.h" +#include "CppUnitTest.h" +#include "TestProcess.h" +#include "Folders.h" +#include +#include "../PresentMonAPIWrapper/PresentMonAPIWrapper.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace Microsoft::VisualStudio::CppUnitTestFramework; +namespace fs = std::filesystem; +namespace rn = std::ranges; +namespace vi = rn::views; +using namespace std::literals; +using namespace pmon; + +namespace PacedPolling +{ + class TestFixture : public CommonTestFixture + { + public: + const CommonProcessArgs& GetCommonArgs() const override + { + static CommonProcessArgs args{ + .ctrlPipe = R"(\\.\pipe\pm-paced-polling-test-ctrl)", + .introNsm = "pm_paced_polling_test_intro", + .frameNsm = "pm_paced_polling_test_nsm", + .logLevel = "debug", + .logFolder = logFolder_, + .sampleClientMode = "PacedPlayback", + }; + return args; + } + }; + + struct Mismatch + { + size_t sampleIndex; + double val0; + double val1; + }; + + struct MetricCompareResult + { + std::vector mismatches; + double meanSquareError; + }; + + std::pair CalculateDynamicRange( + const std::vector& run0, + const std::vector& run1) + { + const auto [minIt0, maxIt0] = rn::minmax_element(run0); + const auto [minIt1, maxIt1] = rn::minmax_element(run1); + double lo = std::min(*minIt0, *minIt1); + double hi = std::max(*maxIt0, *maxIt1); + return { lo, hi }; + } + + MetricCompareResult CompareRunsForMetric( + const std::vector& run0, + const std::vector& run1, + double toleranceFactor) + { + // 1) compute dynamic range & tolerance + auto [lo, hi] = CalculateDynamicRange(run0, run1); + double tolerance = (hi - lo) * toleranceFactor; + + // 2) loop over corresponding samples and compare for individual mismatch and mse + MetricCompareResult result; + double sumSq = 0.0; + for (auto&& [i, v0, v1] : vi::zip(vi::iota(0ull), run0, run1)) { + const auto diff = v0 - v1; + sumSq += diff * diff; + if (std::abs(diff) > tolerance) { + result.mismatches.push_back({ i, v0, v1 }); + } + } + + // 3) finish computing MSE + if (run0.size() > 0) { + result.meanSquareError = sumSq / double(run0.size()); + } + else { + result.meanSquareError = 0.; + } + + return result; + } + + std::vector ExtractColumn(const std::vector>& mat, std::size_t i) + { + return mat | vi::transform([i](auto const& row) { return row[i]; }) | rn::to(); + } + + std::vector CompareRuns( + std::span qStats, + const std::vector>& run0, + const std::vector>& run1, + double toleranceFactor) + { + std::vector results; + for (auto&& [i, s] : vi::enumerate(qStats)) { + // triple tolerance for sensitive stats + if (rn::contains(std::array{ + PM_STAT_MAX, + PM_STAT_MIN, + PM_STAT_PERCENTILE_01, + PM_STAT_PERCENTILE_99, + PM_STAT_MID_POINT }, s)) { + toleranceFactor *= 3.; + } + // compare columns for each query element + results.push_back(CompareRunsForMetric( + ExtractColumn(run0, i), + ExtractColumn(run1, i), + toleranceFactor + )); + } + return results; + } + + auto LoadRunFromCsv(const std::string& path) + { + csv::CSVReader gold{ path }; + auto header = gold.get_col_names(); + std::vector> dataRows; + for (auto& row : gold) { + std::vector rowData; + rowData.reserve(row.size()); + for (auto& field : row) { + rowData.push_back(field.get()); + } + dataRows.push_back(std::move(rowData)); + } + return std::make_pair(std::move(header), std::move(dataRows)); + } + + using StatMap = std::unordered_map; + StatMap MakeStatMap(const pmapi::intro::Root& intro) + { + std::unordered_map statMap; + for (auto s : intro.FindEnum(PM_ENUM_STAT).GetKeys()) { + statMap[s.GetShortName()] = (PM_STAT)s.GetId(); + } + return statMap; + } + + std::vector HeaderToStats(std::span header, const StatMap& map) + { + // Capture text inside final parentheses, trimming optional whitespace. + static const std::regex paren_capture{ R"(.*\(\s*([^)]+?)\s*\)\s*$)", std::regex::ECMAScript }; + + std::vector stats; + stats.reserve(header.size()); + + for (const auto& col : header) { + std::smatch m; + if (!std::regex_match(col, m, paren_capture) || m.size() < 2) { + continue; + } + + const auto shortname = m[1].str(); + if (auto it = map.find(shortname); it != map.end()) { + stats.push_back(it->second); + } + else { + stats.push_back(PM_STAT_NONE); + Logger::WriteMessage(std::format("Failed to look up stat: {}\n", shortname).c_str()); + } + } + + return stats; + } + + void WriteResults( + const std::string& csvFilePath, + const std::vector& header, + std::vector results) + { + // output results to csvs + std::ofstream resStream{ csvFilePath }; + auto resWriter = csv::make_csv_writer(resStream); + resWriter << std::array{ "metric"s, "n-miss"s, "mse"s }; + for (auto&& [i, res] : vi::enumerate(results)) { + resWriter << std::make_tuple(header[i], res.mismatches.size(), res.meanSquareError); + } + } + + // works on the set of all results comparing one run (test) against another (gold) + // outputs aggregate showing at a glance how each test run compares to the gold + int ValidateAndAggregateResults(double sampleCount, std::string fileName, + const std::vector>& allResults) + { + // output aggregate results of all runs + std::ofstream aggStream{ outFolder_ + "\\"s + fileName }; + auto aggWriter = csv::make_csv_writer(aggStream); + aggWriter << std::array{ "#"s, "n-miss-total"s, "n-miss-max"s, "mse-total"s, "mse-max"s }; + int nFail = 0; + for (auto&& [i, runResult] : vi::enumerate(allResults)) { + size_t nMissTotal = 0; + size_t nMissMax = 0; + double mseTotal = 0.; + double mseMax = 0.; + for (auto& colRes : runResult) { + nMissTotal += colRes.mismatches.size(); + nMissMax = std::max(colRes.mismatches.size(), nMissMax); + mseTotal += colRes.meanSquareError; + mseMax = std::max(colRes.meanSquareError, mseMax); + } + aggWriter << std::make_tuple(i, nMissTotal, nMissMax, mseTotal, mseMax); + // factors to tweak the pass/fail decision points + const auto overallMissRatio = 0.033; + const auto perColumnMissRatio = 0.01; + const auto mseTotalFactor = 2.5; + const auto mseMaxFactor = 1.; + // fail if any single column has too many mismatches, or if the total across all + // columns exceeds a threshold (same idea for mse below as well) + if (nMissTotal > size_t(sampleCount * overallMissRatio) || + nMissMax > size_t(sampleCount * perColumnMissRatio)) { + nFail++; + } + else if (mseTotal > sampleCount * mseTotalFactor || + mseMax > sampleCount * mseMaxFactor) { + nFail++; + } + } + return nFail; + } + + auto DoPollingRunAndCompare(TestFixture& fix, const std::string& ctrlPipe, const StatMap& smap, + uint32_t targetPid, double recordingStart, double recordingStop, double pollPeriod, + const std::vector>& gold, double toleranceFactor, + const std::string& testName, const std::string& phaseName) + { + // build output file path + auto outCsvPath = std::format("{}\\{}_{}.csv", outFolder_, testName, phaseName); + // execute a test run and record samples, sync on exit + fix.LaunchClient({ + "--process-id"s, std::to_string(targetPid), + "--output-path"s, outCsvPath, + "--run-time"s, std::to_string(recordingStop - recordingStart), + "--run-start"s, std::to_string(recordingStart), + "--poll-period"s, std::to_string(pollPeriod), + "--metric-offset"s, "64"s, + "--window-size"s, "1000"s, + }); + // load up result + auto [header, run] = LoadRunFromCsv(outCsvPath); + // extract stats from header + auto stats = HeaderToStats(header, smap); + // compare against gold + auto compResults = CompareRuns(stats, run, gold, toleranceFactor); + // record results for possible post-mortem + WriteResults(std::format("{}\\{}_{}_rslt.csv", outFolder_, testName, phaseName), + header, compResults); + // return the results + return compResults; + } + + void PrintAnalysisHint(const std::string& testName, const std::string& mode) + { + // script analysis command line info + const auto rootPath = fs::current_path().parent_path().parent_path(); + static const auto scriptPath = (rootPath / "Tests\\Scripts\\analyze-paced.py").string(); + static const auto outPath = (rootPath / "build\\Debug\\TestOutput\\PacedPolling").string(); + static const auto goldPath = (rootPath / "Tests\\AuxData\\Data").string(); + // print command to run + Logger::WriteMessage("Analyze with:\n"); + Logger::WriteMessage(std::format(R"(python "{}" --run-mode {} --folder "{}" --name {} --golds "{}")", + scriptPath, mode, outPath, testName, goldPath).c_str()); + Logger::WriteMessage("\n"); + } + + // ordering results by misses w/ column ids + // returns column index,column compare result + std::vector> GetRankedResults( + const std::vector& columnResults, size_t nOut) + { + // attach column index to results and filter out those with zero mismatches + auto enumeratedResults = columnResults | vi::enumerate | vi::filter( + [](const std::tuple& rslt) { + return !std::get<1>(rslt).mismatches.empty(); }) | + rn::to(); + // sort indices by mismatch count + rn::sort(enumeratedResults, [](const std::tuple& a, + const std::tuple& b) { + return std::get<1>(a).mismatches.size() > std::get<1>(b).mismatches.size(); + }); + // limit max results + if (enumeratedResults.size() > nOut) enumeratedResults.resize(nOut); + // return results + return enumeratedResults; + } + + // print ranked column results + void PrintRankedResults(const std::vector& columnResults, size_t nOut, + const std::vector& header, size_t indentation = 3) + { + auto tabs = std::string(indentation, ' '); + for (auto&& [idx, rslt] : GetRankedResults(columnResults, nOut)) { + Logger::WriteMessage(std::format("{}[{}] {}: {}\n", + tabs, idx, header[idx], rslt.mismatches.size()).c_str()); + } + } + + void ExecutePacedPollingTest(const std::string& testName, uint32_t targetPid, double recordingStart, + double recordingStop, double pollPeriod, double toleranceFactor, double fullFailRatio, + TestFixture& fixture) + { + // hardcoded constants + const size_t nRunsFull = 9; + const size_t nRoundRobin = 12; + + // derived parameters + const auto goldCsvPath = std::format(R"(..\..\Tests\AuxData\Data\{}_gold.csv)", testName); + const auto sampleCount = (recordingStop - recordingStart) / pollPeriod; + + + auto& common = fixture.GetCommonArgs(); + const auto smap = [&] { + pmapi::Session tempSession{ common.ctrlPipe }; + const auto pTempIntro = tempSession.GetIntrospectionRoot(); + return MakeStatMap(*pTempIntro); + }(); + + // compare all runs against gold if exists + if (std::filesystem::exists(goldCsvPath)) { + auto [goldHeader, gold] = LoadRunFromCsv(goldCsvPath); + // do one polling run and compare against gold + auto oneshotCompRes = DoPollingRunAndCompare( + fixture, + common.ctrlPipe, + smap, + targetPid, + recordingStart, + recordingStop, + pollPeriod, + gold, + toleranceFactor, + testName, + "oneshot" + ); + const auto nFailOneshot = ValidateAndAggregateResults(sampleCount, + testName + "_oneshot_agg.csv", { oneshotCompRes }); + // if oneshot run succeeds with zero failures, we finish here + if (nFailOneshot == 0) { + Logger::WriteMessage("One-shot success\n"); + // output commandline to run to visually analyze results + PrintAnalysisHint(testName, "one-shot"); + // output ranked results + PrintRankedResults(oneshotCompRes, 3, goldHeader); + } + else { + Logger::WriteMessage("One-shot failed, executing full run...\n"); + // output ranked results + PrintRankedResults(oneshotCompRes, 3, goldHeader); + // oneshot failed, run N times and see if enough pass to seem plausible + std::vector> allResults; + for (size_t i = 0; i < nRunsFull; i++) { + // restart service to restart playback + fixture.RebootService(); + // do Nth polling run and compare against gold + auto compRes = DoPollingRunAndCompare( + fixture, + common.ctrlPipe, + smap, + targetPid, + recordingStart, + recordingStop, + pollPeriod, + gold, + toleranceFactor, + testName, + std::format("full_{:02}", i) + ); + allResults.push_back(std::move(compRes)); + } + // validate comparison results + const auto nFail = ValidateAndAggregateResults(sampleCount, testName + "_full_agg.csv", allResults); + // output commandline to run to visually analyze results + PrintAnalysisHint(testName, "full"); + for (auto&& [j, r] : allResults | vi::enumerate) { + Logger::WriteMessage(std::format(" Run [{}]\n", j).c_str()); + // output ranked results + PrintRankedResults(r, 3, goldHeader, 6); + } + Assert::IsTrue(nFail < (int)std::round(nRunsFull * fullFailRatio), + std::format(L"Failed [{}] runs (of {})", nFail, nRunsFull).c_str()); + Logger::WriteMessage(std::format(L"Retry success (failed [{}] of [{}])\n", nFail, nRunsFull).c_str()); + } + } + else { // if gold doesn't exist, do cartesian product comparison over many runs to generate data for a new gold + std::vector>> allRobinRuns; + std::vector header; + for (size_t i = 0; i < nRoundRobin; i++) { + // restart service to restart playback + fixture.RebootService(); + // execute a test run and record samples, sync on exit + auto outCsvPath = std::format("{}\\{}_robin_{:02}.csv", outFolder_, testName, i); + fixture.LaunchClient({ + "--process-id"s, std::to_string(targetPid), + "--output-path"s, outCsvPath, + "--run-time"s, std::to_string(recordingStop - recordingStart), + "--run-start"s, std::to_string(recordingStart), + "--poll-period"s, std::to_string(pollPeriod), + "--metric-offset"s, "64"s, + "--window-size"s, "1000"s, + }); + // load up result and collect in memory + auto [runHeader, run] = LoadRunFromCsv(outCsvPath); + if (header.empty()) { + header = runHeader; + } + allRobinRuns.push_back(std::move(run)); + } + const auto stats = HeaderToStats(header, smap); + // do cartesian product and record all results + std::vector>> allRobinResults(allRobinRuns.size()); + for (size_t iA = 0; iA < allRobinRuns.size(); ++iA) { + for (size_t iB = 0; iB < allRobinRuns.size(); ++iB) { + // compare run A vs run B + auto results = CompareRuns(stats, allRobinRuns[iA], allRobinRuns[iB], toleranceFactor); + // write per-pair results + WriteResults( + std::format("{}\\{}_robin_{:02}_{:02}_rslt.csv", outFolder_, testName, iA, iB), + header, + results + ); + allRobinResults[iA].push_back(std::move(results)); + } + } + // aggregate for each candidate + std::ofstream robinUberAggStream{ std::format("{}\\{}_robin_uber_agg.csv", outFolder_, testName) }; + auto aggWriter = csv::make_csv_writer(robinUberAggStream); + aggWriter << std::array{ "#"s, "n-fail-total"s }; + Logger::WriteMessage("Round Robin Results\n===================\n"); + for (size_t i = 0; i < allRobinRuns.size(); i++) { + const auto nFail = ValidateAndAggregateResults( + sampleCount, + std::format("{}_robin_{:02}_agg.csv", testName, i), + allRobinResults[i] + ); + aggWriter << std::make_tuple(i, nFail); + Logger::WriteMessage(std::format("#{:02}: {}\n", i, nFail).c_str()); + } + // output commandline to run to visually analyze results + PrintAnalysisHint(testName, "round-robin"); + // hardcode a fail because this execution path requires analysis and + // selection of a gold result to lock in + Assert::IsTrue(false, L"Run complete, analysis is required to select gold result."); + } + } + +#define TEST_NAME P00HeaWin2080 + TEST_CLASS(TEST_NAME) + { + TestFixture fixture_; + public: + TEST_METHOD_INITIALIZE(Setup) + { + fixture_.Setup({ + "--etl-test-file"s, std::format(R"(..\..\Tests\AuxData\Data\{}.etl)", STRINGIFY(TEST_NAME)), + "--pace-playback"s, + }); + } + TEST_METHOD_CLEANUP(Cleanup) + { + fixture_.Cleanup(); + } + TEST_METHOD(PollDynamic) + { + // setup test parameters + const uint32_t targetPid = 12820; + const auto recordingStart = 1.; + const auto recordingStop = 14.; + const auto pollPeriod = 0.1; + const auto toleranceFactor = 0.005; + const auto fullFailRatio = 0.667; + // run test + ExecutePacedPollingTest(STRINGIFY(TEST_NAME), targetPid, recordingStart, recordingStop, + pollPeriod, toleranceFactor, fullFailRatio, fixture_); + } + }; +#undef TEST_NAME + +#define TEST_NAME P01TimeSpyDemoFS2080 + TEST_CLASS(TEST_NAME) + { + TestFixture fixture_; + public: + TEST_METHOD_INITIALIZE(Setup) + { + fixture_.Setup({ + "--etl-test-file"s, std::format(R"(..\..\Tests\AuxData\Data\{}.etl)", STRINGIFY(TEST_NAME)), + "--pace-playback"s, + }); + } + TEST_METHOD_CLEANUP(Cleanup) + { + fixture_.Cleanup(); + } + TEST_METHOD(PollDynamic) + { + // setup test parameters + const uint32_t targetPid = 19736; + const auto recordingStart = 1.; + const auto recordingStop = 34.; + const auto pollPeriod = 0.1; + const auto toleranceFactor = 0.005; + const auto fullFailRatio = 0.667; + // run test + ExecutePacedPollingTest(STRINGIFY(TEST_NAME), targetPid, recordingStart, recordingStop, + pollPeriod, toleranceFactor, fullFailRatio, fixture_); + } + }; +#undef TEST_NAME +} \ No newline at end of file diff --git a/IntelPresentMon/PresentMonAPI2Tests/PolledPacedTests.cpp b/IntelPresentMon/PresentMonAPI2Tests/PolledPacedTests.cpp deleted file mode 100644 index f5105d0f..00000000 --- a/IntelPresentMon/PresentMonAPI2Tests/PolledPacedTests.cpp +++ /dev/null @@ -1,439 +0,0 @@ -// Copyright (C) 2022-2023 Intel Corporation -// SPDX-License-Identifier: MIT -#include "../CommonUtilities/win/WinAPI.h" -#include "CppUnitTest.h" -#include -#include -#include "../PresentMonAPI2Loader/Loader.h" -#include "../PresentMonAPI2/Internal.h" -#include "../CommonUtilities/pipe/Pipe.h" -#include "../CommonUtilities/IntervalWaiter.h" -#include "../PresentMonAPIWrapper/PresentMonAPIWrapper.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace Microsoft::VisualStudio::CppUnitTestFramework; -namespace bp = boost::process::v1; -namespace fs = std::filesystem; -namespace rn = std::ranges; -namespace vi = rn::views; -using namespace std::literals; -using namespace pmon; - -namespace PacedPollingTests -{ - std::vector ExtractColumn(const std::vector>& mat, std::size_t i) - { - return mat | vi::transform([i](auto const& row) { return row[i]; }) - | rn::to(); - } - - class BlobReader - { - struct LookupInfo_ - { - uint64_t offset; - PM_DATA_TYPE type; - }; - public: - BlobReader(std::span qels, std::shared_ptr pIntro) - { - for (auto& q : qels) { - qInfo_.push_back({ q.dataOffset, pIntro->FindMetric(q.metric).GetDataTypeInfo().GetPolledType() }); - } - } - void Target(const pmapi::BlobContainer& blobs, uint32_t iBlob = 0) - { - pFirstByteTarget_ = blobs[iBlob]; - } - template - T At(size_t iElement) - { - const auto off = qInfo_[iElement].offset; - switch (qInfo_[iElement].type) { - case PM_DATA_TYPE_BOOL: return (T)reinterpret_cast(pFirstByteTarget_[off]); - case PM_DATA_TYPE_DOUBLE: return reinterpret_cast(pFirstByteTarget_[off]); - case PM_DATA_TYPE_ENUM: return (T)reinterpret_cast(pFirstByteTarget_[off]); - case PM_DATA_TYPE_INT32: return (T)reinterpret_cast(pFirstByteTarget_[off]); - case PM_DATA_TYPE_STRING: return (T)-1; - case PM_DATA_TYPE_UINT32: return (T)reinterpret_cast(pFirstByteTarget_[off]); - case PM_DATA_TYPE_UINT64: return (T)reinterpret_cast(pFirstByteTarget_[off]); - case PM_DATA_TYPE_VOID: return (T)-1; - } - return (T)-1; - } - private: - const uint8_t* pFirstByteTarget_ = nullptr; - std::vector qInfo_; - }; - - struct Mismatch - { - size_t sampleIndex; - double val0; - double val1; - }; - - struct MetricCompareResult - { - std::vector mismatches; - double meanSquareError; - }; - - std::pair CalculateDynamicRange( - const std::vector& run0, - const std::vector& run1) - { - const auto [minIt0, maxIt0] = rn::minmax_element(run0); - const auto [minIt1, maxIt1] = rn::minmax_element(run1); - double lo = std::min(*minIt0, *minIt1); - double hi = std::max(*maxIt0, *maxIt1); - return { lo, hi }; - } - - MetricCompareResult CompareRunsForMetric( - const std::vector& run0, - const std::vector& run1, - double toleranceFactor) - { - // 1) compute dynamic range & tolerance - auto [lo, hi] = CalculateDynamicRange(run0, run1); - double tolerance = (hi - lo) * toleranceFactor; - - // 2) loop over corresponding samples and compare for individual mismatch and mse - MetricCompareResult result; - double sumSq = 0.0; - for (auto&& [i, v0, v1] : vi::zip(vi::iota(0ull), run0, run1)) { - const auto diff = v0 - v1; - sumSq += diff * diff; - if (std::abs(diff) > tolerance) { - result.mismatches.push_back({ i, v0, v1 }); - } - } - - // 3) finish computing MSE - result.meanSquareError = sumSq / static_cast(run0.size()); - return result; - } - - std::vector CompareRuns( - std::span qels, - const std::vector>& run0, - const std::vector>& run1, - double toleranceFactor) - { - std::vector results; - for (auto&& [i, q] : vi::enumerate(qels)) { - if (rn::contains(std::array{ - PM_STAT_MAX, - PM_STAT_MIN, - PM_STAT_PERCENTILE_01, - PM_STAT_PERCENTILE_99, - PM_STAT_MID_POINT }, q.stat)) { - toleranceFactor *= 3.; - } - results.push_back(CompareRunsForMetric( - ExtractColumn(run0, i), - ExtractColumn(run1, i), - toleranceFactor - )); - } - return results; - } - - std::vector> LoadRunFromCsv(const std::string& path) - { - csv::CSVReader gold{ path }; - std::vector> dataRows; - for (auto& row : gold) { - std::vector rowData; - rowData.reserve(row.size()); - for (auto& field : row) { - rowData.push_back(field.get()); - } - dataRows.push_back(std::move(rowData)); - } - return dataRows; - } - - std::vector BuildQueryElementSet(const pmapi::intro::Root& intro) - { - std::vector qels; - for (const auto& m : intro.GetMetrics()) { - // there is no reliable way of distinguishing CPU telemetry metrics from PresentData-based metrics via introspection - // adding CPU device type is an idea, however that would require changing device id of the cpu metrics from 0 to - // whatever id is assigned to cpu (probably an upper range like 1024+) and this might break existing code that just - // hardcodes device id for the CPU metrics; for the time being use a hardcoded blacklist here - if (rn::contains(std::array{ - PM_METRIC_CPU_UTILIZATION, - PM_METRIC_CPU_POWER_LIMIT, - PM_METRIC_CPU_POWER, - PM_METRIC_CPU_TEMPERATURE, - PM_METRIC_CPU_FREQUENCY, - PM_METRIC_CPU_CORE_UTILITY, - }, m.GetId())) { - continue; - } - if (m.GetType() != PM_METRIC_TYPE_DYNAMIC && m.GetType() != PM_METRIC_TYPE_DYNAMIC_FRAME) { - continue; - } - auto dmi = m.GetDeviceMetricInfo(); - if (dmi.size() != 1) { - continue; - } - if (!dmi.front().IsAvailable() || dmi.front().GetDevice().GetId() != 0) { - continue; - } - if (m.GetDataTypeInfo().GetPolledType() == PM_DATA_TYPE_STRING) { - continue; - } - for (const auto& s : m.GetStatInfo()) { - // skip displayed fps (max) as it is broken now - if (m.GetId() == PM_METRIC_DISPLAYED_FPS && s.GetStat() == PM_STAT_MAX) { - continue; - } - qels.push_back(PM_QUERY_ELEMENT{ m.GetId(), s.GetStat() }); - } - } - return qels; - } - - std::vector MakeHeader( - const std::vector& qels, - const pmapi::intro::Root& intro) - { - std::vector headerColumns{ "poll-time"s }; - for (auto& qel : qels) { - headerColumns.push_back(std::format("{}({})", - intro.FindMetric(qel.metric).Introspect().GetSymbol(), - intro.FindEnum(PM_ENUM_STAT).FindKey((int)qel.stat).GetShortName() - )); - } - return headerColumns; - } - - void WriteRunToCsv( - const std::string& csvFilePath, - const std::vector& header, - const std::vector>& runRows) - { - std::ofstream csvStream{ csvFilePath }; - auto csvWriter = csv::make_csv_writer(csvStream); - csvWriter << header; - for (auto& row : runRows) { - csvWriter << row; - } - } - - void WriteResults( - const std::string& csvFilePath, - const std::vector& header, - std::vector results) - { - // output results to csvs - std::ofstream resStream{ csvFilePath }; - auto resWriter = csv::make_csv_writer(resStream); - resWriter << std::array{ "metric"s, "n-miss"s, "mse"s }; - for (auto&& [i, res] : vi::enumerate(results)) { - // we need to protect csv lib from inf values, it does not handle them well - auto mse = std::isinf(res.meanSquareError) ? -0.0001 : res.meanSquareError; - resWriter << std::make_tuple(header[i], res.mismatches.size(), mse); - } - } - - TEST_CLASS(PacedPollingTests) - { - public: - TEST_METHOD_CLEANUP(Cleanup) - { - } - TEST_METHOD(PollDynamic) - { - const uint32_t targetPid = 12820; - const auto recordingStart = 1s; - const auto recordingStop = 14s; - - const auto pipeName = R"(\\.\pipe\pm-poll-test-act)"s; - const auto etlName = "Heaven-win-vsync-2080ti.etl"s; - const auto goldCsvPath = R"(..\..\Tests\PacedGold\polled_gold.csv)"s; - const auto outputBasePath = R"(PacedTest\Polled1\)"s; - const auto toleranceFactor = 0.02; - - std::filesystem::create_directories(outputBasePath); - - pmLoaderSetPathToMiddlewareDll_("./PresentMonAPI2.dll"); - pmSetupODSLogging_(PM_DIAGNOSTIC_LEVEL_DEBUG, PM_DIAGNOSTIC_LEVEL_ERROR, false); - - std::vector>> allRuns; - std::vector qels; - std::vector header; - - // generate playback polling data for N runs - const auto Run = [&](int n) { - for (int x = 0; x < n; x++) { - // short sleep at the beginning of very run but the first - // waiting to make sure previous svc has cleaned up 100% - if (x > 0) { - std::this_thread::sleep_for(50ms); - } - - bp::child svc{ "PresentMonService.exe"s, - "--control-pipe"s, pipeName, - "--nsm-prefix"s, "pmon_poll_test_nsm"s, - "--intro-nsm"s, "pm_poll_test_intro"s, - "--etl-test-file"s, etlName, - "--pace-playback" }; - // wait until child svc is ready to accept connections, fail if it takes too long - Assert::IsTrue(pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500), - L"Timeout waiting for service control pipe"); - // connect to svc and get introspection - pmapi::Session api{ pipeName }; - auto pIntro = api.GetIntrospectionRoot(); - // build the query element set via introspect if not yet built (first run only) - if (qels.empty()) { - qels = BuildQueryElementSet(*pIntro); - } - // build the header if necessary - if (header.empty()) { - header = MakeHeader(qels, *pIntro); - } - // register query and create necessary blob - auto query = api.RegisterDynamicQuery(qels, 1000., 64.); - auto blobs = query.MakeBlobContainer(1); - // start tracking target - auto tracker = api.TrackProcess(targetPid); - // get the waiter and the timer clocks ready - using Clock = std::chrono::high_resolution_clock; - const auto startTime = Clock::now(); - util::IntervalWaiter waiter{ 0.1, 0.001 }; - // run polling loop and poll into vector - std::vector> rows; - std::vector cells; - BlobReader br{ qels, pIntro }; - br.Target(blobs); - for (auto now = Clock::now(), start = Clock::now(); - now - start <= recordingStop; now = Clock::now()) { - // skip recording while time has not reached start time - if (now - start >= recordingStart) { - cells.reserve(qels.size() + 1); - query.Poll(tracker, blobs); - // first column is the time as measured in polling loop - cells.push_back(std::chrono::duration(now - start).count()); - // remaining columns are from the query - for (size_t i = 0; i < qels.size(); i++) { - cells.push_back(br.At(i)); - } - rows.push_back(std::move(cells)); - } - waiter.Wait(); - } - // write the full run data to csv file - WriteRunToCsv(std::format("{}test_run_{}.csv", outputBasePath, allRuns.size()), header, rows); - // append run data to the vector of all runs - allRuns.push_back(std::move(rows)); - } - }; - - // compare all runs against gold if exists - if (std::filesystem::exists(goldCsvPath)) { - std::vector> allResults; - // load gold csv - auto gold = LoadRunFromCsv(goldCsvPath); - const auto DoComparison = [&] { - // loop over all runs in memory and compare with gold, write results - for (auto&& [i, run] : vi::enumerate(allRuns)) { - auto results = CompareRuns(qels, run, gold, toleranceFactor); - WriteResults(std::format("{}results_{}.csv", outputBasePath, i), header, results); - allResults.push_back(std::move(results)); - } - }; - const auto ValidateAndWriteAggregateResults = [&] { - // output aggregate results of all runs - std::ofstream aggStream{ outputBasePath + "results_agg.csv"s }; - auto aggWriter = csv::make_csv_writer(aggStream); - aggWriter << std::array{ "#"s, "n-miss-total"s, "n-miss-max"s, "mse-total"s, "mse-max"s }; - int nFail = 0; - for (auto&& [i, columnResults] : vi::enumerate(allResults)) { - size_t nMissTotal = 0; - size_t nMissMax = 0; - double mseTotal = 0.; - double mseMax = 0.; - for (auto& colRes : columnResults) { - nMissTotal += colRes.mismatches.size(); - nMissMax = std::max(colRes.mismatches.size(), nMissMax); - mseTotal += colRes.meanSquareError; - mseMax = std::max(colRes.meanSquareError, mseMax); - } - aggWriter << std::make_tuple(i, nMissTotal, nMissMax, mseTotal, mseMax); - const auto rowCount = allRuns[i].size(); - // fail if any single column has too many mismatches, or if the total of all - // columns exceeds a threshold (same idea for mse below as well) - if (nMissTotal > size_t(rowCount / 33.) || nMissMax > size_t(rowCount / 100.)) { - nFail++; - } - else if (mseTotal > rowCount * 2.5 || mseMax > double(rowCount)) { - nFail++; - } - } - return nFail; - }; - // first attempt to compare single run against gold - Run(1); - DoComparison(); - if (ValidateAndWriteAggregateResults() == 0) { - Logger::WriteMessage("One-shot success"); - } - else { - // first single run fails, run N times and see if enough pass to seem plausible - allResults.clear(); - const int nRuns = 9; - Run(nRuns); - DoComparison(); - const auto nFail = ValidateAndWriteAggregateResults(); - Assert::IsTrue(nFail < (int)std::roundf(nRuns * 0.667f), - std::format(L"Failed [{}] runs (of {})", nFail, nRuns).c_str()); - Logger::WriteMessage(std::format(L"Retry success (failed [{}] of [{}])", nFail, nRuns).c_str()); - } - } - else { // if gold doesn't exist, do cartesian product comparison of all - const int nRuns = 9; - Run(nRuns); - std::vector mismatchTotals(allRuns.size(), 0); - for (size_t iA = 0; iA < allRuns.size(); ++iA) { - for (size_t iB = iA + 1; iB < allRuns.size(); ++iB) { - // compare run A vs run B - auto results = CompareRuns(qels, allRuns[iA], allRuns[iB], toleranceFactor); - // write per-pair results - WriteResults(std::format("{}round_robin_{}_{}.csv", outputBasePath, iA, iB), header, results); - - // accumulate total mismatches for ranking - size_t sumMiss = 0; - for (const auto& res : results) { - sumMiss += res.mismatches.size(); - } - mismatchTotals[iA] += sumMiss; - mismatchTotals[iB] += sumMiss; - } - } - - // write aggregate ranking of runs by total mismatches - std::ofstream aggStream{ outputBasePath + "round_robin_agg.csv"s }; - auto aggWriter = csv::make_csv_writer(aggStream); - aggWriter << std::array{ "#"s, "n-miss-total"s }; - for (size_t i = 0; i < mismatchTotals.size(); ++i) { - aggWriter << std::make_tuple(i, mismatchTotals[i]); - } - // hardcode a fail because this execution path requires analysis and - // selection of a gold result to lock in - Assert::IsTrue(false, L"Run complete, analysis is required to select gold result."); - } - } - }; -} \ No newline at end of file diff --git a/IntelPresentMon/PresentMonAPI2Tests/PresentMonAPI2Tests.vcxproj b/IntelPresentMon/PresentMonAPI2Tests/PresentMonAPI2Tests.vcxproj index 0f33d4de..5ce3f9ec 100644 --- a/IntelPresentMon/PresentMonAPI2Tests/PresentMonAPI2Tests.vcxproj +++ b/IntelPresentMon/PresentMonAPI2Tests/PresentMonAPI2Tests.vcxproj @@ -99,7 +99,7 @@ - + @@ -131,6 +131,7 @@ + diff --git a/IntelPresentMon/PresentMonAPI2Tests/PresentMonAPI2Tests.vcxproj.filters b/IntelPresentMon/PresentMonAPI2Tests/PresentMonAPI2Tests.vcxproj.filters index beac5d79..a8ea4a3d 100644 --- a/IntelPresentMon/PresentMonAPI2Tests/PresentMonAPI2Tests.vcxproj.filters +++ b/IntelPresentMon/PresentMonAPI2Tests/PresentMonAPI2Tests.vcxproj.filters @@ -27,7 +27,7 @@ Source Files - + Source Files @@ -59,5 +59,8 @@ Header Files + + Header Files + \ No newline at end of file diff --git a/IntelPresentMon/PresentMonAPI2Tests/TestProcess.h b/IntelPresentMon/PresentMonAPI2Tests/TestProcess.h new file mode 100644 index 00000000..d2c6d02f --- /dev/null +++ b/IntelPresentMon/PresentMonAPI2Tests/TestProcess.h @@ -0,0 +1,328 @@ +// Copyright (C) 2022-2023 Intel Corporation +// SPDX-License-Identifier: MIT +#pragma once +#include "../CommonUtilities/win/WinAPI.h" +#include "CppUnitTest.h" +#include "JobManager.h" +#include "TestCommands.h" +#include "../CommonUtilities/file/FileUtils.h" +#include "../CommonUtilities/pipe/Pipe.h" +#include +#include +#include +#include +#include +#include + +using namespace Microsoft::VisualStudio::CppUnitTestFramework; +namespace as = boost::asio; +namespace bp = boost::process; +namespace as = boost::asio; +namespace fs = std::filesystem; +using namespace std::literals; +using namespace pmon; + +struct CommonProcessArgs +{ + std::string ctrlPipe; + std::string introNsm; + std::string frameNsm; + std::string logLevel; + std::string logFolder; + std::string sampleClientMode; +}; + +// base class to represent child processes launched by test cases +class TestProcess +{ +public: + TestProcess(as::io_context& ioctx, JobManager& jm, const std::string& executable, + const std::vector& args) + : + pipeFrom_{ ioctx }, + pipeTo_{ ioctx }, + process_{ ioctx, executable, args, + bp::process_stdio{ pipeTo_, pipeFrom_, nullptr } } + { + jm.Attach(process_.native_handle()); + Logger::WriteMessage(std::format(" - Launched process {{{}}} [{}]\n", + executable, process_.id()).c_str()); + } + + TestProcess(const TestProcess&) = delete; + TestProcess& operator=(const TestProcess&) = delete; + TestProcess(TestProcess&& other) noexcept = delete; + TestProcess& operator=(TestProcess&& other) noexcept = delete; + virtual ~TestProcess() = default; + + void Murder() + { + Assert::IsTrue(process_.running()); + ::TerminateProcess(process_.native_handle(), 0xDEAD); + process_.wait(); + } + uint32_t GetId() const + { + return process_.id(); + } + void Wait() + { + process_.wait(); + } + std::string Command(const std::string& command) + { + const auto prefix = GetCommandPrefix_(); + const auto preamble = GetCommandResponsePreamble_(); + const auto postamble = GetCommandResponsePostamble_(); + + // send command + as::write(pipeTo_, as::buffer(std::format("{}{}\n", prefix, command))); + + // read through the start marker and drop it (and any leading junk) + const auto n = as::read_until(pipeFrom_, readBufferFrom_, preamble); + readBufferFrom_.consume(n); + + // read through the end marker, m counts bytes up to and including postamble + const auto m = as::read_until(pipeFrom_, readBufferFrom_, postamble); + + // size string to accept payload + std::string payload; + payload.resize(m - postamble.size()); + + // read into sized string using stream wrapper and discard postamble + std::istream is(&readBufferFrom_); + is.read(&payload[0], static_cast(payload.size())); + readBufferFrom_.consume(postamble.size()); + + return payload; + } +private: + as::readable_pipe pipeFrom_; + as::streambuf readBufferFrom_; + as::writable_pipe pipeTo_; +protected: + virtual std::string GetCommandPrefix_() const { return ""; } + virtual std::string GetCommandResponsePreamble_() const { return ""; } + virtual std::string GetCommandResponsePostamble_() const { return "\r\n"; } + bp::process process_; +}; + +// test process that has connection-oriented session with ping and quit lifecycle commands +class ConnectedTestProcess : public TestProcess +{ +public: + ConnectedTestProcess(as::io_context& ioctx, JobManager& jm, const std::string& executable, + const std::vector& args) + : + TestProcess{ ioctx, jm, executable, args } + { + Ping(); + } + void Quit() + { + Assert::IsTrue(process_.running()); + Assert::AreEqual("quit-ok"s, Command("quit")); + process_.wait(); + } + void Ping() + { + Assert::AreEqual("ping-ok"s, Command("ping")); + } + ~ConnectedTestProcess() override + { + if (process_.running()) { + Quit(); + } + } +protected: + std::string GetCommandPrefix_() const override { return "%"; } + std::string GetCommandResponsePreamble_() const override { return "%%{"; } + std::string GetCommandResponsePostamble_() const override { return "}%%\r\n"; } +}; + +// service as child +class ServiceProcess : public ConnectedTestProcess +{ +public: + ServiceProcess(as::io_context& ioctx, JobManager& jm, const std::vector& customArgs, + const CommonProcessArgs& common) + : + ConnectedTestProcess{ ioctx, jm, "PresentMonService.exe"s, MakeArgs_(customArgs, common) } + { + } + test::service::Status QueryStatus() + { + test::service::Status status; + std::istringstream is{ Command("status") }; + cereal::JSONInputArchive{ is }(status); + return status; + } +private: + std::vector MakeArgs_(const std::vector& customArgs, + const CommonProcessArgs& common) + { + std::vector allArgs{ + "--control-pipe"s, common.ctrlPipe, + "--nsm-prefix"s, common.frameNsm, + "--intro-nsm"s, common.introNsm, + "--enable-test-control"s, + "--log-dir"s, common.logFolder, + "--log-name-pid"s, + "--log-level"s, common.logLevel, + }; + allArgs.append_range(customArgs); + return allArgs; + } +}; + +// SampleClient as a driver for interacting with service test child +class ClientProcess : public ConnectedTestProcess +{ +public: + ClientProcess(as::io_context& ioctx, JobManager& jm, const std::vector& customArgs, + const CommonProcessArgs& common) + : + ConnectedTestProcess{ ioctx, jm, "SampleClient.exe"s, MakeArgs_(customArgs, common) } + { + } + test::client::FrameResponse GetFrames() + { + test::client::FrameResponse resp; + std::istringstream is{ Command("get-frames") }; + cereal::JSONInputArchive{ is }(resp); + Assert::AreEqual("get-frames-ok"s, resp.status); + return resp; + } +private: + std::vector MakeArgs_(const std::vector& customArgs, + const CommonProcessArgs& common) + { + std::vector allArgs{ + "--control-pipe"s, common.ctrlPipe, + "--intro-nsm"s, common.introNsm, + "--middleware-dll-path"s, "PresentMonAPI2.dll"s, + "--log-folder"s, common.logFolder, + "--log-name-pid"s, + "--log-level"s, common.logLevel, + "--mode"s, common.sampleClientMode, + }; + allArgs.append_range(customArgs); + return allArgs; + } +}; + +// PresentBench child process for a reliable presenting target process +class PresenterProcess : public TestProcess +{ +public: + PresenterProcess(as::io_context& ioctx, JobManager& jm, const std::vector& customArgs) + : + TestProcess{ ioctx, jm, R"(..\..\Tools\PresentBench.exe)", customArgs } + {} +}; + +// original presentmon console application +class OpmProcess : public TestProcess +{ +public: + OpmProcess(as::io_context& ioctx, JobManager& jm, const std::vector& customArgs) + : + TestProcess{ ioctx, jm, LocateExecutable_(), customArgs } + {} +private: + static std::string LocateExecutable_() + { + const auto pattern = R"(^PresentMon-\d+\.\d+\.\d+-x64\.exe$)"; + try { + return util::file::FindFilesMatchingPattern(fs::current_path(), pattern).at(0).string(); + } + catch (...) { + Logger::WriteMessage(std::format("Failed to find executable matching: [{}]", pattern).c_str()); + Assert::IsTrue(false); + return ""; + } + } +}; + +// fixture to embed into each test class to give common setup/cleanup/child management +class CommonTestFixture +{ +public: + std::optional service; + + CommonTestFixture() = default; + CommonTestFixture(const CommonTestFixture&) = delete; + CommonTestFixture& operator=(const CommonTestFixture&) = delete; + CommonTestFixture(CommonTestFixture&&) = delete; + CommonTestFixture& operator=(CommonTestFixture&&) = delete; + virtual ~CommonTestFixture() = default; + + void Setup(std::vector args = {}) + { + StartService_(args, GetCommonArgs()); + svcArgs_ = std::move(args); + } + void Cleanup() + { + StopService_(GetCommonArgs()); + ioctxRunThread_.join(); + } + void RebootService(std::optional> newArgs = {}) + { + auto& common = GetCommonArgs(); + auto& svcArgs = newArgs ? *newArgs : svcArgs_; + StopService_(common); + StartService_(svcArgs, common); + svcArgs_ = std::move(svcArgs); + } + ClientProcess LaunchClient(const std::vector& args = {}) + { + return ClientProcess{ ioctx_, jobMan_, args, GetCommonArgs() }; + } + std::unique_ptr LaunchClientAsPtr(const std::vector& args = {}) + { + return std::make_unique(ioctx_, jobMan_, args, GetCommonArgs()); + } + PresenterProcess LaunchPresenter(const std::vector& args = {}) + { + return PresenterProcess{ ioctx_, jobMan_, args }; + } + OpmProcess LaunchOpm(const std::vector& args = {}) + { + return OpmProcess{ ioctx_, jobMan_, args }; + } + virtual const CommonProcessArgs& GetCommonArgs() const = 0; +private: + // functions + void StartService_(const std::vector& args, const CommonProcessArgs& common) + { + // make sure ioctx thread is running and keep it running until service launches + auto workGuard = ReserveIoctxThread_(); + // launch the service + service.emplace(ioctx_, jobMan_, args, common); + // ensure that service pipe is available + Assert::IsTrue(util::pipe::DuplexPipe::WaitForAvailability(common.ctrlPipe, svcPipeTimeout_), + L"Timed out waiting for pipe availability"); + } + void StopService_(const CommonProcessArgs& common) + { + service.reset(); + // ensure that service pipe has vacated + Assert::IsTrue(util::pipe::DuplexPipe::WaitForVacancy(common.ctrlPipe, svcPipeTimeout_), + L"Timed out waiting for pipe vacancy"); + } + as::executor_work_guard ReserveIoctxThread_() + { + auto workGuard = as::executor_work_guard{ ioctx_.get_executor() }; + if (!ioctxRunThread_.joinable()) { + ioctxRunThread_ = std::thread{ [&] {try { ioctx_.run(); } catch (...) {}} }; + } + return workGuard; + } + // data + static constexpr int svcPipeTimeout_ = 250; + std::vector svcArgs_; + JobManager jobMan_; + std::thread ioctxRunThread_; + as::io_context ioctx_; +}; \ No newline at end of file diff --git a/IntelPresentMon/PresentMonMiddleware/ConcreteMiddleware.cpp b/IntelPresentMon/PresentMonMiddleware/ConcreteMiddleware.cpp index cdb8c01f..b21e54e4 100644 --- a/IntelPresentMon/PresentMonMiddleware/ConcreteMiddleware.cpp +++ b/IntelPresentMon/PresentMonMiddleware/ConcreteMiddleware.cpp @@ -48,7 +48,7 @@ namespace pmon::mid // Try to open a named pipe; wait for it, if necessary try { - if (!pipe::DuplexPipe::WaitForAvailability(pipeName + "-in"s, 500)) { + if (!pipe::DuplexPipe::WaitForAvailability(pipeName, 500)) { throw std::runtime_error{ "Timeout waiting for service action pipe to become available" }; } pActionClient = std::make_shared(pipeName); diff --git a/IntelPresentMon/SampleClient/CliOptions.h b/IntelPresentMon/SampleClient/CliOptions.h index 7a4ac0fa..10edc478 100644 --- a/IntelPresentMon/SampleClient/CliOptions.h +++ b/IntelPresentMon/SampleClient/CliOptions.h @@ -23,6 +23,7 @@ namespace clio IntrospectAllDynamicOptions, MultiClient, EtlLogger, + PacedPlayback, Count, }; @@ -38,14 +39,16 @@ namespace clio Option introNsm{ this, "--intro-nsm", "", "Name of the NSM used for introspection data" }; Option middlewareDllPath{ this, "--middleware-dll-path", "", "Override middleware DLL path discovery with custom path" }; private: Group gs_{ this, "Sampling", "Control sampling / targeting behavior" }; public: - Option metricOffset{ this, "--metric-offset", 1000., "Offset from top for frame data. Used in --dynamic-query-sample" }; - Option windowSize{ this, "--window-size", 2000., "Window size used for metrics calculation. Used in --dynamic-query-sample" }; + Option metricOffset{ this, "--metric-offset", 1064., "Offset from top for frame data. Used in --dynamic-query-sample" }; + Option windowSize{ this, "--window-size", 1000., "Window size used for metrics calculation. Used in --dynamic-query-sample" }; Option processId{ this, "--process-id", 0, "Process Id to use for polling or frame data capture" }; Option processName{ this, "--process-name", "", "Name of process to use for polling or frame data capture" }; Option metric{ this, "--metric", "", "PM_METRIC, ex. PM_METRIC_PRESENTED_FPS" }; Option telemetryPeriodMs{ this, "--telemetry-period-ms", {}, "Telemetry period in milliseconds" }; Option etwFlushPeriodMs{ this, "--etw-flush-period-ms", {}, "ETW manual flush period in milliseconds" }; - Option runTime{ this, "--run-time", {}, "How long to capture for, in seconds" }; + Option runTime{ this, "--run-time", 10., "How long to capture for, in seconds" }; + Option runStart{ this, "--run-start", 1., "How many seconds to delay before beginning run" }; + Option pollPeriod{ this, "--poll-period", 0.1, "Period in seconds for polling the API query" }; Option outputPath{ this, "--output-path", {}, "Full path to output to" }; private: Group gl_{ this, "Logging", "Control logging behavior" }; public: Option logLevel{ this, "--log-level", log::Level::Error, "Severity to log at", CLI::CheckedTransformer{ log::GetLevelMapNarrow(), CLI::ignore_case } }; diff --git a/IntelPresentMon/SampleClient/PacedPlayback.cpp b/IntelPresentMon/SampleClient/PacedPlayback.cpp new file mode 100644 index 00000000..766d55cd --- /dev/null +++ b/IntelPresentMon/SampleClient/PacedPlayback.cpp @@ -0,0 +1,283 @@ +#include "MultiClient.h" +#include "CliOptions.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace pmon; +using namespace std::literals; +using namespace pmon::test::client; +using Clock = std::chrono::steady_clock; +namespace rn = std::ranges; + +std::vector MakeHeader( + std::span qels, + const pmapi::intro::Root& intro) +{ + std::vector headerColumns{ "poll-time"s }; + for (auto& qel : qels) { + headerColumns.push_back(std::format("{}({})", + intro.FindMetric(qel.metric).Introspect().GetSymbol(), + intro.FindEnum(PM_ENUM_STAT).FindKey((int)qel.stat).GetShortName() + )); + } + return headerColumns; +} + +void WriteRunToCsv( + const std::string& csvFilePath, + const std::vector& header, + const std::vector>& runRows) +{ + std::ofstream csvStream{ csvFilePath }; + auto csvWriter = csv::make_csv_writer(csvStream); + csvWriter << header; + for (auto& row : runRows) { + csvWriter << row; + } +} + +class BlobReader +{ + struct LookupInfo_ + { + uint64_t offset; + PM_DATA_TYPE type; + }; +public: + BlobReader(std::span qels, std::shared_ptr pIntro) + { + for (auto& q : qels) { + qInfo_.push_back({ q.dataOffset, pIntro->FindMetric(q.metric).GetDataTypeInfo().GetPolledType() }); + } + } + void Target(const pmapi::BlobContainer& blobs, uint32_t iBlob = 0) + { + pFirstByteTarget_ = blobs[iBlob]; + } + template + T At(size_t iElement) + { + const auto off = qInfo_[iElement].offset; + switch (qInfo_[iElement].type) { + case PM_DATA_TYPE_BOOL: return (T)reinterpret_cast(pFirstByteTarget_[off]); + case PM_DATA_TYPE_DOUBLE: return reinterpret_cast(pFirstByteTarget_[off]); + case PM_DATA_TYPE_ENUM: return (T)reinterpret_cast(pFirstByteTarget_[off]); + case PM_DATA_TYPE_INT32: return (T)reinterpret_cast(pFirstByteTarget_[off]); + case PM_DATA_TYPE_STRING: return (T)-1; + case PM_DATA_TYPE_UINT32: return (T)reinterpret_cast(pFirstByteTarget_[off]); + case PM_DATA_TYPE_UINT64: return (T)reinterpret_cast(pFirstByteTarget_[off]); + case PM_DATA_TYPE_VOID: return (T)-1; + } + return (T)-1; + } +private: + const uint8_t* pFirstByteTarget_ = nullptr; + std::vector qInfo_; +}; + +std::vector BuildQueryElementSet(const pmapi::intro::Root& intro) +{ + std::vector qels; + for (const auto& m : intro.GetMetrics()) { + // there is no reliable way of distinguishing CPU telemetry metrics from PresentData-based metrics via introspection + // adding CPU device type is an idea, however that would require changing device id of the cpu metrics from 0 to + // whatever id is assigned to cpu (probably an upper range like 1024+) and this might break existing code that just + // hardcodes device id for the CPU metrics; for the time being use a hardcoded blacklist here + if (rn::contains(std::array{ + PM_METRIC_CPU_UTILIZATION, + PM_METRIC_CPU_POWER_LIMIT, + PM_METRIC_CPU_POWER, + PM_METRIC_CPU_TEMPERATURE, + PM_METRIC_CPU_FREQUENCY, + PM_METRIC_CPU_CORE_UTILITY, + }, m.GetId())) { + continue; + } + // only allow dynamic metrics + if (m.GetType() != PM_METRIC_TYPE_DYNAMIC && m.GetType() != PM_METRIC_TYPE_DYNAMIC_FRAME) { + continue; + } + // should be exactly 1 device (universal one) + auto dmi = m.GetDeviceMetricInfo(); + if (dmi.size() != 1) { + continue; + } + // device must be available and 0 (universal) + if (!dmi.front().IsAvailable() || dmi.front().GetDevice().GetId() != 0) { + continue; + } + // don't work on string data metrics + if (m.GetDataTypeInfo().GetPolledType() == PM_DATA_TYPE_STRING) { + continue; + } + for (const auto& s : m.GetStatInfo()) { + // skip displayed fps (max) as it is broken now + if (m.GetId() == PM_METRIC_DISPLAYED_FPS && s.GetStat() == PM_STAT_MAX) { + continue; + } + qels.push_back(PM_QUERY_ELEMENT{ m.GetId(), s.GetStat() }); + } + } + return qels; +} + +class TestClientModule +{ +public: + TestClientModule(std::unique_ptr pSession, double windowMs, + double offsetMs) + : + pSession_{ std::move(pSession) }, + pIntro_{ pSession_->GetIntrospectionRoot() }, + qels_{ BuildQueryElementSet(*pIntro_) }, + query_{ pSession_->RegisterDynamicQuery(qels_, windowMs, offsetMs) }, + blobs_{ query_.MakeBlobContainer(1) } + {} + const pmapi::intro::Root& GetIntrospection() const + { + return *pIntro_; + } + std::span GetQueryElements() const + { + return qels_; + } + void SetETWFlushPeriod(uint32_t ms) + { + pSession_->SetEtwFlushPeriod(ms); + } + void SetTelemetryPeriod(uint32_t ms) + { + pSession_->SetTelemetryPollingPeriod(0, ms); + } + std::vector> RecordPolling(uint32_t targetPid, double recordingStartSec, + double recordingStopSec, double pollInterval) + { + // start tracking target + auto tracker = pSession_->TrackProcess(targetPid); + // get the waiter and the timer clocks ready + using Clock = std::chrono::high_resolution_clock; + const auto startTime = Clock::now(); + util::IntervalWaiter waiter{ pollInterval, 0.001 }; + // run polling loop and poll into vector + std::vector> rows; + std::vector cells; + BlobReader br{ qels_, pIntro_ }; + br.Target(blobs_); + const auto recordingStart = recordingStartSec * 1s; + const auto recordingStop = recordingStopSec * 1s; + for (auto now = Clock::now(), start = Clock::now(); + now - start <= recordingStop; now = Clock::now()) { + // skip recording while time has not reached start time + if (now - start >= recordingStart) { + cells.reserve(qels_.size() + 1); + query_.Poll(tracker, blobs_); + // first column is the time as measured in polling loop + cells.push_back(std::chrono::duration(now - start).count()); + // remaining columns are from the query + for (size_t i = 0; i < qels_.size(); i++) { + cells.push_back(br.At(i)); + } + rows.push_back(std::move(cells)); + } + waiter.Wait(); + } + return rows; + } +private: + std::unique_ptr pSession_; + std::shared_ptr pIntro_; + std::vector qels_; + pmapi::DynamicQuery query_; + pmapi::BlobContainer blobs_; +}; + +int PacedPlaybackTest(std::unique_ptr pSession) +{ + auto& opt = clio::Options::Get(); + + std::optional errorStatus; + + try { + if (!opt.processId) { + pmlog_error("need pid"); + } + + // connect to service and register query + TestClientModule client{ std::move(pSession), *opt.windowSize, *opt.metricOffset }; + if (opt.etwFlushPeriodMs) { + client.SetETWFlushPeriod(*opt.etwFlushPeriodMs); + } + if (opt.telemetryPeriodMs) { + client.SetTelemetryPeriod(*opt.telemetryPeriodMs); + } + + // ping gate to sync on init finished + std::string line; + std::getline(std::cin, line); + if (line != "%ping") { + std::cout << "%%{ping-error}%%" << std::endl; + return -1; + } + std::cout << "%%{ping-ok}%%" << std::endl; + + // poll for designated period and parse run results + const auto runTimeEnd = *opt.runStart + *opt.runTime; + auto run = client.RecordPolling(*opt.processId, *opt.runStart, runTimeEnd, *opt.pollPeriod); + WriteRunToCsv(*opt.outputPath, MakeHeader(client.GetQueryElements(), client.GetIntrospection()), run); + } + catch (const pmapi::ApiErrorException& e) { + if (!opt.testExpectError) { + throw; + } + errorStatus = e.GetCode(); + } + + std::string line; + + // if we captured an error, wait here for error ack + if (errorStatus) { + std::getline(std::cin, line); + if (line != "%err-check") { + std::cout << "%%{err-check-error}%%" << std::endl; + return -1; + } + auto&& err = pmapi::EnumMap::GetKeyMap(PM_ENUM_STATUS)->at(*errorStatus).narrowSymbol; + std::cout << "%%{err-check-ok:" << err << "}%%" << std::endl; + } + + // wait for command + while (std::getline(std::cin, line)) { + if (line == "%quit") { + std::cout << "%%{quit-ok}%%" << std::endl; + std::this_thread::sleep_for(25ms); + return 0; + } + //else if (line == "%get-frames") { + // FrameResponse resp; + // if (!opt.runTime) { + // resp.status = "get-frames-err:not-recorded"; + // } + // else { + // resp.status = "get-frames-ok"; + // resp.frames = frames; + // } + // std::ostringstream oss; + // cereal::JSONOutputArchive{ oss }(resp); + // std::cout << "%%{" << oss.str() << "}%%" << std::endl; + //} + else { + std::cout << "%%{err-bad-command}%%" << std::endl; + } + } + + return -1; +} \ No newline at end of file diff --git a/IntelPresentMon/SampleClient/PacedPlayback.h b/IntelPresentMon/SampleClient/PacedPlayback.h new file mode 100644 index 00000000..9d223c7b --- /dev/null +++ b/IntelPresentMon/SampleClient/PacedPlayback.h @@ -0,0 +1,6 @@ +#pragma once +#include +#include "../PresentMonAPIWrapper/PresentMonAPIWrapper.h" + +// mode used in conjuction with polled paced playback unit test suite +int PacedPlaybackTest(std::unique_ptr pSession); \ No newline at end of file diff --git a/IntelPresentMon/SampleClient/SampleClient.cpp b/IntelPresentMon/SampleClient/SampleClient.cpp index 70a4b39a..b8390fd6 100644 --- a/IntelPresentMon/SampleClient/SampleClient.cpp +++ b/IntelPresentMon/SampleClient/SampleClient.cpp @@ -33,6 +33,7 @@ #include "MetricListSample.h" #include "MultiClient.h" #include "EtlLogger.h" +#include "PacedPlayback.h" #include "LogDemo.h" #include "DiagnosticDemo.h" #include "LogSetup.h" @@ -228,7 +229,7 @@ void RunPlaybackDynamicQueryN() }; // connect to the service with custom control pipe name - pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500); + pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500); auto api = pmapi::Session{ pipeName }; std::ofstream csv{ std::format("polled_{}.csv", x)}; @@ -292,7 +293,7 @@ void IntrospectAllDynamicOptions() }; // connect to the service with custom control pipe name - pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName + "-in", 500); + pmon::util::pipe::DuplexPipe::WaitForAvailability(pipeName, 500); auto api = pmapi::Session{ pipeName }; auto pIntro = api.GetIntrospectionRoot(); @@ -320,7 +321,9 @@ int main(int argc, char* argv[]) { try { // command line options initialization - if (auto e = clio::Options::Init(argc, argv)) { + if (auto e = clio::Options::Init(argc, argv, true)) { + pmlog_error(clio::Options::GetDiagnostics()).no_trace(); + std::cerr << clio::Options::GetDiagnostics() << std::endl; return *e; } auto& opt = clio::Options::Get(); @@ -371,6 +374,8 @@ int main(int argc, char* argv[]) return MultiClientTest(ConnectSession()); case clio::Mode::EtlLogger: return EtlLoggerTest(ConnectSession()); + case clio::Mode::PacedPlayback: + return PacedPlaybackTest(ConnectSession()); case clio::Mode::PlaybackDynamicQuery: RunPlaybackDynamicQueryN(); break; case clio::Mode::PlaybackFrameQuery: @@ -380,17 +385,13 @@ int main(int argc, char* argv[]) default: throw std::runtime_error{ "unknown sample client mode" }; } - - // exit code - return 0; - } - catch (const std::exception& e) { - std::cout << "Error: " << e.what() << std::endl; - return -1; } catch (...) { - std::cout << "Unknown Error" << std::endl; + const auto exr = pmon::util::ReportException(); + std::cout << "Error: " << exr.first << std::endl; + pmlog_error(exr); return -1; } + return 0; } \ No newline at end of file diff --git a/IntelPresentMon/SampleClient/SampleClient.vcxproj b/IntelPresentMon/SampleClient/SampleClient.vcxproj index 3be33f75..ec564cb9 100644 --- a/IntelPresentMon/SampleClient/SampleClient.vcxproj +++ b/IntelPresentMon/SampleClient/SampleClient.vcxproj @@ -112,6 +112,7 @@ + @@ -127,6 +128,7 @@ + diff --git a/IntelPresentMon/SampleClient/SampleClient.vcxproj.filters b/IntelPresentMon/SampleClient/SampleClient.vcxproj.filters index e7c065e0..f99ae36f 100644 --- a/IntelPresentMon/SampleClient/SampleClient.vcxproj.filters +++ b/IntelPresentMon/SampleClient/SampleClient.vcxproj.filters @@ -8,6 +8,7 @@ + @@ -24,5 +25,6 @@ + \ No newline at end of file diff --git a/Tests/.gitignore b/Tests/.gitignore new file mode 100644 index 00000000..ce9cf307 --- /dev/null +++ b/Tests/.gitignore @@ -0,0 +1 @@ +AuxData/ \ No newline at end of file diff --git a/Tests/PacedGold/polled_gold.csv b/Tests/PacedGold/polled_gold.csv deleted file mode 100644 index 44ff5da0..00000000 --- a/Tests/PacedGold/polled_gold.csv +++ /dev/null @@ -1,131 +0,0 @@ -poll-time,PM_METRIC_CPU_FRAME_TIME(avg),PM_METRIC_CPU_FRAME_TIME(99%),PM_METRIC_CPU_FRAME_TIME(95%),PM_METRIC_CPU_FRAME_TIME(90%),PM_METRIC_CPU_FRAME_TIME(1%),PM_METRIC_CPU_FRAME_TIME(5%),PM_METRIC_CPU_FRAME_TIME(10%),PM_METRIC_CPU_FRAME_TIME(max),PM_METRIC_CPU_FRAME_TIME(min),PM_METRIC_CPU_FRAME_TIME(raw),PM_METRIC_CPU_BUSY(avg),PM_METRIC_CPU_BUSY(99%),PM_METRIC_CPU_BUSY(95%),PM_METRIC_CPU_BUSY(90%),PM_METRIC_CPU_BUSY(1%),PM_METRIC_CPU_BUSY(5%),PM_METRIC_CPU_BUSY(10%),PM_METRIC_CPU_BUSY(max),PM_METRIC_CPU_BUSY(min),PM_METRIC_CPU_BUSY(raw),PM_METRIC_CPU_WAIT(avg),PM_METRIC_CPU_WAIT(99%),PM_METRIC_CPU_WAIT(95%),PM_METRIC_CPU_WAIT(90%),PM_METRIC_CPU_WAIT(1%),PM_METRIC_CPU_WAIT(5%),PM_METRIC_CPU_WAIT(10%),PM_METRIC_CPU_WAIT(max),PM_METRIC_CPU_WAIT(min),PM_METRIC_CPU_WAIT(raw),PM_METRIC_DISPLAYED_FPS(avg),PM_METRIC_DISPLAYED_FPS(99%),PM_METRIC_DISPLAYED_FPS(95%),PM_METRIC_DISPLAYED_FPS(90%),PM_METRIC_DISPLAYED_FPS(1%),PM_METRIC_DISPLAYED_FPS(5%),PM_METRIC_DISPLAYED_FPS(10%),PM_METRIC_DISPLAYED_FPS(min),PM_METRIC_DISPLAYED_FPS(raw),PM_METRIC_PRESENTED_FPS(avg),PM_METRIC_PRESENTED_FPS(99%),PM_METRIC_PRESENTED_FPS(95%),PM_METRIC_PRESENTED_FPS(90%),PM_METRIC_PRESENTED_FPS(1%),PM_METRIC_PRESENTED_FPS(5%),PM_METRIC_PRESENTED_FPS(10%),PM_METRIC_PRESENTED_FPS(max),PM_METRIC_PRESENTED_FPS(min),PM_METRIC_PRESENTED_FPS(raw),PM_METRIC_GPU_TIME(avg),PM_METRIC_GPU_TIME(99%),PM_METRIC_GPU_TIME(95%),PM_METRIC_GPU_TIME(90%),PM_METRIC_GPU_TIME(1%),PM_METRIC_GPU_TIME(5%),PM_METRIC_GPU_TIME(10%),PM_METRIC_GPU_TIME(max),PM_METRIC_GPU_TIME(min),PM_METRIC_GPU_TIME(raw),PM_METRIC_GPU_BUSY(avg),PM_METRIC_GPU_BUSY(99%),PM_METRIC_GPU_BUSY(95%),PM_METRIC_GPU_BUSY(90%),PM_METRIC_GPU_BUSY(1%),PM_METRIC_GPU_BUSY(5%),PM_METRIC_GPU_BUSY(10%),PM_METRIC_GPU_BUSY(max),PM_METRIC_GPU_BUSY(min),PM_METRIC_GPU_BUSY(raw),PM_METRIC_GPU_WAIT(avg),PM_METRIC_GPU_WAIT(99%),PM_METRIC_GPU_WAIT(95%),PM_METRIC_GPU_WAIT(90%),PM_METRIC_GPU_WAIT(1%),PM_METRIC_GPU_WAIT(5%),PM_METRIC_GPU_WAIT(10%),PM_METRIC_GPU_WAIT(max),PM_METRIC_GPU_WAIT(min),PM_METRIC_GPU_WAIT(raw),PM_METRIC_DROPPED_FRAMES(avg),PM_METRIC_DROPPED_FRAMES(99%),PM_METRIC_DROPPED_FRAMES(95%),PM_METRIC_DROPPED_FRAMES(90%),PM_METRIC_DROPPED_FRAMES(1%),PM_METRIC_DROPPED_FRAMES(5%),PM_METRIC_DROPPED_FRAMES(10%),PM_METRIC_DROPPED_FRAMES(max),PM_METRIC_DROPPED_FRAMES(min),PM_METRIC_DROPPED_FRAMES(raw),PM_METRIC_SYNC_INTERVAL(raw),PM_METRIC_PRESENT_FLAGS(raw),PM_METRIC_PRESENT_MODE(raw),PM_METRIC_PRESENT_RUNTIME(raw),PM_METRIC_ALLOWS_TEARING(avg),PM_METRIC_ALLOWS_TEARING(99%),PM_METRIC_ALLOWS_TEARING(95%),PM_METRIC_ALLOWS_TEARING(90%),PM_METRIC_ALLOWS_TEARING(1%),PM_METRIC_ALLOWS_TEARING(5%),PM_METRIC_ALLOWS_TEARING(10%),PM_METRIC_ALLOWS_TEARING(max),PM_METRIC_ALLOWS_TEARING(min),PM_METRIC_ALLOWS_TEARING(raw),PM_METRIC_GPU_LATENCY(avg),PM_METRIC_GPU_LATENCY(99%),PM_METRIC_GPU_LATENCY(95%),PM_METRIC_GPU_LATENCY(90%),PM_METRIC_GPU_LATENCY(1%),PM_METRIC_GPU_LATENCY(5%),PM_METRIC_GPU_LATENCY(10%),PM_METRIC_GPU_LATENCY(max),PM_METRIC_GPU_LATENCY(min),PM_METRIC_GPU_LATENCY(raw),PM_METRIC_CLICK_TO_PHOTON_LATENCY(øavg),PM_METRIC_CLICK_TO_PHOTON_LATENCY(1%),PM_METRIC_CLICK_TO_PHOTON_LATENCY(5%),PM_METRIC_CLICK_TO_PHOTON_LATENCY(10%),PM_METRIC_CLICK_TO_PHOTON_LATENCY(max),PM_METRIC_APPLICATION_FPS(avg),PM_METRIC_APPLICATION_FPS(99%),PM_METRIC_APPLICATION_FPS(95%),PM_METRIC_APPLICATION_FPS(90%),PM_METRIC_APPLICATION_FPS(1%),PM_METRIC_APPLICATION_FPS(5%),PM_METRIC_APPLICATION_FPS(10%),PM_METRIC_APPLICATION_FPS(max),PM_METRIC_APPLICATION_FPS(min),PM_METRIC_APPLICATION_FPS(raw),PM_METRIC_FRAME_TYPE(),PM_METRIC_ANIMATION_ERROR(avg),PM_METRIC_ANIMATION_ERROR(99%),PM_METRIC_ANIMATION_ERROR(95%),PM_METRIC_ANIMATION_ERROR(90%),PM_METRIC_ANIMATION_ERROR(1%),PM_METRIC_ANIMATION_ERROR(5%),PM_METRIC_ANIMATION_ERROR(10%),PM_METRIC_ANIMATION_ERROR(max),PM_METRIC_ANIMATION_ERROR(min),PM_METRIC_ANIMATION_ERROR(raw),PM_METRIC_ALL_INPUT_TO_PHOTON_LATENCY(øavg),PM_METRIC_ALL_INPUT_TO_PHOTON_LATENCY(1%),PM_METRIC_ALL_INPUT_TO_PHOTON_LATENCY(5%),PM_METRIC_ALL_INPUT_TO_PHOTON_LATENCY(10%),PM_METRIC_ALL_INPUT_TO_PHOTON_LATENCY(max),PM_METRIC_INSTRUMENTED_LATENCY(avg),PM_METRIC_INSTRUMENTED_LATENCY(99%),PM_METRIC_INSTRUMENTED_LATENCY(95%),PM_METRIC_INSTRUMENTED_LATENCY(90%),PM_METRIC_INSTRUMENTED_LATENCY(1%),PM_METRIC_INSTRUMENTED_LATENCY(5%),PM_METRIC_INSTRUMENTED_LATENCY(10%),PM_METRIC_INSTRUMENTED_LATENCY(max),PM_METRIC_INSTRUMENTED_LATENCY(min),PM_METRIC_INSTRUMENTED_LATENCY(raw),PM_METRIC_BETWEEN_DISPLAY_CHANGE(avg),PM_METRIC_BETWEEN_DISPLAY_CHANGE(99%),PM_METRIC_BETWEEN_DISPLAY_CHANGE(95%),PM_METRIC_BETWEEN_DISPLAY_CHANGE(90%),PM_METRIC_BETWEEN_DISPLAY_CHANGE(1%),PM_METRIC_BETWEEN_DISPLAY_CHANGE(5%),PM_METRIC_BETWEEN_DISPLAY_CHANGE(10%),PM_METRIC_BETWEEN_DISPLAY_CHANGE(max),PM_METRIC_BETWEEN_DISPLAY_CHANGE(min),PM_METRIC_BETWEEN_DISPLAY_CHANGE(raw),PM_METRIC_UNTIL_DISPLAYED(avg),PM_METRIC_UNTIL_DISPLAYED(99%),PM_METRIC_UNTIL_DISPLAYED(95%),PM_METRIC_UNTIL_DISPLAYED(90%),PM_METRIC_UNTIL_DISPLAYED(1%),PM_METRIC_UNTIL_DISPLAYED(5%),PM_METRIC_UNTIL_DISPLAYED(10%),PM_METRIC_UNTIL_DISPLAYED(max),PM_METRIC_UNTIL_DISPLAYED(min),PM_METRIC_UNTIL_DISPLAYED(raw),PM_METRIC_PC_LATENCY(avg),PM_METRIC_PC_LATENCY(99%),PM_METRIC_PC_LATENCY(95%),PM_METRIC_PC_LATENCY(90%),PM_METRIC_PC_LATENCY(1%),PM_METRIC_PC_LATENCY(5%),PM_METRIC_PC_LATENCY(10%),PM_METRIC_PC_LATENCY(max),PM_METRIC_PC_LATENCY(min),PM_METRIC_PC_LATENCY(raw),PM_METRIC_DISPLAYED_FRAME_TIME(avg),PM_METRIC_DISPLAYED_FRAME_TIME(99%),PM_METRIC_DISPLAYED_FRAME_TIME(95%),PM_METRIC_DISPLAYED_FRAME_TIME(90%),PM_METRIC_DISPLAYED_FRAME_TIME(1%),PM_METRIC_DISPLAYED_FRAME_TIME(5%),PM_METRIC_DISPLAYED_FRAME_TIME(10%),PM_METRIC_DISPLAYED_FRAME_TIME(max),PM_METRIC_DISPLAYED_FRAME_TIME(min),PM_METRIC_DISPLAYED_FRAME_TIME(raw),PM_METRIC_PRESENTED_FRAME_TIME(avg),PM_METRIC_PRESENTED_FRAME_TIME(99%),PM_METRIC_PRESENTED_FRAME_TIME(95%),PM_METRIC_PRESENTED_FRAME_TIME(90%),PM_METRIC_PRESENTED_FRAME_TIME(1%),PM_METRIC_PRESENTED_FRAME_TIME(5%),PM_METRIC_PRESENTED_FRAME_TIME(10%),PM_METRIC_PRESENTED_FRAME_TIME(max),PM_METRIC_PRESENTED_FRAME_TIME(min),PM_METRIC_PRESENTED_FRAME_TIME(raw) -1.09990,6.94518,7.44069,7.16992,7.09816,6.67407,6.76247,6.79244,7.44069,6.64440,6.94740,2.58459,3.33380,3.13073,3.06768,2.13274,2.17262,2.22648,3.33380,2.11640,2.58780,4.36058,5.03310,4.81395,4.76248,3.60363,3.70871,3.85568,5.03310,3.46870,4.36819,143.98332,144.77483,144.33846,144.22231,143.19467,143.60821,143.70335,143.19467,143.97811,144.13510,163.78578,158.29547,156.09975,124.67117,133.80146,134.32735,166.78341,124.67117,141.61898,6.82260,7.42570,7.10376,7.01184,6.28588,6.37260,6.44324,7.42570,6.21879,6.74699,2.75949,2.92710,2.90947,2.88332,2.63338,2.65816,2.68356,2.92710,2.62470,2.74180,4.06310,4.54490,4.33971,4.29992,3.47550,3.60929,3.69976,4.54490,3.39750,4.10740,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.57871,2.17799,1.98100,1.88188,1.41032,1.43104,1.43918,2.17799,1.39140,1.51780,0.0,0.0,0.0,0.0,0.0,143.98464,119.51857,125.87023,127.71131,174.32615,170.02927,164.41527,119.51857,179.04782,143.76078,0.0,0.07673,0.50640,0.26512,0.20140,0.00156,0.00337,0.00460,0.50640,0.00020,0.02770,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94524,6.98350,6.96339,6.95878,6.90727,6.92816,6.93374,6.98350,6.89670,6.94550,24.62027,25.12260,25.05393,25.02524,23.76090,23.97598,24.15572,25.12260,23.73390,24.63720,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94524,6.98350,6.96339,6.95878,6.90727,6.92816,6.93374,6.98350,6.89670,6.94550,6.93793,8.02110,7.47376,7.44450,6.10553,6.31730,6.40615,8.02110,5.99580,7.06120 -1.19989,6.94499,7.44041,7.19265,7.10161,6.64474,6.75749,6.78916,7.44069,6.45760,6.92810,2.64137,6.12876,3.17418,3.07003,2.13560,2.17578,2.23907,6.15680,2.11640,2.59600,4.30361,5.14635,4.81815,4.75958,3.47019,3.69882,3.80939,5.14749,0.62820,4.34799,143.98417,144.73757,144.33950,144.20442,143.19655,143.63306,143.70603,143.19467,143.97811,144.05352,166.74792,158.60302,156.02181,100.62048,131.68247,133.89551,272.62070,100.42479,141.61898,6.80186,7.42487,7.10837,7.03215,6.09891,6.32500,6.42665,7.42570,5.88430,6.90520,2.75386,2.92708,2.89578,2.88005,2.63489,2.65811,2.67926,2.92710,2.62470,2.73330,4.04799,4.61033,4.34328,4.30694,3.35978,3.52308,3.64755,4.61099,3.20700,4.10240,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.58475,2.31857,2.08563,1.89098,1.39141,1.42687,1.43394,2.32000,1.10210,1.51780,0.0,0.0,0.0,0.0,0.0,143.98856,88.69087,125.11972,127.72028,178.38657,170.22421,165.33106,88.46191,364.35181,144.00921,0.0,0.08196,0.50640,0.28590,0.21910,0.00180,0.00280,0.00430,0.50640,0.00020,0.02690,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94520,6.98340,6.96218,6.95865,6.90905,6.92811,6.93460,6.98350,6.89670,6.94550,24.55829,25.12256,25.05154,25.01468,23.73421,23.89883,24.08969,25.12260,20.87960,24.62669,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94520,6.98340,6.96218,6.95865,6.90905,6.92811,6.93460,6.98350,6.89670,6.94550,6.94186,9.93833,7.59402,7.46851,5.99707,6.30504,6.40936,9.95770,3.66810,7.06120 -1.29989,6.94531,7.43645,7.16402,7.09885,6.64957,6.77142,6.79460,7.44069,6.45760,6.89230,2.63337,5.73621,3.15297,3.07300,2.13849,2.18200,2.23519,6.15680,2.11640,2.59370,4.31194,5.13033,4.80640,4.73380,3.49115,3.69910,3.84260,5.14749,0.62820,4.35630,143.98370,144.72115,144.33659,144.17947,143.22297,143.63740,143.71016,143.19467,143.98433,144.03008,166.25269,157.74487,155.90894,103.44246,132.11479,134.11567,272.62070,100.42479,141.61898,6.77441,7.41335,7.18302,7.04420,5.89444,6.22487,6.40360,7.42570,5.79579,6.79330,2.74668,2.92683,2.89145,2.86784,2.63615,2.65402,2.67665,2.92710,2.62470,2.72790,4.02773,4.60502,4.38104,4.30750,3.21397,3.47507,3.63724,4.61099,3.08539,4.08570,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.57437,2.29869,2.12042,1.91630,1.09131,1.32762,1.42575,2.32000,1.08899,1.51470,0.0,0.0,0.0,0.0,0.0,143.98193,92.02548,125.63800,128.09345,177.63109,170.03621,164.53321,88.46191,364.35181,143.88489,0.0,0.08003,0.50374,0.27147,0.19624,0.00042,0.00271,0.00402,0.50640,0.0,0.02770,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94523,6.98212,6.96197,6.95845,6.90984,6.92825,6.93580,6.98350,6.89670,6.94520,24.56441,25.12213,25.04657,25.00270,23.73861,23.94280,24.11630,25.12260,20.87960,24.62540,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94523,6.98212,6.96197,6.95845,6.90984,6.92825,6.93580,6.98350,6.89670,6.94520,6.94299,9.66720,7.56917,7.45625,6.01494,6.33935,6.41399,9.95770,3.66810,7.06120 -1.39989,6.94524,7.43220,7.13595,7.10230,6.65474,6.77925,6.79500,7.44069,6.45760,6.79670,2.62257,5.31562,3.13255,3.07050,2.13113,2.17960,2.23160,6.15680,2.11640,2.58610,4.32266,5.11317,4.81740,4.73960,3.51361,3.71505,3.85520,5.14749,0.62820,4.36819,143.98435,144.70356,144.33034,144.14622,143.25128,143.64204,143.74011,143.19467,143.97811,144.12624,165.72534,157.70631,156.17435,106.64710,132.26988,134.30570,272.62070,100.42479,141.47072,6.74986,7.40100,7.14405,7.03310,5.82235,6.14435,6.35939,7.42570,5.75380,6.33260,2.74195,2.92656,2.88910,2.85920,2.63750,2.65640,2.67600,2.92710,2.62470,2.72520,4.00790,4.59905,4.37554,4.30700,3.12341,3.41659,3.59870,4.61099,3.08539,4.07670,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.55837,2.29581,2.12935,1.89280,1.08878,1.10270,1.39140,2.32000,1.06810,1.50800,0.0,0.0,0.0,0.0,0.0,143.98345,95.88821,125.78695,128.03933,177.15607,169.64535,164.28993,88.46191,364.35181,143.79592,0.0,0.07700,0.50088,0.26498,0.17119,0.00066,0.00263,0.00417,0.50640,0.0,0.02680,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94519,6.98074,6.96175,6.95700,6.91068,6.92855,6.93740,6.98350,6.89670,6.94550,24.57673,25.12167,25.04834,25.00260,23.74332,23.96594,24.13240,25.12260,20.87960,24.63540,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94519,6.98074,6.96175,6.95700,6.91068,6.92855,6.93740,6.98350,6.89670,6.94550,6.93836,9.37671,7.56030,7.44570,6.03408,6.34090,6.40310,9.95770,3.66810,7.06859 -1.49989,6.94424,7.33638,7.11755,7.10092,6.65889,6.78217,6.79788,7.41239,6.45760,6.78210,2.61296,4.97916,3.11883,3.06956,2.13186,2.18541,2.22920,6.15680,2.11640,2.58050,4.33127,5.07265,4.79949,4.72688,3.53157,3.73790,3.87914,5.14749,0.62820,4.37270,143.98208,144.68949,144.32492,144.11796,143.27394,143.64802,143.75499,143.19467,143.97811,144.14184,162.24079,157.34997,155.73801,109.53046,133.20581,134.34287,272.62070,100.42479,141.47072,6.72638,7.30891,7.10294,7.00386,5.83297,6.14321,6.32620,7.34339,5.75380,6.78080,2.73621,2.92634,2.88718,2.83624,2.63858,2.65812,2.67626,2.92710,2.62470,2.71890,3.99016,4.59428,4.34325,4.29462,3.13774,3.43598,3.52992,4.61099,3.08539,4.06859,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.54699,2.28614,2.10945,1.88916,1.08882,1.10484,1.33139,2.32000,1.06810,1.50540,0.0,0.0,0.0,0.0,0.0,144.00409,99.48449,126.28941,128.26366,176.57125,168.82452,163.71059,88.46191,364.35181,143.81867,0.0,0.06854,0.47669,0.25014,0.16702,0.00085,0.00282,0.00433,0.48740,0.0,0.02410,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94530,6.97963,6.96146,6.95628,6.91135,6.92881,6.93876,6.98350,6.89670,6.94550,24.59218,25.12129,25.04341,25.00647,23.80860,23.98588,24.15106,25.12260,20.87960,24.63630,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94530,6.97963,6.96146,6.95628,6.91135,6.92881,6.93876,6.98350,6.89670,6.94550,6.93761,9.12988,7.50718,7.44364,6.16367,6.35526,6.42104,9.95770,3.66810,7.06859 -1.59989,6.94524,7.33638,7.11255,7.09138,6.72001,6.78301,6.80352,7.41239,6.45760,6.95450,2.60661,4.97916,3.10955,3.03828,2.13186,2.17561,2.21912,6.15680,2.11640,2.58050,4.33862,5.07265,4.81444,4.73728,3.62142,3.80939,3.90880,5.14749,0.62820,4.37270,143.98164,144.50303,144.23063,144.10883,143.36366,143.70603,143.81122,143.19467,143.98433,144.02044,159.89035,157.21663,155.63911,109.53046,133.20581,134.53771,272.62070,100.42479,141.05168,6.69770,7.30891,7.08844,7.00068,5.83297,6.09910,6.23420,7.34339,5.75380,7.03310,2.72053,2.88779,2.80357,2.78170,2.63858,2.65812,2.67544,2.88830,2.62470,2.71320,3.97717,4.59428,4.34325,4.28926,3.13774,3.37009,3.52520,4.61099,3.08539,4.05320,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.52804,2.28614,2.10945,1.91100,1.06067,1.09504,1.15202,2.32000,1.04330,1.49030,0.0,0.0,0.0,0.0,0.0,143.98340,99.48449,126.19904,128.60810,173.81371,167.08437,163.18750,88.46191,364.35181,143.81867,0.0,0.06392,0.47669,0.18338,0.16338,0.00085,0.00282,0.00433,0.48740,0.0,0.02330,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94532,6.97526,6.95865,6.95356,6.92027,6.93334,6.93920,6.98350,6.90900,6.94520,24.59889,25.12129,25.04704,25.00647,23.87667,24.08801,24.16535,25.12260,20.87960,24.63540,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94532,6.97526,6.95865,6.95356,6.92027,6.93334,6.93920,6.98350,6.90900,6.94520,6.94345,9.12988,7.50718,7.43285,6.25428,6.36065,6.42511,9.95770,3.66810,7.08959 -1.69989,6.94545,7.34127,7.11112,7.08300,6.69867,6.78527,6.80378,7.41239,6.45760,6.94830,2.59480,4.95112,3.09377,3.02871,2.12194,2.17213,2.21142,6.15680,2.10139,2.56560,4.35065,5.07087,4.81852,4.74915,3.62149,3.84950,3.91939,5.14749,0.62820,4.38419,143.98213,144.50021,144.14217,144.09803,143.36769,143.75489,143.86067,143.19467,143.99055,144.06926,161.88325,157.21231,155.73097,109.76743,133.17210,134.39812,272.62070,100.42479,141.05168,6.66426,7.30809,7.07756,6.98723,5.82456,6.05963,6.16097,7.34339,5.75380,6.73200,2.71305,2.85170,2.77482,2.75516,2.63867,2.65813,2.66952,2.88830,2.62470,2.70800,3.95121,4.59388,4.34131,4.28347,3.13343,3.35897,3.45543,4.61099,3.08539,4.02590,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.50829,2.28534,2.10842,1.89280,1.00273,1.08874,1.10794,2.32000,0.96570,1.46210,0.0,0.0,0.0,0.0,0.0,143.97902,99.78051,126.38566,128.56990,174.11159,166.06771,163.11058,88.46191,366.35404,143.88903,0.0,0.06269,0.47643,0.17586,0.16244,0.00087,0.00253,0.00428,0.48740,0.0,0.02310,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94530,6.97507,6.95628,6.95117,6.92040,6.93759,6.93972,6.98350,6.90900,6.94490,24.60987,25.13217,25.05436,25.02834,23.87687,24.12585,24.18606,25.13940,20.87960,24.63520,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94530,6.97507,6.95628,6.95117,6.92040,6.93759,6.93972,6.98350,6.90900,6.94490,6.94110,9.11016,7.50908,7.44058,6.17729,6.36082,6.42133,9.95770,3.66810,7.08959 -1.79989,6.94526,7.34127,7.11252,7.08559,6.69867,6.78527,6.80378,7.41239,6.45760,6.97660,2.59112,4.95112,3.08620,3.02871,2.12570,2.16957,2.19214,6.15680,2.10139,2.56080,4.35413,5.04103,4.83192,4.76367,3.62149,3.84950,3.93172,5.14749,0.62820,4.39990,143.98285,144.57747,144.14217,144.09803,143.36769,143.72121,143.85570,143.19467,143.98640,144.05931,162.43958,157.71216,155.63645,109.76743,133.17210,134.39812,272.62070,100.42479,140.69842,6.60181,7.30809,7.03167,6.96814,5.74661,5.89512,6.07103,7.34339,5.51960,6.67600,2.70949,2.85170,2.76127,2.74775,2.63867,2.65921,2.67183,2.88830,2.62470,2.70720,3.89232,4.59388,4.30785,4.26513,3.06949,3.21354,3.36009,4.61099,2.80050,3.98940,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.49436,2.28534,2.10842,1.87754,0.96091,1.04510,1.09163,2.32000,0.94620,1.46050,0.0,0.0,0.0,0.0,0.0,143.98301,100.07851,126.29252,128.33049,173.99762,166.13834,163.29569,88.46191,366.35404,143.66371,0.0,0.06456,0.47643,0.17586,0.16336,0.00036,0.00251,0.00428,0.48740,0.0,0.02470,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94527,6.97507,6.95791,6.95141,6.91670,6.93759,6.93972,6.98350,6.90900,6.94510,24.61334,25.13836,25.06971,25.03012,23.87687,24.12585,24.18606,25.13940,20.87960,24.64150,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94527,6.97507,6.95791,6.95141,6.91670,6.93759,6.93972,6.98350,6.90900,6.94510,6.94158,9.11016,7.50908,7.44058,6.15613,6.34066,6.42523,9.95770,3.66810,7.10740 -1.89989,6.94511,7.34127,7.11498,7.09187,6.69867,6.78474,6.80271,7.41239,6.45760,6.95040,2.58553,4.95112,3.08620,3.01697,2.11068,2.16678,2.18334,6.15680,2.04930,2.54580,4.35957,5.04189,4.84200,4.77679,3.62149,3.83277,3.93967,5.14749,0.62820,4.40180,143.98326,144.57747,144.14217,144.09035,143.32086,143.72121,143.85570,143.19467,143.98848,144.07444,162.43958,158.37055,156.20387,109.76743,133.16439,134.28785,272.62070,100.42479,140.69842,6.53381,7.30809,7.02873,6.94893,5.66350,5.86573,5.93468,7.34339,5.51960,6.64710,2.70987,2.85170,2.76473,2.75116,2.64698,2.66560,2.67292,2.88830,2.63480,2.70720,3.82393,4.59388,4.29441,4.24736,2.95792,3.17508,3.23403,4.61099,2.80050,3.89960,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.48459,2.28534,2.07490,1.87754,0.96091,1.01560,1.07526,2.32000,0.94620,1.46100,0.0,0.0,0.0,0.0,0.0,143.98604,100.06989,126.13195,128.30777,174.45357,166.67888,163.31810,88.46191,373.48272,143.93459,0.0,0.06559,0.47643,0.17734,0.16516,0.00076,0.00250,0.00404,0.48740,0.0,0.02380,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94525,6.97735,6.95791,6.95141,6.91670,6.93759,6.94009,6.98350,6.90900,6.94500,24.61879,25.17035,25.08261,25.03809,23.87687,24.11730,24.17640,25.19369,20.87960,24.64150,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94525,6.97735,6.95791,6.95141,6.91670,6.93759,6.94009,6.98350,6.90900,6.94500,6.94085,9.11016,7.50951,7.44669,6.15613,6.31430,6.40188,9.95770,3.66810,7.10740 -1.99990,6.94405,7.34127,7.11769,7.09187,6.69020,6.78249,6.80271,7.41239,6.45760,6.90970,2.57866,4.95112,3.07787,3.00415,2.09410,2.16678,2.18334,6.15680,2.04930,2.53620,4.36538,5.11374,4.84405,4.78432,3.62149,3.85629,3.99215,5.14749,0.62820,4.40180,143.98202,144.58645,144.26007,144.09367,143.31645,143.65648,143.83356,143.19467,143.98640,144.03388,162.43958,157.94669,155.72249,109.76743,133.03798,133.89300,272.62070,100.42479,140.69842,6.47052,7.30809,7.02873,6.92838,5.61281,5.80900,5.89294,7.34339,5.51960,6.81010,2.71134,2.85170,2.76649,2.75340,2.64698,2.66623,2.67639,2.88830,2.63480,2.70790,3.75918,4.59388,4.28705,4.22364,2.88495,3.11115,3.20706,4.61099,2.80050,3.80109,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.46434,2.28534,1.97827,1.86638,0.95097,0.98382,1.06018,2.32000,0.89260,1.44410,0.0,0.0,0.0,0.0,0.0,144.00814,99.35550,126.23186,128.39492,174.95975,166.02801,161.93020,88.46191,373.48272,144.13375,0.0,0.06689,0.47643,0.18299,0.16516,0.00076,0.00251,0.00502,0.48740,0.0,0.02380,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94531,6.97756,6.96105,6.95248,6.91627,6.93192,6.93993,6.98350,6.90900,6.94510,24.62342,25.18587,25.08261,25.03838,23.87687,24.13265,24.22483,25.19369,20.87960,24.63790,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94531,6.97756,6.96105,6.95248,6.91627,6.93192,6.93993,6.98350,6.90900,6.94510,6.94281,9.11016,7.51665,7.46865,6.15613,6.33125,6.42168,9.95770,3.66810,7.10740 -2.09990,6.94507,7.34127,7.11769,7.09187,6.69020,6.78474,6.80728,7.41239,6.45760,6.96240,2.57591,4.95112,3.07787,3.00415,2.09410,2.14920,2.18334,6.15680,2.04930,2.53620,4.36916,5.11374,4.84547,4.79194,3.64359,3.85629,3.99215,5.14749,0.62820,4.40260,143.98355,144.53101,144.24415,144.11464,143.48262,143.66350,143.83356,143.47819,143.98433,144.05439,162.43958,157.94669,155.72249,109.76743,133.16439,134.03442,272.62070,100.42479,140.69644,6.40693,7.30809,7.02873,6.91788,5.55627,5.75893,5.86725,7.34339,5.50260,6.79440,2.71259,2.85170,2.76649,2.74988,2.65287,2.66799,2.67822,2.88830,2.65120,2.70810,3.69433,4.59388,4.28705,4.20185,2.83588,3.08572,3.16030,4.61099,2.78660,3.74380,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.45414,2.28534,1.97827,1.88083,0.95097,0.98382,1.05575,2.32000,0.89260,1.43360,0.0,0.0,0.0,0.0,0.0,143.98690,99.35550,126.20916,128.26942,174.28580,166.51416,161.93020,88.46191,373.48272,144.11713,0.0,0.06633,0.47643,0.18900,0.16728,0.00054,0.00196,0.00394,0.48740,0.0,0.02380,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94523,6.96948,6.96071,6.95248,6.91893,6.93269,6.93892,6.96970,6.91460,6.94520,24.62565,25.18587,25.10611,25.04550,23.89136,24.13265,24.22483,25.19369,20.87960,24.65480,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94523,6.96948,6.96071,6.95248,6.91893,6.93269,6.93892,6.96970,6.91460,6.94520,6.94182,9.11016,7.50951,7.46077,6.15613,6.33125,6.42168,9.95770,3.66810,7.10749 -2.19989,6.94523,7.23732,7.11769,7.09287,6.69020,6.78501,6.80728,7.24699,6.61050,6.90719,2.53126,3.15920,3.06282,2.94805,2.09410,2.13854,2.17898,3.18900,2.04930,2.52940,4.41397,4.99714,4.84547,4.79194,3.76297,3.90819,4.02024,5.06899,3.67700,4.40570,143.98339,144.49037,144.25195,144.12357,143.48262,143.65463,143.81495,143.47819,143.99055,143.97250,161.04610,157.71216,155.72249,132.57904,133.73051,134.77052,162.71804,132.26988,140.62126,6.34593,7.24139,6.94704,6.88076,5.55627,5.72564,5.83964,7.26130,5.50260,6.16100,2.71457,2.80542,2.77052,2.75683,2.65934,2.66899,2.68120,2.80710,2.65150,2.71020,3.63136,4.53955,4.24144,4.16399,2.83588,3.01350,3.12265,4.57120,2.78660,3.65120,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.44187,2.20861,1.93336,1.86638,0.95097,0.98382,1.05333,2.23940,0.89260,1.43360,0.0,0.0,0.0,0.0,0.0,143.98352,122.60389,126.44942,129.19913,170.73365,165.37809,161.31061,121.09469,174.63283,144.19402,0.0,0.06538,0.33014,0.18900,0.16728,0.00054,0.00196,0.00470,0.34850,0.0,0.02850,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94524,6.96948,6.96114,6.95338,6.92087,6.93231,6.93849,6.96970,6.91850,6.94490,24.67260,25.18587,25.12263,25.05353,24.09404,24.16200,24.27898,25.19369,23.97750,24.68009,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94524,6.96948,6.96114,6.95338,6.92087,6.93231,6.93849,6.96970,6.91850,6.94490,6.94577,7.54267,7.47772,7.42002,6.20940,6.34066,6.42168,7.56030,6.14559,7.11129 -2.29990,6.94475,7.23732,7.11508,7.09194,6.69020,6.78501,6.80518,7.24699,6.61050,6.94200,2.51973,3.15545,3.01838,2.94693,2.06663,2.12307,2.16731,3.18900,2.04930,2.52499,4.42502,4.99714,4.86100,4.82657,3.76297,3.91324,4.02618,5.06899,3.67700,4.40740,143.98375,144.49037,144.31336,144.14019,143.48262,143.63760,143.81495,143.47819,143.98018,143.97379,161.04610,157.71067,155.63645,132.57904,133.73051,134.69501,162.71804,132.26988,140.62126,6.30482,7.08464,6.93054,6.86924,5.53667,5.67349,5.81180,7.08980,5.50260,6.26230,2.71938,2.80542,2.78036,2.75973,2.66628,2.67551,2.68769,2.80710,2.66550,2.71460,3.58544,4.35051,4.21065,4.14972,2.81017,2.97582,3.10858,4.39789,2.78660,3.57110,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.43490,2.15903,1.92808,1.86638,0.95097,0.98382,1.03525,2.23940,0.89260,1.41540,0.0,0.0,0.0,0.0,0.0,143.99355,122.66015,126.91345,128.64218,171.53823,165.66398,161.45985,121.09469,174.63283,144.25018,0.0,0.06521,0.33014,0.18900,0.16728,0.00060,0.00251,0.00510,0.34850,0.00050,0.02950,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.96948,6.96196,6.95338,6.92087,6.92936,6.93769,6.96970,6.91850,6.94540,24.68654,25.18587,25.13600,25.08222,24.08240,24.16950,24.27898,25.19369,23.97750,24.69040,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.96948,6.96196,6.95338,6.92087,6.92936,6.93769,6.96970,6.91850,6.94540,6.94570,7.54267,7.47772,7.42418,6.20940,6.34072,6.42523,7.56030,6.14559,7.11129 -2.39989,6.94511,7.23732,7.11508,7.09102,6.69020,6.78070,6.81216,7.24699,6.61050,6.92830,2.51424,3.14539,3.00527,2.94693,2.06564,2.11339,2.16629,3.18900,2.04930,2.51980,4.43086,5.05941,4.86693,4.82657,3.76297,3.98963,4.03237,5.06899,3.67700,4.40740,143.98381,144.50205,144.35576,144.16866,143.48262,143.61316,143.75189,143.47819,143.98640,143.97802,161.04610,157.17314,155.07314,133.00327,133.58714,134.40860,162.71804,132.99110,141.12533,6.26097,7.04606,6.90439,6.82383,5.53667,5.67349,5.81042,7.07780,5.50260,6.03920,2.72148,2.81143,2.78396,2.75973,2.66670,2.67686,2.69017,2.81470,2.66550,2.71770,3.53949,4.27200,4.18057,4.09912,2.81017,2.97582,3.10858,4.28770,2.78660,3.50370,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.43759,2.03108,1.91876,1.86281,0.95097,0.98382,1.01710,2.05250,0.89260,1.42510,0.0,0.0,0.0,0.0,0.0,143.98611,121.87974,127.02921,128.64218,171.56734,163.85317,161.32518,121.09469,174.63283,144.35847,0.0,0.06617,0.33014,0.18900,0.16728,0.00060,0.00251,0.00536,0.34850,0.00050,0.03140,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.96948,6.96315,6.95643,6.92031,6.92733,6.93632,6.96970,6.91850,6.94510,24.69326,25.18587,25.13904,25.08496,24.08240,24.24885,24.28919,25.19369,23.97750,24.69780,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.96948,6.96315,6.95643,6.92031,6.92733,6.93632,6.96970,6.91850,6.94510,6.94550,7.51861,7.48575,7.44000,6.20940,6.36241,6.44857,7.51930,6.14559,7.08590 -2.49989,6.94369,7.23755,7.11519,7.08696,6.68721,6.77615,6.81184,7.24699,6.61050,6.93679,2.50725,3.14641,3.00565,2.94938,2.06438,2.10385,2.14837,3.18900,2.04930,2.51849,4.43643,5.05963,4.86858,4.83500,3.76246,3.95363,4.02940,5.06899,3.67700,4.41619,143.98394,144.50244,144.35597,144.20608,143.48252,143.61213,143.72606,143.47819,143.98018,144.02842,161.06981,157.73990,155.07770,133.00298,133.57911,134.71315,162.71804,132.99110,141.12533,6.20855,7.04680,6.90493,6.70770,5.50973,5.64522,5.78915,7.07780,5.41199,6.49800,2.72305,2.81150,2.78420,2.76104,2.66743,2.67931,2.69480,2.81470,2.66640,2.71890,3.48549,4.27237,4.18142,3.98958,2.79243,2.92406,3.06470,4.28770,2.69939,3.42900,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.44082,2.10377,1.93508,1.86662,0.95086,0.98240,1.00998,2.14090,0.89260,1.43690,0.0,0.0,0.0,0.0,0.0,144.01559,121.86136,126.99654,128.46238,171.61931,165.08515,161.87044,121.09469,174.63283,144.20234,0.0,0.06648,0.33058,0.18929,0.16754,0.00054,0.00170,0.00423,0.34850,0.00020,0.03470,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94521,6.96949,6.96320,6.95767,6.92029,6.92732,6.93452,6.96970,6.91850,6.94540,24.70086,25.19456,25.14029,25.10236,24.08238,24.24879,24.28256,25.19519,23.97750,24.70390,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94521,6.96949,6.96320,6.95767,6.92029,6.92732,6.93452,6.96970,6.91850,6.94540,6.94307,7.51862,7.48620,7.42318,6.20848,6.33955,6.44838,7.51930,6.14559,7.08590 -2.59989,6.94433,7.23755,7.11519,7.07506,6.68721,6.78497,6.81338,7.24699,6.61050,6.79980,2.49872,3.14641,3.00052,2.94938,2.06438,2.10385,2.13796,3.18900,2.04930,2.50150,4.44561,5.05963,4.86858,4.83500,3.76246,3.96056,4.03204,5.06899,3.67700,4.42689,143.98423,144.50244,144.35597,144.24311,143.48252,143.59707,143.70417,143.47819,143.97811,144.01133,161.06981,157.64814,155.07770,133.00298,133.57911,134.29199,162.71804,132.99110,141.12533,6.16581,7.01022,6.81928,6.62928,5.50973,5.64522,5.74970,7.07780,5.41199,6.44059,2.72282,2.81150,2.78240,2.76086,2.66815,2.68060,2.69454,2.81470,2.66640,2.71890,3.44298,4.25603,4.06682,3.90208,2.79243,2.92406,3.04950,4.28770,2.69939,3.41170,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.44217,2.10377,1.92767,1.85654,0.95086,0.98240,1.00998,2.14090,0.89260,1.44410,0.0,0.0,0.0,0.0,0.0,144.00220,121.86136,127.07933,128.46238,171.61931,164.89650,162.07455,121.09469,174.63283,144.33346,0.0,0.06668,0.33058,0.19805,0.16754,0.00054,0.00170,0.00384,0.34850,0.00020,0.04030,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94520,6.96949,6.96393,6.95874,6.92029,6.92732,6.93273,6.96970,6.91850,6.94550,24.71122,25.19456,25.14029,25.11721,24.08238,24.24985,24.28826,25.19519,23.97750,24.70970,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94520,6.96949,6.96393,6.95874,6.92029,6.92732,6.93273,6.96970,6.91850,6.94550,6.94389,7.51862,7.48620,7.44646,6.20848,6.34324,6.44838,7.51930,6.14559,7.08590 -2.69990,6.94568,7.19787,7.12068,7.07864,6.74527,6.78845,6.81984,7.22450,6.61050,7.11330,2.48915,3.14641,3.00583,2.94938,2.05526,2.09004,2.13152,3.18900,2.02030,2.48740,4.45653,5.05963,4.89754,4.83500,3.75259,3.96056,4.06888,5.06899,3.67700,4.45690,143.98027,144.51455,144.35597,144.24311,143.07576,143.57522,143.65504,142.78574,143.98018,144.00001,159.62369,157.18722,155.07770,131.26036,133.73185,134.45450,162.07192,130.01534,140.70436,6.12689,6.90150,6.68624,6.59022,5.46745,5.60674,5.72313,6.90600,5.41199,5.96510,2.72340,2.81150,2.78144,2.75882,2.66866,2.68331,2.69442,2.81470,2.65750,2.72090,3.40348,4.13642,3.94350,3.84000,2.74826,2.89094,3.00970,4.15019,2.69939,3.40090,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.44329,2.10377,1.92767,1.84526,0.95086,0.98365,1.01330,2.14090,0.89260,1.45650,0.0,0.0,0.0,0.0,0.0,143.97424,121.86136,126.52830,128.46238,172.18039,165.27286,161.27991,121.09469,175.52173,144.00299,0.0,0.06385,0.31963,0.18327,0.16498,0.00054,0.00170,0.00456,0.34850,0.00020,0.03960,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94539,6.98930,6.96499,6.96112,6.91971,6.92732,6.93273,7.00350,6.88920,6.94540,24.72347,25.23725,25.16469,25.12448,24.06937,24.24879,24.28826,25.26770,23.97750,24.72590,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94539,6.98930,6.96499,6.96112,6.91971,6.92732,6.93273,7.00350,6.88920,6.94540,6.94444,7.61844,7.47765,7.43746,6.26473,6.36184,6.44838,7.69140,6.17010,7.10709 -2.79989,6.94588,7.19904,7.12357,7.08913,6.72700,6.77552,6.81338,7.22450,6.61050,6.96090,2.48293,3.12192,3.00052,2.94388,2.05526,2.08931,2.12622,3.18900,2.02030,2.47510,4.46294,5.06862,4.89754,4.83360,3.77807,3.96056,4.08760,5.06899,3.67700,4.46750,143.98415,144.51455,144.37889,144.25185,143.07576,143.57522,143.64844,142.78574,143.98018,143.99242,159.50998,157.18722,155.07770,131.24444,133.58714,134.45450,159.70614,130.01534,141.28085,6.10773,6.87324,6.63188,6.55773,5.44321,5.60674,5.70860,6.90600,5.41199,6.05290,2.72538,2.81150,2.78144,2.75910,2.67594,2.69263,2.69590,2.81470,2.65750,2.72210,3.38234,4.09908,3.90239,3.80629,2.71359,2.89094,2.98878,4.11739,2.69939,3.38980,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.44396,2.10377,1.91065,1.81846,0.97015,0.98714,1.02730,2.14090,0.89260,1.46000,0.0,0.0,0.0,0.0,0.0,143.97021,122.09195,126.61337,128.57635,171.42855,165.29253,160.93160,121.09469,175.52173,144.03825,0.0,0.06854,0.31963,0.20271,0.17506,0.00054,0.00224,0.00514,0.34850,0.00020,0.04450,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94520,6.98930,6.96499,6.96144,6.91971,6.92621,6.93232,7.00350,6.88920,6.94540,24.72739,25.23725,25.16520,25.12448,24.06505,24.24879,24.29601,25.26770,23.97750,24.72590,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94520,6.98930,6.96499,6.96144,6.91971,6.92621,6.93232,7.00350,6.88920,6.94540,6.94480,7.61937,7.48575,7.43746,6.26920,6.36184,6.44838,7.69140,6.26150,7.07810 -2.89989,6.94511,7.19904,7.12068,7.07298,6.72700,6.77930,6.82288,7.22450,6.61050,6.95940,2.47773,3.12192,2.99440,2.94132,2.06438,2.09220,2.12100,3.18900,2.02030,2.46629,4.46738,5.06862,4.89217,4.83000,3.78987,3.95277,4.06828,5.06899,3.67700,4.48240,143.98528,144.51455,144.35201,144.25018,143.07576,143.59810,143.66247,142.78574,143.98018,143.97877,159.26351,156.98069,155.07770,131.24444,133.80790,134.71315,159.70614,130.01534,141.12533,6.08582,6.87324,6.62288,6.51041,5.42459,5.56089,5.67462,6.90600,5.30480,6.13210,2.72581,2.81150,2.78144,2.76086,2.67594,2.69001,2.69532,2.81470,2.65750,2.72420,3.36000,4.09908,3.87350,3.78782,2.70087,2.83630,2.97434,4.11739,2.61379,3.37010,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.44297,2.10377,1.92767,1.81784,0.97015,0.99099,1.03330,2.14090,0.89260,1.44000,0.0,0.0,0.0,0.0,0.0,143.98599,122.09195,126.79767,128.67826,170.81595,165.42679,161.56968,121.09469,175.52173,143.91181,0.0,0.06713,0.31963,0.20271,0.16867,0.00054,0.00224,0.00514,0.34850,0.00020,0.04450,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94515,6.98930,6.96388,6.96076,6.91971,6.92750,6.93240,7.00350,6.88920,6.94540,24.73210,25.23725,25.16520,25.12448,24.06505,24.24869,24.29601,25.26770,23.97750,24.74360,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94515,6.98930,6.96388,6.96076,6.91971,6.92750,6.93240,7.00350,6.88920,6.94540,6.94546,7.61937,7.47340,7.42318,6.27890,6.37021,6.44838,7.69140,6.26150,7.08590 -2.99990,6.94510,7.19844,7.11618,7.07277,6.72728,6.78034,6.83872,7.22450,6.61050,6.95889,2.47433,3.12032,2.99183,2.93614,2.06440,2.09647,2.11640,3.18900,2.02030,2.45760,4.47077,5.05889,4.89110,4.83046,3.78071,3.93386,4.07061,5.06810,3.67700,4.48519,143.98392,144.45879,144.34607,144.24332,143.09060,143.60109,143.67134,142.78574,143.98018,143.89730,159.25765,156.97810,154.99142,131.27399,133.85304,134.71787,159.70614,130.01534,140.69248,6.04829,6.77098,6.58079,6.50053,5.28844,5.45035,5.60936,6.82800,5.18500,6.11290,2.72470,2.81143,2.77944,2.75877,2.67595,2.69006,2.69595,2.81470,2.65750,2.72100,3.32359,4.01811,3.81559,3.78630,2.58815,2.72234,2.92073,4.07380,2.47420,3.32710,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.45353,2.13023,1.94080,1.85426,0.97355,0.99349,1.05337,2.14090,0.96990,1.44550,0.0,0.0,0.0,0.0,0.0,143.98624,122.26094,126.85630,128.75647,171.08300,165.82826,161.62870,121.10789,175.52173,144.03410,0.0,0.06501,0.31893,0.20084,0.16476,0.00054,0.00229,0.00558,0.34850,0.00020,0.04150,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94521,6.98857,6.96373,6.96033,6.92238,6.92779,6.93273,7.00350,6.88920,6.94540,24.73831,25.23652,25.14785,25.12550,24.06515,24.21877,24.29617,25.26770,23.97750,24.75690,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94521,6.98857,6.96373,6.96033,6.92238,6.92779,6.93273,7.00350,6.88920,6.94540,6.94940,7.61765,7.47088,7.42292,6.27913,6.37031,6.45197,7.69140,6.26150,7.10770 -3.09994,6.94453,7.22512,7.12077,7.07277,6.70739,6.77850,6.82644,7.22560,6.61050,7.07929,2.46474,3.03386,2.99183,2.94068,2.04195,2.08075,2.11251,3.03730,2.02030,2.44940,4.47978,5.05889,4.89208,4.83532,3.80697,3.96099,4.07061,5.06810,3.76820,4.48970,143.98530,144.45879,144.34607,144.22355,143.09060,143.60109,143.68621,142.78574,143.97811,143.95034,160.75232,157.46580,155.15422,131.27399,133.86298,134.82667,163.46012,130.01534,140.70436,6.03296,6.96030,6.59069,6.50053,5.22417,5.44243,5.58093,6.97230,5.12710,6.06220,2.72519,2.81475,2.78141,2.76151,2.67638,2.69006,2.69598,2.81480,2.65750,2.72100,3.30776,4.18164,3.83981,3.78290,2.50859,2.70998,2.88322,4.22090,2.44250,3.30529,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.43858,2.20451,1.94080,1.82813,0.60560,0.98255,1.02098,2.25249,0.36340,1.46000,0.0,0.0,0.0,0.0,0.0,143.99809,123.56726,126.84061,128.60082,170.97153,165.51523,161.73012,123.37454,172.75632,144.11090,0.0,0.06773,0.32153,0.20460,0.17150,0.00142,0.00301,0.00600,0.34850,0.00020,0.03960,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94515,6.98857,6.96373,6.95961,6.92238,6.92779,6.93368,7.00350,6.88920,6.94550,24.74933,25.23970,25.16707,25.13558,24.07562,24.21895,24.28696,25.26770,24.06060,24.76610,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94515,6.98857,6.96373,6.95961,6.92238,6.92779,6.93368,7.00350,6.88920,6.94550,6.94683,7.61765,7.47032,7.41693,6.22075,6.35058,6.44519,7.69140,6.11770,7.10709 -3.19989,6.94390,7.19968,7.11627,7.06620,6.72700,6.77981,6.82496,7.22560,6.70150,7.05060,2.46122,3.03394,2.99242,2.94068,2.04168,2.07528,2.10928,3.03730,2.02030,2.45730,4.48267,5.06259,4.89764,4.83598,3.80675,3.96056,4.08140,5.06810,3.76820,4.48580,143.98369,144.45051,144.31888,144.21232,143.08350,143.62120,143.69756,142.78574,143.97189,144.01231,160.77428,157.48056,155.12149,131.23070,133.85536,135.02127,163.46012,130.01534,140.70436,6.00724,6.96058,6.58143,6.48218,5.20322,5.32299,5.53540,6.97230,5.12710,5.89910,2.72294,2.81475,2.77862,2.76109,2.67636,2.68558,2.69532,2.81480,2.65750,2.71770,3.28429,4.19175,3.81612,3.77040,2.49427,2.62236,2.82408,4.22090,2.44250,3.29650,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.43295,2.20810,1.95396,1.85110,0.38099,0.97785,1.01416,2.25249,0.36340,1.44000,0.0,0.0,0.0,0.0,0.0,144.01117,123.50957,126.74158,128.58990,170.98582,165.67674,161.53314,123.37454,172.75632,144.02788,0.0,0.06572,0.26589,0.20064,0.16709,0.00142,0.00290,0.00642,0.28430,0.00020,0.04150,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94523,6.98892,6.96276,6.95906,6.92278,6.92910,6.93421,7.00350,6.88920,6.94580,24.75600,25.24035,25.16872,25.14013,24.07552,24.21720,24.29362,25.26770,24.06060,24.76860,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94523,6.98892,6.96276,6.95906,6.92278,6.92910,6.93421,7.00350,6.88920,6.94580,6.94385,7.62016,7.47075,7.40624,6.21990,6.34999,6.44655,7.69140,6.11770,7.10709 -3.29990,6.94527,7.21312,7.12929,7.07812,6.70725,6.76975,6.80726,7.22560,6.68919,6.94540,2.46031,3.03394,2.99323,2.93616,2.02857,2.07977,2.10928,3.03730,2.02030,2.45470,4.48495,5.06259,4.92296,4.87182,3.80675,3.96056,4.06634,5.06810,3.76820,4.49750,143.98360,144.45051,144.26537,144.19028,143.08350,143.62987,143.77194,142.78574,143.97811,144.01152,161.30255,157.79042,155.59262,130.52567,133.60588,135.02127,163.46012,130.01534,140.70436,5.98690,7.08812,6.62194,6.48218,5.15141,5.28500,5.44558,7.17200,5.10670,5.99910,2.72194,2.81475,2.76908,2.76156,2.67636,2.68558,2.69504,2.81480,2.65750,2.71470,3.26496,4.32640,3.87084,3.77040,2.45581,2.57146,2.71834,4.40280,2.39069,3.26040,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.42591,2.20877,1.95396,1.84126,0.37125,0.97121,1.00117,2.25249,0.36340,1.44550,0.0,0.0,0.0,0.0,0.0,143.98280,123.50957,126.32339,128.07409,171.37020,165.55386,161.92706,123.37454,172.75632,143.83936,0.0,0.07080,0.26790,0.21709,0.18765,0.00112,0.00290,0.00595,0.28430,0.00020,0.04440,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94523,6.98892,6.96234,6.95546,6.92278,6.93167,6.93528,7.00350,6.88920,6.94550,24.75652,25.25111,25.17801,25.14013,24.08585,24.24123,24.30135,25.26770,24.06060,24.78000,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94523,6.98892,6.96234,6.95546,6.92278,6.93167,6.93528,7.00350,6.88920,6.94550,6.94388,7.66132,7.48470,7.40624,6.19953,6.33752,6.42704,7.69140,6.11770,7.10709 -3.39989,6.94504,7.21312,7.12929,7.07298,6.70725,6.77264,6.80726,7.22560,6.68919,6.89630,2.45469,3.03394,2.99323,2.93616,2.02857,2.08883,2.10840,3.03730,2.02030,2.44810,4.49034,5.06259,4.92296,4.87340,3.80418,3.93234,4.03582,5.06810,3.76820,4.52789,143.98433,144.38956,144.24977,144.16949,143.11532,143.64142,143.80006,142.78574,143.97811,144.02360,162.71724,158.18504,156.03252,130.52567,133.76029,135.11176,163.60721,130.01534,140.69842,5.97247,7.08812,6.62194,6.46606,5.15141,5.27677,5.44258,7.17200,5.10670,5.91890,2.72054,2.81223,2.76908,2.76156,2.67243,2.68352,2.69442,2.81480,2.65750,2.71290,3.25192,4.32640,3.87084,3.71938,2.45581,2.55566,2.71044,4.40280,2.39069,3.26040,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.41052,2.20877,1.95396,1.85393,0.35632,0.95696,0.99386,2.25249,0.33780,1.44000,0.0,0.0,0.0,0.0,0.0,143.98759,123.50957,126.32339,128.04818,171.44548,166.08067,162.75458,123.37454,172.75632,143.34862,0.0,0.07022,0.26790,0.21709,0.18765,0.00142,0.00290,0.00554,0.28430,0.00100,0.04440,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94519,6.98737,6.96178,6.95410,6.92570,6.93242,6.93628,7.00350,6.88920,6.94550,24.76228,25.25111,25.16870,25.14524,24.08585,24.21637,24.29362,25.26770,24.06060,24.78780,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94519,6.98737,6.96178,6.95410,6.92570,6.93242,6.93628,7.00350,6.88920,6.94550,6.94330,7.66132,7.47606,7.40127,6.14563,6.32171,6.40892,7.69140,6.11220,7.10740 -3.49989,6.94546,7.21312,7.12906,7.07812,6.70725,6.77847,6.80538,7.22560,6.68919,6.91009,2.44226,3.02898,2.98061,2.93302,2.02315,2.07472,2.10074,3.03730,2.00810,2.43570,4.50319,5.06259,4.92563,4.88366,3.80418,3.99028,4.07943,5.06810,3.76820,4.52920,143.98383,144.39132,144.26163,144.19028,143.11532,143.62987,143.79013,142.78574,143.97811,144.08020,162.71724,157.79042,156.03252,130.52567,133.76029,135.12052,163.60721,130.01534,140.58172,5.95430,7.08812,6.85175,6.46606,5.15141,5.25558,5.43376,7.17200,5.10670,6.38600,2.72038,2.81223,2.76938,2.76156,2.67243,2.68352,2.69442,2.81480,2.65750,2.71160,3.23391,4.32640,4.07759,3.71938,2.45581,2.55471,2.70404,4.40280,2.39069,3.24559,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.39941,2.21310,1.95009,1.85393,0.34789,0.90363,0.98466,2.25249,0.33780,1.43960,0.0,0.0,0.0,0.0,0.0,143.97883,123.58522,126.48237,127.93155,171.60476,164.88046,161.80758,123.37454,173.12120,143.57707,0.0,0.06917,0.26790,0.21709,0.18280,0.00112,0.00290,0.00554,0.28430,0.00040,0.04020,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.98737,6.96234,6.95458,6.92562,6.93184,6.93528,7.00350,6.88920,6.94550,24.77654,25.26387,25.19748,25.15142,24.08585,24.24123,24.31814,25.26770,24.06060,24.78960,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.98737,6.96234,6.95458,6.92562,6.93184,6.93528,7.00350,6.88920,6.94550,6.94057,7.66132,7.47606,7.40080,6.14563,6.33752,6.40892,7.69140,6.11220,7.11330 -3.59990,6.94405,7.21282,7.12864,7.06704,6.70739,6.77850,6.80184,7.22560,6.68919,7.01520,2.43812,3.02878,2.96861,2.92138,2.02322,2.05890,2.08949,3.03730,2.00810,2.43560,4.50592,5.06246,4.94850,4.89666,3.80435,3.99042,4.07678,5.06810,3.76820,4.52350,143.98491,144.39086,144.26621,144.17407,143.12495,143.63049,143.79137,142.78574,143.98018,144.08315,162.69964,157.75719,155.99699,130.53787,133.77317,135.25503,163.60721,130.01534,141.13330,5.93714,7.08612,6.89158,6.45127,5.12470,5.24140,5.38651,7.17200,5.10670,5.70270,2.72156,2.81217,2.76936,2.76154,2.67246,2.68515,2.69456,2.81480,2.65750,2.71290,3.21558,4.32458,4.14090,3.69235,2.42072,2.52997,2.68621,4.40280,2.39069,3.20700,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.38943,2.22300,2.05527,1.86256,0.34407,0.38029,0.96941,2.25249,0.33780,1.40740,0.0,0.0,0.0,0.0,0.0,144.00808,123.59025,126.30871,127.90929,171.59793,165.30769,162.17259,123.37454,173.12120,143.69674,0.0,0.07002,0.26750,0.21670,0.18200,0.00112,0.00301,0.00604,0.28430,0.00040,0.04150,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94517,6.98690,6.96231,6.95452,6.92564,6.93163,6.93606,7.00350,6.88920,6.94540,24.78143,25.26378,25.20506,25.16615,24.08620,24.24164,24.32707,25.26770,24.06060,24.80060,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94517,6.98690,6.96231,6.95452,6.92564,6.93163,6.93606,7.00350,6.88920,6.94540,6.94043,7.66061,7.47534,7.39344,6.14629,6.33885,6.41038,7.69140,6.11220,7.08550 -3.69990,6.94482,7.21282,7.12835,7.06704,6.70627,6.77977,6.80184,7.22560,6.68919,6.96110,2.43166,3.02637,2.94877,2.90457,2.02860,2.06322,2.09267,3.03730,2.00810,2.42920,4.51315,5.06246,4.93295,4.88314,3.85106,3.99343,4.07950,5.06810,3.79730,4.53580,143.98403,144.39507,144.31461,144.17407,143.57973,143.64472,143.79571,143.57707,143.97396,144.10688,162.69964,157.52273,155.84213,131.33413,134.11306,135.37240,163.60721,131.23704,141.17314,5.92371,7.08612,6.89424,6.44758,5.12470,5.24140,5.33087,7.17200,5.10670,6.26880,2.72214,2.81217,2.76936,2.76188,2.67536,2.69006,2.69600,2.81480,2.67160,2.71290,3.20156,4.32458,4.15147,3.68405,2.42072,2.52997,2.62785,4.40280,2.39069,3.19790,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.38228,2.22300,2.06852,1.87838,0.34407,0.36364,0.95659,2.25249,0.33780,1.40690,0.0,0.0,0.0,0.0,0.0,143.99220,123.62704,126.87569,128.40745,170.07751,165.10750,162.01730,123.37454,172.25341,143.57501,0.0,0.06756,0.26750,0.22786,0.18184,0.00065,0.00291,0.00510,0.28430,0.00030,0.03610,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94521,6.96477,6.96161,6.95431,6.92544,6.92930,6.93606,6.96490,6.92470,6.94570,24.79012,25.24552,25.20210,25.16110,24.17320,24.28573,24.35658,25.25860,24.10610,24.80470,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94521,6.96477,6.96161,6.95431,6.92544,6.92930,6.93606,6.96490,6.92470,6.94570,6.93929,7.61416,7.45639,7.38703,6.14629,6.34829,6.41675,7.61980,6.11220,7.08349 -3.79990,6.94521,7.30591,7.12835,7.07795,6.69448,6.78399,6.80184,7.36650,6.54119,7.00060,2.43142,3.02637,2.95733,2.91912,2.02860,2.05722,2.08549,3.03730,2.00810,2.42779,4.51379,5.05478,4.93295,4.88440,3.80435,3.99283,4.07678,5.05500,3.58240,4.54180,143.98391,144.38198,144.26683,144.18259,143.52657,143.64844,143.80006,143.48849,143.97396,144.08707,163.54393,157.75943,155.84213,129.26729,133.75331,135.34528,168.52039,127.82002,141.12334,5.92968,7.08612,6.89526,6.54353,5.11366,5.23105,5.33087,7.17200,4.92010,6.37370,2.72177,2.81217,2.77254,2.76263,2.67308,2.68515,2.69515,2.81480,2.67160,2.71240,3.20791,4.32458,4.16238,3.78244,2.39654,2.52544,2.62785,4.40280,2.18720,3.19790,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.36019,2.22300,2.06852,1.87838,0.34003,0.35379,0.91377,2.25249,0.33750,1.40180,0.0,0.0,0.0,0.0,0.0,143.98400,123.74456,126.73813,128.14729,171.43963,165.28775,162.27786,123.57426,178.87487,143.48025,0.0,0.07055,0.41579,0.23284,0.17426,0.00065,0.00301,0.00736,0.41890,0.00030,0.03840,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.96735,6.96144,6.95410,6.92607,6.93160,6.93564,6.96920,6.92510,6.94570,24.78978,25.24552,25.20506,25.17032,24.12188,24.28573,24.34487,25.25860,23.90300,24.80640,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.96735,6.96144,6.95410,6.92607,6.93160,6.93564,6.96920,6.92510,6.94570,6.94024,7.73590,7.47644,7.38851,6.11456,6.33876,6.41675,7.82350,5.93400,7.08600 -3.89989,6.94505,7.30591,7.14061,7.08847,6.69448,6.77977,6.79970,7.36650,6.54119,7.01300,2.42912,3.02637,2.95733,2.91912,2.02860,2.04578,2.07657,3.03730,2.00810,2.42779,4.51593,5.05478,4.93295,4.89219,3.80435,3.99283,4.07678,5.05500,3.58240,4.53670,143.98375,144.38198,144.26621,144.17053,143.52657,143.69065,143.80068,143.48849,143.97604,143.98059,163.54393,157.75943,155.71012,129.26729,133.75331,135.24845,168.52039,127.82002,141.13330,5.93615,7.10642,6.90414,6.86993,5.11366,5.23105,5.33087,7.17200,4.92010,6.12660,2.72190,2.81217,2.77585,2.76263,2.67308,2.68905,2.69556,2.81480,2.67160,2.71380,3.21424,4.33473,4.16642,4.10403,2.39654,2.52544,2.62785,4.40280,2.18720,3.17130,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.34318,2.22300,2.03150,1.87167,0.33831,0.34907,0.55427,2.25249,0.33750,1.40180,0.0,0.0,0.0,0.0,0.0,143.98724,123.74456,126.73813,128.01949,171.43963,165.60102,162.51283,123.57426,178.87487,143.58532,0.0,0.07119,0.41579,0.23284,0.19130,0.00065,0.00301,0.00478,0.41890,0.00030,0.03580,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.96735,6.95939,6.95407,6.92607,6.93163,6.93623,6.96920,6.92510,6.94560,24.79260,25.24552,25.20974,25.17032,24.12188,24.28573,24.34487,25.25860,23.90300,24.80400,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.96735,6.95939,6.95407,6.92607,6.93163,6.93623,6.96920,6.92510,6.94560,6.94538,7.73590,7.47644,7.39380,6.11456,6.33876,6.42219,7.82350,5.93400,7.08550 -3.99989,6.94525,7.30591,7.14061,7.08676,6.69448,6.78399,6.80184,7.36650,6.54119,6.92629,2.42718,3.02637,2.94900,2.91912,2.01627,2.04014,2.07475,3.03730,2.00490,2.42920,4.51806,5.05478,4.94102,4.89666,3.85420,3.99343,4.07950,5.05500,3.58240,4.52350,143.98513,144.39507,144.26621,144.17407,143.41459,143.69065,143.79571,143.35889,143.98433,143.92804,162.78267,157.52273,155.84213,129.26729,133.75331,135.24845,168.52039,127.82002,141.17314,5.92092,7.10642,6.90016,6.83986,5.10624,5.23105,5.32181,7.17200,4.92010,6.89220,2.72177,2.81217,2.77923,2.76639,2.67308,2.68515,2.69479,2.81480,2.67160,2.71360,3.19914,4.33473,4.16359,4.07476,2.38420,2.52544,2.61348,4.40280,2.18720,3.15579,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.34707,2.22300,2.06852,1.86116,0.33762,0.34700,0.55427,2.25249,0.32240,1.40690,0.0,0.0,0.0,0.0,0.0,143.98327,123.74456,126.74239,127.94628,170.34393,165.73908,162.48880,123.57426,178.97732,143.82901,0.0,0.06978,0.41579,0.23284,0.19130,0.00065,0.00291,0.00442,0.41890,0.00030,0.03570,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94516,6.97279,6.95939,6.95431,6.92544,6.93163,6.93606,6.97550,6.91790,6.94520,24.79383,25.25563,25.21788,25.17704,24.17328,24.29354,24.34487,25.25860,23.90300,24.80060,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94516,6.97279,6.95939,6.95431,6.92544,6.93163,6.93606,6.97550,6.91790,6.94520,6.94791,7.73590,7.47644,7.39380,6.14316,6.34829,6.41675,7.82350,5.93400,7.08349 -4.09989,6.94416,7.29314,7.12835,7.08676,6.69926,6.78654,6.81576,7.36650,6.54119,7.07990,2.42611,3.05197,2.94877,2.91912,2.01390,2.04014,2.07475,3.08220,2.00490,2.42019,4.51805,5.05478,4.94958,4.90650,3.80269,3.98999,4.07678,5.05500,3.58240,4.52350,143.98508,144.48787,144.31461,144.19153,143.18923,143.62182,143.78765,143.06151,143.98433,143.97765,162.36784,157.51491,155.84213,128.24365,133.06445,135.28834,168.52039,127.82002,141.30880,5.95524,7.47746,6.91056,6.88471,5.10624,5.24140,5.32880,7.70790,4.92010,5.75550,2.71979,2.80491,2.77585,2.76570,2.65048,2.67800,2.69239,2.80870,2.63770,2.71380,3.23544,4.74388,4.18967,4.15144,2.38420,2.52844,2.62284,5.00120,2.18720,3.19420,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.35338,2.17306,2.03150,1.86831,0.32889,0.34568,0.55427,2.18389,0.27360,1.40690,0.0,0.0,0.0,0.0,0.0,144.00572,123.35390,126.60864,127.78523,171.92162,165.83362,162.56091,122.89239,178.97732,144.01543,0.0,0.06955,0.41579,0.22969,0.17326,0.00065,0.00310,0.00478,0.41890,0.00030,0.03950,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94516,6.98376,6.96273,6.95470,6.92099,6.92930,6.93522,6.99000,6.91170,6.94520,24.79402,25.26401,25.22232,25.17704,24.12564,24.28461,24.34487,25.26810,23.90300,24.80130,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94516,6.98376,6.96273,6.95470,6.92099,6.92930,6.93522,6.99000,6.91170,6.94520,6.94552,7.79765,7.51515,7.39162,6.15885,6.34860,6.41675,7.82350,5.93400,7.07670 -4.19989,6.94347,7.29484,7.11520,7.08774,6.69902,6.78409,6.84086,7.36650,6.54119,7.09999,2.42305,3.05267,2.94900,2.91978,2.00624,2.03499,2.06213,3.08220,1.98200,2.41590,4.52042,5.03623,4.95296,4.91602,3.80250,3.98140,4.02158,5.05449,3.58240,4.53670,143.98434,144.51305,144.32680,144.20068,143.18626,143.61048,143.78393,143.06151,143.98018,144.04329,162.39645,157.56964,155.89776,128.23376,132.78836,134.84249,168.52039,127.82002,141.30880,6.03808,7.61554,7.01681,6.91021,5.10623,5.26346,5.36028,7.70790,4.92010,6.33140,2.71210,2.80500,2.77304,2.76109,2.61844,2.63987,2.67288,2.80870,2.59830,2.70960,3.32598,4.93723,4.33709,4.21398,2.38408,2.56228,2.65054,5.00120,2.18720,3.22409,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.39787,2.17331,1.98788,1.86904,0.32874,0.34562,0.90974,2.18389,0.27360,1.48320,0.0,0.0,0.0,0.0,0.0,144.02002,123.62614,126.55072,127.61938,172.15407,166.21262,164.37311,122.89994,179.71389,143.83108,0.0,0.06647,0.41586,0.22691,0.16850,0.00064,0.00310,0.00460,0.41890,0.00030,0.03380,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94519,6.98391,6.96328,6.95488,6.91979,6.92872,6.93478,6.99000,6.91170,6.94540,24.79618,25.26827,25.22426,25.20148,24.12534,24.26921,24.31854,25.26839,23.90300,24.80640,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94519,6.98391,6.96328,6.95488,6.91979,6.92872,6.93478,6.99000,6.91170,6.94540,6.94235,7.79825,7.53078,7.41605,6.15777,6.34640,6.41446,7.82350,5.93400,7.07670 -4.29990,6.94714,7.29279,7.09992,7.07818,6.72032,6.79877,6.85750,7.36650,6.54119,6.94170,2.41952,3.07023,2.94900,2.92118,1.99161,2.03499,2.06213,3.08220,1.93060,2.40810,4.52761,5.06760,4.95296,4.90784,3.80250,3.98140,4.04130,5.10860,3.58240,4.52369,143.98468,144.51305,144.32680,144.20068,143.18626,143.61048,143.77731,143.06151,143.97811,144.02401,162.15865,157.51826,155.87686,128.23376,133.74616,134.84539,168.52039,127.82002,141.30880,6.08772,8.01483,7.13552,6.95702,5.11303,5.31119,5.37018,8.23709,4.92010,6.24659,2.70923,2.82076,2.77481,2.76126,2.61844,2.63777,2.66298,2.82950,2.59830,2.70740,3.37849,5.29717,4.45851,4.26282,2.38980,2.59692,2.66486,5.51149,2.18720,3.22430,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.40658,2.17331,1.98788,1.91194,0.29409,0.34325,0.51854,2.18389,0.24620,1.51740,0.0,0.0,0.0,0.0,0.0,143.94396,122.88276,126.55072,127.72990,172.58864,166.21262,163.84203,122.08819,181.38944,144.26267,0.0,0.06087,0.41586,0.17641,0.15180,0.00072,0.00310,0.00469,0.41890,0.00030,0.03360,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94518,6.98391,6.96328,6.95520,6.91979,6.92872,6.93478,6.99000,6.91170,6.94550,24.80278,25.26827,25.22426,25.20148,24.12534,24.26921,24.32247,25.26839,23.90300,24.80470,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94518,6.98391,6.96328,6.95520,6.91979,6.92872,6.93478,6.99000,6.91170,6.94550,6.94328,7.79825,7.47684,7.41590,6.16680,6.34847,6.41532,7.82350,5.93400,7.07670 -4.39989,6.94472,7.29279,7.09992,7.07818,6.69375,6.79654,6.84246,7.36650,6.54119,6.94700,2.41855,3.07023,2.94900,2.91978,1.96355,2.03499,2.06093,3.08220,1.93060,2.40850,4.52617,5.06870,4.96679,4.90784,3.83736,3.98974,4.04130,5.10860,3.58240,4.52570,143.98322,144.51305,144.32117,144.19236,143.18626,143.62162,143.74053,143.06151,143.97811,144.03949,161.00176,157.52372,155.87686,128.23376,133.39131,134.84539,168.52039,127.82002,141.36673,6.15342,8.01483,7.14345,6.96732,5.11303,5.32007,5.39926,8.23709,4.92010,6.19880,2.70408,2.81706,2.77304,2.75886,2.60373,2.62400,2.63975,2.82950,2.59830,2.70670,3.44934,5.29717,4.47257,4.33266,2.38980,2.61096,2.68840,5.51149,2.18720,3.26830,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.45601,2.17331,1.98788,1.91832,0.29409,0.34562,0.95634,2.18389,0.24620,1.56100,0.0,0.0,0.0,0.0,0.0,143.99417,122.86627,126.32977,127.75275,172.38638,165.98226,163.87424,122.08819,181.38944,144.21274,0.0,0.06441,0.41586,0.20960,0.15325,0.00052,0.00310,0.00610,0.41890,0.00030,0.03360,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94525,6.98391,6.96274,6.95698,6.91979,6.92898,6.93517,6.99000,6.91170,6.94550,24.80191,25.30494,25.22426,25.20148,24.14377,24.28348,24.33270,25.33140,23.90300,24.80400,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94525,6.98391,6.96274,6.95698,6.91979,6.92898,6.93517,6.99000,6.91170,6.94550,6.94254,7.79825,7.49673,7.41590,6.21111,6.34825,6.41532,7.82350,5.93400,7.07380 -4.49990,6.94535,7.29279,7.11520,7.07370,6.69375,6.79654,6.84246,7.36650,6.54119,6.91770,2.41343,3.07023,2.94900,2.90134,1.96082,2.03142,2.05466,3.08220,1.93060,2.40810,4.53191,5.06870,4.97117,4.92946,3.83736,3.98974,4.04130,5.10860,3.58240,4.53670,143.98256,144.51305,144.26683,144.18363,143.18626,143.65875,143.74053,143.06151,143.98018,143.93449,161.00176,157.52372,155.87686,128.23376,132.74941,134.84249,168.52039,127.82002,141.12334,6.26077,8.01483,7.14345,7.02510,5.11303,5.32820,5.41224,8.23709,4.92010,5.65770,2.69646,2.81706,2.77223,2.75410,2.59888,2.62183,2.63046,2.82950,2.59529,2.70380,3.56430,5.29717,4.47740,4.37632,2.38980,2.62248,2.71488,5.51149,2.18720,3.46630,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.49849,2.15714,1.98788,1.89602,0.29409,0.34904,0.97178,2.18389,0.24620,1.63290,0.0,0.0,0.0,0.0,0.0,143.98107,122.86627,126.25975,127.70087,172.46755,166.08067,164.04307,122.08819,181.38944,143.99262,0.0,0.06447,0.41586,0.20960,0.15682,0.00090,0.00311,0.00618,0.41890,0.00030,0.03610,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94528,6.98391,6.96093,6.95698,6.91979,6.93160,6.93560,6.99000,6.91170,6.94540,24.80527,25.30494,25.22381,25.19762,24.14377,24.28348,24.34154,25.33140,23.90300,24.80400,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94528,6.98391,6.96093,6.95698,6.91979,6.93160,6.93560,6.99000,6.91170,6.94540,6.94760,7.79825,7.53299,7.41605,6.21111,6.34825,6.41532,7.82350,5.93400,7.08600 -4.59989,6.94530,7.29279,7.11653,7.07370,6.69375,6.79646,6.84246,7.36650,6.54119,6.76200,2.41131,3.07023,2.94990,2.90134,1.96082,2.02181,2.04510,3.08220,1.93060,2.40850,4.53399,5.07609,4.97117,4.93506,3.83736,3.98097,4.02072,5.10860,3.58240,4.55350,143.98491,144.51305,144.34367,144.20068,143.18626,143.65875,143.73350,143.06151,143.98433,144.00769,161.00176,157.56964,155.89776,128.23376,132.74941,134.63262,168.52039,127.82002,141.12334,6.36457,8.01483,7.14345,7.06168,5.17070,5.33310,5.45066,8.23709,4.92010,6.37199,2.68876,2.81333,2.76950,2.75226,2.59830,2.61637,2.62579,2.82950,2.59529,2.69390,3.67581,5.29717,4.47740,4.40622,2.44847,2.62734,2.78618,5.51149,2.18720,3.96250,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.53499,2.19183,1.98788,1.89602,0.29409,0.35429,0.99346,2.24370,0.24620,1.72600,0.0,0.0,0.0,0.0,0.0,143.98218,122.75478,126.24541,127.60961,172.46755,166.58948,164.85817,122.08819,181.38944,143.63688,0.0,0.06457,0.41586,0.20960,0.16737,0.00090,0.00311,0.00610,0.41890,0.00030,0.03360,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94517,6.98391,6.96093,6.95732,6.91979,6.92791,6.93478,6.99000,6.91170,6.94520,24.80854,25.30494,25.23009,25.20148,24.14377,24.27626,24.33270,25.33140,23.90300,24.81200,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94517,6.98391,6.96093,6.95732,6.91979,6.92791,6.93478,6.99000,6.91170,6.94520,6.94407,7.79825,7.53299,7.42762,6.21111,6.34640,6.41446,7.82350,5.93400,7.08600 -4.69990,6.94554,7.29103,7.11635,7.07340,6.70198,6.79654,6.84100,7.36650,6.54119,6.96540,2.41634,3.15515,2.95821,2.91251,1.96107,2.02191,2.04570,3.21019,1.93060,2.40810,4.52919,5.07531,4.97102,4.93199,3.72343,3.97693,4.01740,5.10860,3.58240,4.55350,143.98418,144.51211,144.26683,144.19984,143.18923,143.65576,143.72896,143.06151,143.98433,143.93529,162.49440,157.84945,156.32132,128.04876,132.16237,134.48831,168.52039,127.82002,141.12334,6.46500,8.00954,7.14322,7.07669,5.17224,5.37075,5.53276,8.23709,4.92010,5.46250,2.68108,2.81294,2.76936,2.74462,2.59830,2.61024,2.62222,2.82950,2.59529,2.68310,3.78392,5.29207,4.49462,4.41814,2.45012,2.66794,2.84365,5.51149,2.18720,4.06859,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.57966,2.32401,2.02648,1.89283,0.29458,0.50231,1.04972,2.38460,0.24620,1.73360,0.0,0.0,0.0,0.0,0.0,143.97726,121.49962,126.11557,127.47785,175.91653,166.69875,164.93213,120.20964,181.38944,143.64513,0.0,0.06591,0.41579,0.20263,0.16640,0.00145,0.00390,0.00610,0.41890,0.00070,0.03620,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94520,6.98376,6.96108,6.95754,6.91983,6.93160,6.93482,6.99000,6.91170,6.94520,24.80282,25.30431,25.22978,25.20147,24.03318,24.26867,24.31335,25.33140,23.90300,24.80210,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94520,6.98376,6.96108,6.95754,6.91983,6.93160,6.93482,6.99000,6.91170,6.94520,6.94756,7.80952,7.56645,7.43559,6.15405,6.33515,6.39707,7.82350,5.93400,7.08600 -4.79989,6.94528,7.18734,7.12208,7.07340,6.71507,6.78396,6.83946,7.19100,6.68010,6.68010,2.41360,3.15515,2.95416,2.90063,1.96107,2.02191,2.04570,3.21019,1.93060,2.40120,4.53167,5.12735,4.97102,4.93340,3.83838,3.96270,4.01740,5.14150,3.66990,4.53850,143.98395,144.51930,144.26433,144.19984,143.18923,143.65576,143.72896,143.06151,143.98226,143.91802,160.98787,157.52943,155.88780,128.54904,133.37592,134.48831,163.18537,128.35322,141.57688,6.53826,8.00954,7.14322,7.08367,5.28174,5.41215,5.53866,8.23709,5.10590,6.64530,2.67320,2.81294,2.76610,2.72630,2.59404,2.60221,2.61664,2.82950,2.59040,2.67220,3.86505,5.29207,4.50729,4.42736,2.56614,2.71483,2.84831,5.51149,2.37930,4.18449,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.63554,2.32401,2.05013,1.92662,0.29458,0.97274,1.29707,2.38460,0.24620,1.73850,0.0,0.0,0.0,0.0,0.0,143.98256,120.73630,126.18001,127.64822,172.42960,167.09512,164.93213,119.73610,178.55548,144.09844,0.0,0.06436,0.26026,0.20938,0.17088,0.00145,0.00392,0.00626,0.26850,0.00070,0.03630,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94521,6.98376,6.96108,6.95754,6.91949,6.93172,6.93482,6.99000,6.91170,6.94530,24.80392,25.30431,25.23206,25.20476,24.13204,24.25456,24.31335,25.33140,23.97320,24.80210,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94521,6.98376,6.96108,6.95754,6.91949,6.93172,6.93482,6.99000,6.91170,6.94530,6.94839,7.77913,7.49760,7.43559,6.21164,6.34802,6.41486,7.79100,6.12800,7.06329 -4.89990,6.94527,7.30723,7.12239,7.07370,6.69471,6.78314,6.83732,7.39140,6.48080,7.00190,2.41425,3.15644,2.94916,2.90182,1.95188,2.00927,2.04510,3.21019,1.93060,2.40810,4.53102,5.12768,4.97248,4.93600,3.83736,3.97672,4.02072,5.14150,3.66990,4.54890,143.98332,144.52884,144.34701,144.20775,143.18626,143.62718,143.72276,143.06151,143.97811,143.97904,161.00176,157.53042,155.89242,128.54448,133.36409,134.64205,163.18537,128.35322,141.28684,6.63794,8.01483,7.15236,7.08648,5.31403,5.41486,5.55594,8.23709,5.10590,7.01780,2.66345,2.81333,2.75344,2.71979,2.59153,2.59994,2.60930,2.82950,2.51630,2.66120,3.97449,5.29717,4.51872,4.44033,2.60146,2.72192,2.85075,5.51149,2.37930,4.23579,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.69315,2.32542,2.09774,1.93008,0.29409,1.25876,1.40950,2.38460,0.24620,1.74300,0.0,0.0,0.0,0.0,0.0,143.98287,120.71285,126.23632,127.58649,172.73406,167.05674,164.85817,119.73610,178.55548,143.74011,0.0,0.07028,0.46041,0.22712,0.17255,0.00197,0.00456,0.00900,0.46480,0.00070,0.04100,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94524,6.98391,6.96247,6.95784,6.91903,6.92775,6.93444,6.99000,6.91170,6.94550,24.80114,25.30809,25.23214,25.19857,24.13160,24.25374,24.31936,25.33140,23.97320,24.81259,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94524,6.98391,6.96247,6.95784,6.91903,6.92775,6.93444,6.99000,6.91170,6.94550,6.94545,7.77940,7.49826,7.42710,6.21111,6.34797,6.41467,7.79100,6.12800,7.07780 -4.99989,6.94497,7.30723,7.12525,7.07345,6.69471,6.76292,6.82382,7.39140,6.48080,6.96850,2.40911,3.15644,2.95441,2.90314,1.95188,1.99116,2.04044,3.21019,1.93060,2.40120,4.53585,5.12768,5.00473,4.93852,3.81166,3.96190,4.01719,5.14150,3.66990,4.56470,143.98436,144.50219,144.35138,144.21440,143.15097,143.62718,143.72276,143.06151,143.98018,144.01012,161.00176,157.57039,156.43429,128.54448,133.36409,134.52106,163.18537,128.35322,140.77567,6.74177,8.01483,7.15348,7.08781,5.35735,5.46338,5.75826,8.23709,5.31030,6.98320,2.65264,2.80098,2.72011,2.70239,2.57425,2.59830,2.60318,2.82950,2.51630,2.65300,4.08913,5.29717,4.54770,4.45658,2.65784,2.78987,3.07094,5.51149,2.59550,4.26909,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.73292,2.32542,2.05112,1.90780,0.64632,1.40890,1.60004,2.38460,0.24620,1.74310,0.0,0.0,0.0,0.0,0.0,143.98897,120.71285,125.64171,127.52401,173.50441,167.98083,165.08079,119.73610,178.55548,143.55646,0.0,0.07185,0.46041,0.22831,0.17982,0.00177,0.00427,0.00923,0.46480,0.00070,0.04100,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94519,6.98563,6.96247,6.95784,6.92031,6.92754,6.93412,6.99000,6.91170,6.94540,24.80629,25.30809,25.24552,25.20524,24.11891,24.25102,24.31706,25.33140,23.97320,24.81920,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94519,6.98563,6.96247,6.95784,6.92031,6.92754,6.93412,6.99000,6.91170,6.94540,6.94395,7.77940,7.49826,7.43378,6.21111,6.34637,6.39246,7.79100,6.12800,7.10350 -5.09990,6.94623,7.30723,7.12525,7.07345,6.69471,6.76517,6.82382,7.39140,6.48080,6.80010,2.40188,3.15387,2.94759,2.87728,1.95188,1.98273,2.04044,3.21019,1.93060,2.39610,4.54435,5.12768,5.00068,4.92528,3.86120,3.97862,4.04668,5.14150,3.66990,4.56090,143.98503,144.50219,144.35138,144.21440,143.33161,143.62718,143.72276,143.27468,143.98018,144.05460,161.00176,157.86141,155.98579,129.72884,133.72613,134.62755,163.18537,128.35322,140.59753,6.80120,7.85359,7.14345,7.08648,5.38382,5.54746,6.45781,8.23709,5.35290,6.81770,2.64804,2.80098,2.70980,2.69627,2.57135,2.59332,2.60130,2.82950,2.51630,2.64750,4.15315,5.15504,4.50786,4.44033,2.68279,2.85873,3.79803,5.51149,2.65649,4.28480,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.74652,2.32542,2.05112,1.90352,0.64632,1.55924,1.71480,2.38460,0.24620,1.74420,0.0,0.0,0.0,0.0,0.0,143.96286,120.75019,125.81354,128.16306,172.02572,167.74695,164.28130,119.73610,178.55548,143.74011,0.0,0.06927,0.46041,0.22831,0.17982,0.00090,0.00391,0.00765,0.46480,0.00070,0.03510,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94516,6.97682,6.96247,6.95784,6.92031,6.92754,6.93412,6.97960,6.91780,6.94540,24.81635,25.31157,25.24552,25.20524,24.14018,24.26861,24.33920,25.33140,23.97320,24.81920,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94516,6.97682,6.96247,6.95784,6.92031,6.92754,6.93412,6.97960,6.91780,6.94540,6.94181,7.70838,7.47797,7.42790,6.21111,6.33467,6.41084,7.79100,6.12800,7.11250 -5.19990,6.94550,7.30522,7.12898,7.07303,6.69506,6.76257,6.80016,7.39140,6.48080,6.87570,2.39782,3.15253,2.94638,2.87722,1.94045,1.97918,2.03259,3.21019,1.93060,2.39420,4.54767,5.17883,5.00762,4.94526,3.86181,3.97899,4.09471,5.20699,3.66990,4.55350,143.98392,144.50209,144.34044,144.21981,143.33296,143.62853,143.72483,143.27468,143.98226,144.05542,160.98787,157.52943,155.93885,129.76195,133.59955,134.60997,163.18537,128.35322,140.77567,6.81874,7.84446,7.15189,7.08178,5.38504,5.69294,6.51700,8.23709,5.35290,6.88909,2.64711,2.80030,2.70975,2.69260,2.57140,2.59080,2.60091,2.82950,2.51630,2.64360,4.17163,5.14655,4.49610,4.43825,2.68373,3.03301,3.83389,5.51149,2.65649,4.29119,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.75082,2.33385,2.10269,1.90730,0.65166,1.54844,1.71593,2.38460,0.24620,1.74530,0.0,0.0,0.0,0.0,0.0,143.97807,120.02824,125.72274,127.83669,172.34637,167.83648,163.20375,118.80435,178.55548,143.93252,0.0,0.07204,0.46030,0.22823,0.19434,0.00091,0.00410,0.00626,0.46480,0.00070,0.03930,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94521,6.97676,6.96240,6.95774,6.92031,6.92806,6.93386,6.97960,6.91780,6.94530,24.81986,25.34359,25.25204,25.20781,24.14048,24.27214,24.34845,25.35280,23.97320,24.82060,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94521,6.97676,6.96240,6.95774,6.92031,6.92806,6.93386,6.97960,6.91780,6.94530,6.94177,7.70641,7.48505,7.42887,6.21164,6.34802,6.41277,7.79100,6.12800,7.10350 -5.29989,6.94517,7.30157,7.12512,7.07303,6.71507,6.76351,6.80016,7.39140,6.48080,6.91869,2.39746,3.15253,2.94638,2.87722,1.95192,1.99105,2.03259,3.21019,1.93310,2.39420,4.54771,5.17883,5.00255,4.92402,3.87544,3.98520,4.06385,5.20699,3.66990,4.55350,143.98371,144.50209,144.34044,144.21315,143.33296,143.62853,143.73144,143.27468,143.98018,144.07953,160.91324,157.52943,155.98044,129.76195,133.72639,134.63570,163.18537,128.35322,140.77567,6.85988,7.28882,7.10372,7.05612,5.59466,6.45519,6.65669,7.32400,5.41360,6.91170,2.63965,2.71853,2.69545,2.68614,2.57140,2.58199,2.59473,2.72000,2.51630,2.63930,4.22023,4.61687,4.47873,4.42736,2.90783,3.79708,3.96627,4.66280,2.71560,4.29380,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.78079,2.33385,2.10269,1.90338,1.52935,1.71475,1.72216,2.38460,1.32670,1.74510,0.0,0.0,0.0,0.0,0.0,143.98485,120.02824,125.80293,128.18475,171.60408,167.32887,164.02988,118.80435,178.47581,143.93252,0.0,0.07102,0.46030,0.21038,0.17964,0.00091,0.00411,0.00698,0.46480,0.00070,0.04070,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94523,6.97676,6.96240,6.95742,6.92031,6.92806,6.93418,6.97960,6.91780,6.94540,24.82030,25.34359,25.25204,25.20053,24.14048,24.27160,24.34845,25.35280,23.97320,24.82060,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94523,6.97676,6.96240,6.95742,6.92031,6.92806,6.93418,6.97960,6.91780,6.94540,6.94061,7.70641,7.47795,7.42745,6.21452,6.34802,6.41106,7.79100,6.12800,7.10350 -5.39989,6.94526,7.31071,7.12919,7.07394,6.67812,6.76344,6.79842,7.39140,6.48080,7.00540,2.39218,3.15387,2.94759,2.87584,1.95970,2.00102,2.03058,3.21019,1.93310,2.38880,4.55308,5.17949,5.02801,4.93852,3.87451,3.98520,4.08212,5.20699,3.66990,4.55870,143.98548,144.50219,144.34159,144.21440,143.33161,143.62677,143.74135,143.27468,143.98226,144.09403,159.97547,157.17759,155.86423,129.72884,133.71433,134.62755,163.18537,128.35322,140.77567,6.87754,7.27284,7.10378,7.05728,5.92592,6.54574,6.65479,7.32400,5.67680,6.99730,2.63392,2.71533,2.68920,2.68132,2.55885,2.57826,2.58806,2.72000,2.51630,2.63750,4.24362,4.62134,4.48015,4.43900,3.25378,3.88391,4.01445,4.66280,2.99509,4.30310,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.78185,2.33504,2.11747,1.90780,1.61383,1.71442,1.71884,2.38460,1.32670,1.74300,0.0,0.0,0.0,0.0,0.0,143.98293,119.99950,125.38241,127.96953,171.40251,167.05032,163.59382,118.80435,178.47581,143.93666,0.0,0.07529,0.46041,0.22831,0.18657,0.00156,0.00410,0.00622,0.46480,0.00070,0.04760,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94514,6.97682,6.96248,6.95694,6.92031,6.92801,6.93412,6.97960,6.91780,6.94530,24.82318,25.32398,25.24571,25.20576,24.14018,24.27097,24.36678,25.35280,23.97320,24.82060,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94514,6.97682,6.96248,6.95694,6.92031,6.92801,6.93412,6.97960,6.91780,6.94530,6.93991,7.70838,7.47863,7.42790,6.25095,6.36223,6.41584,7.79100,6.12800,7.10350 -5.49989,6.94560,7.30879,7.12856,7.07950,6.67876,6.76351,6.80049,7.39140,6.48080,7.01909,2.38776,3.15253,2.93729,2.87536,1.95480,1.99105,2.02547,3.21019,1.93310,2.38470,4.55783,5.17883,5.02937,4.95122,3.87544,3.98652,4.09471,5.20699,3.66990,4.55060,143.98318,144.50209,144.31784,144.21835,143.33296,143.60697,143.72854,143.27468,143.98018,144.06894,159.97422,157.16610,155.85038,129.97081,133.72639,134.63570,163.18537,128.35322,141.39271,6.88072,7.27162,7.10372,7.03834,5.93176,6.55910,6.69604,7.32400,5.67680,7.03420,2.62969,2.71522,2.68583,2.67713,2.55747,2.57473,2.58080,2.72000,2.51630,2.63500,4.25102,4.62035,4.48650,4.43210,3.25930,3.90430,4.05677,4.66280,2.99509,4.30600,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.77735,2.33385,2.05573,1.90730,1.61419,1.71307,1.71614,2.38460,1.32670,1.74110,0.0,0.0,0.0,0.0,0.0,143.97604,120.02824,125.52303,127.76972,171.51926,167.29192,163.39362,118.80435,178.47581,144.18986,0.0,0.07485,0.46030,0.22823,0.18714,0.00153,0.00392,0.00594,0.46480,0.00070,0.04620,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94525,6.97676,6.96345,6.95756,6.92031,6.92914,6.93393,6.97960,6.91780,6.94540,24.82842,25.32906,25.25827,25.21263,24.14048,24.27160,24.36747,25.35280,23.97320,24.82060,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94525,6.97676,6.96345,6.95756,6.92031,6.92914,6.93393,6.97960,6.91780,6.94540,6.94112,7.69403,7.47795,7.42745,6.25100,6.36269,6.41641,7.79100,6.12800,7.07250 -5.59989,6.94423,7.30879,7.13845,7.09664,6.67588,6.75990,6.80049,7.39140,6.48080,6.79579,2.38498,3.12020,2.92333,2.87722,1.95480,1.99060,2.02649,3.21019,1.93310,2.38339,4.55924,5.17883,5.02937,4.96801,3.87544,3.98994,4.09471,5.20699,3.66990,4.54890,143.98201,144.50777,144.34044,144.21835,143.33031,143.56708,143.69570,143.27468,143.98018,144.08439,160.79378,157.18241,155.85038,129.97081,133.80772,134.71460,163.18537,128.35322,141.05765,6.86719,7.29299,7.13099,7.03834,5.67843,6.51602,6.63975,7.32400,5.62500,6.81470,2.62485,2.71522,2.68481,2.66904,2.54802,2.56749,2.57658,2.72000,2.51630,2.62570,4.24234,4.68052,4.51647,4.44678,3.01370,3.85696,3.94782,4.69389,2.99509,4.30710,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.77639,2.33385,2.11055,1.91818,1.42099,1.70906,1.71433,2.38460,1.27830,1.73760,0.0,0.0,0.0,0.0,0.0,144.00441,120.49592,125.74330,127.46598,171.51926,167.20884,163.36639,118.80435,178.47581,144.25226,0.0,0.07576,0.46030,0.23799,0.19986,0.00153,0.00363,0.00594,0.46480,0.00070,0.04780,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94531,6.97689,6.96538,6.95915,6.92004,6.92806,6.93393,6.97960,6.91780,6.94540,24.83023,25.33349,25.26925,25.20843,24.17910,24.30692,24.36747,25.35280,23.97320,24.82140,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94531,6.97689,6.96538,6.95915,6.92004,6.92806,6.93393,6.97960,6.91780,6.94540,6.94037,7.69403,7.47341,7.42310,6.21914,6.36203,6.41641,7.79100,6.12800,7.08930 -5.69990,6.94639,7.30879,7.13845,7.10382,6.67588,6.76351,6.81611,7.39140,6.48080,7.08250,2.38339,2.98894,2.90811,2.86684,1.95480,1.99060,2.02432,3.00090,1.93310,2.38470,4.56299,5.17883,5.02937,4.96954,3.93626,4.01968,4.08302,5.20699,3.83550,4.54890,143.98566,144.50777,144.36607,144.28078,143.31795,143.53524,143.69756,143.27468,143.98018,143.97536,160.22254,157.18241,155.72661,132.37157,134.20458,134.71460,161.37621,132.17897,140.80342,6.87233,7.29299,7.13500,7.04539,5.67843,6.54583,6.64514,7.32400,5.62500,7.10390,2.61992,2.71522,2.68141,2.66480,2.54802,2.56544,2.57333,2.72000,2.51630,2.61600,4.25241,4.68052,4.53077,4.45307,3.01370,3.88503,3.97135,4.69389,2.99509,4.30860,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.76979,2.24664,2.10073,1.90730,1.42099,1.70463,1.71000,2.26659,1.27830,1.73550,0.0,0.0,0.0,0.0,0.0,143.95964,122.43227,125.98449,127.60994,169.74842,166.38146,163.73713,121.83384,173.35228,144.22522,0.0,0.07419,0.46030,0.23799,0.18714,0.00086,0.00264,0.00590,0.46480,0.00070,0.04290,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94513,6.97749,6.96693,6.95906,6.92004,6.92683,6.93093,6.97960,6.91780,6.94540,24.83265,25.33349,25.26925,25.22092,24.24840,24.30916,24.37494,25.35280,24.12750,24.82140,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94513,6.97749,6.96693,6.95906,6.92004,6.92683,6.93093,6.97960,6.91780,6.94540,6.94563,7.55449,7.45131,7.42310,6.24131,6.36203,6.42150,7.56550,6.19669,7.10210 -5.79989,6.94527,7.30879,7.13845,7.09664,6.67493,6.76540,6.81611,7.39140,6.48080,6.95410,2.37927,2.98894,2.92333,2.85060,1.95480,1.97731,2.01610,3.00090,1.93310,2.38339,4.56600,5.17866,5.02937,4.97491,3.93381,4.03610,4.09474,5.20699,3.83550,4.55060,143.98387,144.51581,144.36607,144.29160,143.31795,143.52999,143.69075,143.27468,143.97811,143.96862,160.22254,157.06329,155.66382,131.07979,134.25900,134.77088,161.37621,130.26260,140.69446,6.87764,7.29299,7.15072,7.04443,5.94026,6.55392,6.64970,7.32400,5.62500,6.92609,2.61460,2.71522,2.67930,2.66480,2.54570,2.55803,2.56591,2.72000,2.51630,2.60980,4.26303,4.68534,4.53263,4.45307,3.30597,3.90430,4.03922,4.69389,2.99509,4.31220,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.76986,2.26419,2.11055,1.90730,1.46292,1.69596,1.70625,2.26659,1.27830,1.73120,0.0,0.0,0.0,0.0,0.0,143.98276,122.43485,125.74330,127.78719,169.81907,166.29472,163.64362,121.83384,173.35228,144.21690,0.0,0.07131,0.46030,0.24681,0.18630,0.00086,0.00242,0.00574,0.46480,0.00070,0.03930,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.97749,6.96718,6.95939,6.91965,6.92683,6.93041,6.97960,6.91780,6.94550,24.83997,25.33349,25.27517,25.22092,24.25696,24.31487,24.38298,25.35280,24.12750,24.83490,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.97749,6.96718,6.95939,6.91965,6.92683,6.93041,6.97960,6.91780,6.94550,6.94595,7.62894,7.44829,7.41999,6.24131,6.36686,6.42410,7.67680,6.19669,7.10760 -5.89989,6.94520,7.19710,7.12858,7.09244,6.70694,6.76436,6.80575,7.19930,6.65150,6.95900,2.37307,2.98894,2.90776,2.83882,1.95098,1.97061,2.00863,3.00090,1.93310,2.36650,4.57213,5.17866,5.02937,4.97646,3.93381,4.01978,4.09612,5.20699,3.83550,4.57770,143.98478,144.51581,144.34107,144.28078,143.31795,143.57409,143.70768,143.27468,143.98433,143.96592,160.22254,157.18241,155.74916,131.07979,134.25900,134.63063,161.37621,130.26260,140.69446,6.87693,7.24123,7.13500,7.04443,5.94026,6.54583,6.64970,7.25189,5.62500,6.94970,2.61019,2.71428,2.67635,2.66344,2.54243,2.55427,2.56128,2.72000,2.52320,2.60810,4.26673,4.68534,4.53263,4.45307,3.30597,3.90679,4.03922,4.69389,2.99509,4.32000,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.76314,2.26419,2.11055,1.90730,1.46292,1.66397,1.68539,2.26659,1.27830,1.73000,0.0,0.0,0.0,0.0,0.0,143.98416,122.43485,125.98996,127.95446,169.92928,166.93390,163.80687,121.83384,173.35228,144.00506,0.0,0.06824,0.28652,0.22514,0.18470,0.00086,0.00245,0.00590,0.31000,0.00070,0.03930,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94517,6.97749,6.96504,6.95857,6.91965,6.92803,6.93093,6.97960,6.91780,6.94520,24.84479,25.33998,25.28223,25.23967,24.25326,24.30916,24.37494,25.35280,24.12750,24.84080,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94517,6.97749,6.96504,6.95857,6.91965,6.92803,6.93093,6.97960,6.91780,6.94520,6.94608,7.62894,7.44829,7.42773,6.24131,6.36203,6.42058,7.67680,6.19669,7.10760 -5.99989,6.94553,7.19715,7.13900,7.10150,6.70692,6.76339,6.80430,7.19930,6.65150,6.96199,2.36641,2.98401,2.89956,2.82986,1.95090,1.97001,2.00220,3.00090,1.93310,2.35550,4.57912,5.19200,5.03559,4.98907,3.94893,4.05350,4.11848,5.20699,3.92840,4.57770,143.98420,144.51593,144.32013,144.27849,143.38743,143.60697,143.71367,143.37534,143.98018,144.04848,160.22595,157.07464,155.72394,131.06067,134.33529,134.70734,161.37621,130.26260,141.05765,6.87446,7.24148,7.15354,7.05344,5.93413,6.51435,6.64883,7.25189,5.62500,6.95420,2.60596,2.71441,2.67492,2.65826,2.53519,2.55095,2.55768,2.72000,2.52320,2.60430,4.26849,4.68554,4.54027,4.48001,3.29903,3.87096,4.03467,4.69389,2.99509,4.32080,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.75858,2.26424,2.11747,1.91510,1.45862,1.65352,1.66778,2.26659,1.27830,1.72550,0.0,0.0,0.0,0.0,0.0,143.97745,122.30886,126.02156,127.89457,169.49612,166.01616,163.38053,121.83384,170.60479,144.23354,0.0,0.06990,0.28708,0.21031,0.18640,0.00114,0.00290,0.00664,0.31000,0.00070,0.04240,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94520,6.97411,6.96345,6.95828,6.91965,6.92904,6.93104,6.97470,6.91780,6.94540,24.85145,25.34028,25.28582,25.25276,24.26451,24.31587,24.40262,25.35280,24.24750,24.84140,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94520,6.97411,6.96345,6.95828,6.91965,6.92904,6.93104,6.97470,6.91780,6.94540,6.94210,7.63005,7.44406,7.42350,6.24118,6.36640,6.42161,7.67680,6.19669,7.08930 -6.09990,6.94599,7.19715,7.13930,7.09386,6.70692,6.75969,6.81604,7.19930,6.65150,6.98630,2.36792,3.08395,2.90811,2.83948,1.94494,1.97001,2.00220,3.14410,1.93310,2.36650,4.57806,5.19200,5.03559,4.98907,3.93369,4.03832,4.11824,5.20699,3.87740,4.57770,143.98380,144.51593,144.32471,144.28140,143.29550,143.60429,143.67155,143.23774,143.98018,143.99401,160.95185,157.07464,155.72394,130.17212,134.20224,134.43715,161.50392,130.10668,141.05765,6.87230,7.24148,7.15354,7.05344,5.93413,6.51435,6.64883,7.25189,5.62500,7.00229,2.60283,2.68693,2.66673,2.65342,2.53161,2.54645,2.55433,2.68840,2.52320,2.60290,4.26946,4.68554,4.54027,4.48269,3.29903,3.87096,4.03366,4.69389,2.99509,4.32949,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.75457,2.26424,2.11747,1.91510,1.45862,1.65274,1.66400,2.26659,1.27830,1.72070,0.0,0.0,0.0,0.0,0.0,143.96786,120.83187,125.88592,127.73741,170.10737,166.43559,163.38694,119.74470,172.10222,144.00506,0.0,0.07083,0.28708,0.21031,0.18731,0.00130,0.00290,0.00597,0.31000,0.00070,0.04620,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.97858,6.96358,6.96032,6.91965,6.92882,6.93090,6.98140,6.90730,6.94540,24.84847,25.34238,25.28645,25.25276,24.25312,24.30884,24.38495,25.35280,24.10480,24.84140,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.97858,6.96358,6.96032,6.91965,6.92882,6.93090,6.98140,6.90730,6.94540,6.94473,7.68213,7.45144,7.43842,6.21303,6.36640,6.42161,7.68600,6.19180,7.08930 -6.19990,6.94641,7.19715,7.14209,7.10750,6.70692,6.76456,6.81959,7.19930,6.65150,6.92239,2.36496,3.06707,2.90044,2.85440,1.94494,1.96566,2.00782,3.14410,1.93770,2.35210,4.58145,5.15861,5.03559,4.98907,3.94893,4.03832,4.11368,5.17130,3.87740,4.59050,143.98446,144.57937,144.36138,144.28515,143.29550,143.56697,143.65298,143.23774,143.98018,144.01403,160.95185,157.19291,155.72394,130.17212,134.20224,134.53083,161.50392,130.10668,140.77171,6.88052,7.24148,7.15354,7.04562,6.31558,6.54539,6.65790,7.25189,5.62500,6.91870,2.60017,2.68772,2.66151,2.65087,2.53161,2.54547,2.55278,2.68840,2.52320,2.60020,4.28035,4.68554,4.54515,4.48269,3.71857,3.90680,4.03366,4.69389,3.00729,4.32910,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.75024,2.24588,2.11724,1.91468,1.64193,1.65352,1.66400,2.26100,1.27830,1.71650,0.0,0.0,0.0,0.0,0.0,143.95916,121.57037,126.00758,127.49442,169.66734,166.55618,163.35865,120.25879,171.96608,144.03825,0.0,0.06942,0.28708,0.23092,0.18695,0.00104,0.00290,0.00703,0.31000,0.00070,0.04280,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94519,6.97858,6.96539,6.96122,6.91661,6.92706,6.93072,6.98140,6.90730,6.94540,24.85184,25.32590,25.29181,25.25276,24.26451,24.31298,24.37406,25.32800,24.10480,24.85539,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94519,6.97858,6.96539,6.96122,6.91661,6.92706,6.93072,6.98140,6.90730,6.94540,6.94376,7.68213,7.45144,7.43324,6.21303,6.36161,6.42161,7.68600,6.19180,7.10369 -6.29989,6.94479,7.19715,7.14209,7.11028,6.70692,6.75835,6.80430,7.19930,6.65150,7.12570,2.36065,3.06707,2.88676,2.82098,1.94494,1.96070,1.99592,3.14410,1.93770,2.35210,4.58413,5.15861,5.03559,4.99874,3.94893,4.03892,4.12143,5.17130,3.87740,4.59050,143.98306,144.57937,144.40078,144.29764,143.29550,143.46872,143.64555,143.23774,143.98433,143.95359,160.95185,157.18846,155.92353,130.17212,133.28961,134.38439,161.50392,130.10668,140.77171,6.87760,7.24148,7.15354,7.05106,6.31558,6.54539,6.64883,7.25189,5.62500,7.00680,2.59758,2.68772,2.65920,2.64376,2.52496,2.54070,2.55170,2.68840,2.50770,2.60000,4.28001,4.68554,4.54515,4.48269,3.71857,3.90680,4.02328,4.69389,3.00729,4.32949,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.74649,2.24588,2.13431,1.92780,1.64180,1.65273,1.66212,2.26100,1.27830,1.71400,0.0,0.0,0.0,0.0,0.0,143.99283,121.57037,126.22517,127.88181,169.66734,166.67722,163.46920,120.25879,171.96608,144.03825,0.0,0.07142,0.28708,0.23092,0.18893,0.00100,0.00290,0.00709,0.31000,0.00070,0.03780,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94526,6.97858,6.97016,6.96158,6.91661,6.92517,6.93012,6.98140,6.90730,6.94520,24.85498,25.32590,25.29181,25.25558,24.26518,24.32830,24.38495,25.32800,24.10480,24.85539,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94526,6.97858,6.97016,6.96158,6.91661,6.92517,6.93012,6.98140,6.90730,6.94520,6.94668,7.68213,7.50246,7.44134,6.21303,6.36179,6.41340,7.68600,6.19180,7.10369 -6.39990,6.94560,7.19415,7.13210,7.10998,6.72004,6.76456,6.80444,7.19420,6.70600,7.01430,2.37238,3.82884,2.90044,2.82098,1.93996,1.95966,1.98066,4.32470,1.92530,2.35180,4.57322,5.15882,5.02322,4.97987,3.90411,4.02338,4.12143,5.17130,2.68170,4.59240,143.98429,144.57937,144.41371,144.31222,143.29550,143.46337,143.64348,143.23774,143.96982,143.97366,161.45026,157.48180,155.98531,119.71663,133.33760,134.40968,193.60334,113.17210,140.88872,6.86559,7.24148,7.13500,7.05106,5.90414,6.51524,6.64278,7.25189,5.62500,6.95600,2.59763,2.68772,2.66146,2.64756,2.52496,2.54070,2.55254,2.68840,2.50770,2.60040,4.26796,4.68554,4.54027,4.46165,3.29903,3.87116,4.00910,4.69389,2.96330,4.31760,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.75457,2.73648,2.14501,1.95172,1.64180,1.65273,1.66090,3.08079,1.27830,1.71000,0.0,0.0,0.0,0.0,0.0,143.97589,111.26349,126.20414,128.19099,171.11333,167.13911,163.87800,105.30749,217.06099,144.00506,0.0,0.06891,0.25158,0.20657,0.18695,0.00100,0.00290,0.00791,0.25400,0.00070,0.03710,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94520,6.97858,6.97042,6.96168,6.91661,6.92455,6.92942,6.98140,6.90730,6.94590,24.84425,25.32590,25.29708,25.26764,24.17036,24.31587,24.38495,25.32800,22.92460,24.85539,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94520,6.97858,6.97042,6.96168,6.91661,6.92455,6.92942,6.98140,6.90730,6.94590,6.94571,8.35305,7.49976,7.43994,6.19385,6.34994,6.41086,8.83610,5.16520,7.09780 -6.49989,6.94529,7.19415,7.13210,7.10538,6.72032,6.76469,6.80549,7.19420,6.70600,6.86310,2.37384,3.81704,2.89970,2.83542,1.93063,1.95969,1.97983,4.32470,1.91780,2.35210,4.57145,5.15852,5.02319,4.97972,3.90474,4.02412,4.12155,5.17130,2.68170,4.60280,143.98387,144.57836,144.41319,144.31201,143.29688,143.46420,143.64369,143.23774,143.97396,143.93510,161.44898,157.59485,156.61952,119.88169,133.13567,134.38494,193.60334,113.17210,140.88872,6.86286,7.24123,7.13500,7.04919,5.91079,6.51634,6.64322,7.25189,5.62500,6.85759,2.59795,2.68771,2.66134,2.64635,2.52500,2.54095,2.55138,2.68840,2.50770,2.60440,4.26490,4.68534,4.53969,4.46063,3.30597,3.90316,4.01010,4.69389,2.96330,4.31039,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.75233,2.72828,2.14451,1.93086,1.64183,1.65274,1.65777,3.08079,1.27830,1.70910,0.0,0.0,0.0,0.0,0.0,143.98229,111.41352,126.21633,127.95676,171.36844,167.11760,163.89707,105.30749,217.41493,143.78351,0.0,0.06907,0.25152,0.20636,0.18666,0.00100,0.00291,0.00792,0.25400,0.00070,0.03580,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.97851,6.97038,6.96167,6.91666,6.92457,6.92943,6.98140,6.90730,6.94570,24.84129,25.33398,25.29724,25.25431,24.17011,24.31497,24.38724,25.33849,22.92460,24.85760,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.97851,6.97038,6.96167,6.91666,6.92457,6.92943,6.98140,6.90730,6.94570,6.94757,8.34155,7.51113,7.44131,6.19390,6.34538,6.38490,8.83610,5.16520,7.09780 -6.59989,6.94552,7.18470,7.13145,7.09492,6.73812,6.76456,6.82151,7.19420,6.70600,6.94130,2.37337,3.82884,2.88102,2.81442,1.93050,1.95642,1.97496,4.32470,1.91780,2.35850,4.57214,5.15882,5.02924,4.99125,3.90411,4.06068,4.12870,5.17130,2.68170,4.60300,143.98195,144.57937,144.38202,144.28515,143.29550,143.48355,143.64967,143.23774,143.97189,143.84805,161.30915,157.48180,155.89242,119.71663,132.68917,134.36598,193.60334,113.17210,140.69446,6.87267,7.20744,7.10752,7.05106,6.36522,6.57519,6.65030,7.22710,5.62510,6.48510,2.59816,2.68772,2.66146,2.64734,2.52496,2.54070,2.55218,2.68840,2.50770,2.60329,4.27451,4.64489,4.53120,4.46165,3.75393,3.92823,4.01822,4.67399,2.96330,4.31600,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.74772,2.73648,2.13064,1.90716,1.64180,1.64993,1.65538,3.08079,1.64020,1.69910,0.0,0.0,0.0,0.0,0.0,143.97766,111.26349,126.41809,128.11183,171.39076,166.19301,163.83612,105.30749,217.41493,143.64720,0.0,0.06644,0.24793,0.20208,0.18492,0.00100,0.00442,0.00791,0.24810,0.00070,0.03460,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94531,6.97858,6.96944,6.96138,6.91661,6.92607,6.93072,6.98140,6.90730,6.94580,24.84167,25.33408,25.30206,25.25939,24.16859,24.31425,24.40350,25.33849,22.92460,24.85539,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94531,6.97858,6.96944,6.96138,6.91661,6.92607,6.93072,6.98140,6.90730,6.94580,6.95177,8.35305,7.53641,7.44236,6.19927,6.34994,6.41467,8.83610,5.16520,7.10760 -6.69989,6.94632,7.18470,7.13145,7.08312,6.73812,6.75835,6.82151,7.19420,6.70600,6.98070,2.36518,3.82884,2.88121,2.81442,1.92635,1.95175,1.97022,4.32470,1.91780,2.35210,4.58114,5.15882,5.03809,5.00186,3.90411,4.06068,4.16408,5.17130,2.68170,4.60280,143.98477,144.58376,144.46357,144.29056,143.30067,143.48108,143.64678,143.23774,143.97396,144.00663,161.30915,157.48180,156.02619,119.71663,132.67491,134.33998,193.60334,113.17210,141.20504,6.86914,7.20744,7.08314,7.03608,6.36522,6.57519,6.64278,7.22710,5.62510,6.97310,2.59949,2.68772,2.66146,2.64828,2.52496,2.54070,2.55114,2.68840,2.50770,2.60580,4.26964,4.64489,4.52616,4.45194,3.75393,3.92823,4.00910,4.67399,2.96330,4.29680,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.74690,2.73648,2.14501,1.93344,1.64138,1.64981,1.65328,3.08079,1.64020,1.69180,0.0,0.0,0.0,0.0,0.0,143.96097,111.26349,126.27378,127.93809,171.51299,166.32210,163.01778,105.30749,217.41493,143.78351,0.0,0.06748,0.24793,0.20208,0.18683,0.00124,0.00442,0.00809,0.24810,0.00100,0.03850,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94517,6.97833,6.96956,6.96152,6.91640,6.92215,6.93046,6.98140,6.90730,6.94570,24.84915,25.33408,25.30664,25.27403,24.16859,24.31525,24.41873,25.33849,22.92460,24.85760,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94517,6.97833,6.96956,6.96152,6.91640,6.92215,6.93046,6.98140,6.90730,6.94570,6.94412,8.35305,7.53722,7.44380,6.19927,6.34994,6.40918,8.83610,5.16520,7.08190 -6.79989,6.94411,7.16215,7.13005,7.06198,6.74285,6.76241,6.80356,7.17159,6.73639,7.02130,2.36280,3.82884,2.87481,2.81282,1.92390,1.94491,1.96916,4.32470,1.91780,2.35159,4.58130,5.18011,5.03809,4.99966,3.93124,4.07236,4.16143,5.18650,2.68170,4.60120,143.98493,144.58376,144.41163,144.28307,143.30067,143.50949,143.66866,143.23774,143.99055,144.00559,161.30915,157.41710,156.02619,119.71663,132.98774,134.36598,193.60334,113.17210,141.36873,6.86892,7.17492,7.08314,7.03608,6.47101,6.58110,6.65030,7.18029,5.62510,6.96570,2.60105,2.68772,2.65975,2.64890,2.52496,2.54430,2.55114,2.68840,2.50770,2.60760,4.26786,4.59840,4.52010,4.45194,3.83273,3.95264,4.01822,4.60470,2.96330,4.28880,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.74223,2.72136,2.10733,1.90804,1.64138,1.64993,1.65412,3.08079,1.64020,1.68260,0.0,0.0,0.0,0.0,0.0,144.00686,111.00055,126.37591,128.00032,170.78975,166.18832,163.11617,105.13920,217.41493,143.82694,0.0,0.06679,0.22478,0.19380,0.17718,0.00124,0.00487,0.00922,0.23200,0.00100,0.03870,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94517,6.97833,6.96818,6.96046,6.91640,6.92464,6.93082,6.98140,6.90730,6.94490,24.85013,25.33408,25.30004,25.27403,24.16859,24.33752,24.40742,25.33849,22.92460,24.85760,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94517,6.97833,6.96818,6.96046,6.91640,6.92464,6.93082,6.98140,6.90730,6.94490,6.94417,8.35305,7.51949,7.44236,6.19927,6.35255,6.40918,8.83610,5.16520,7.07370 -6.89989,6.94485,7.16215,7.13005,7.08005,6.74765,6.76746,6.80556,7.17159,6.74050,6.77250,2.35629,3.82884,2.87481,2.81282,1.91146,1.93821,1.95708,4.32470,1.87610,2.35159,4.58856,5.18011,5.04530,5.01102,3.93124,4.07236,4.17630,5.18650,2.68170,4.59949,143.98623,144.58376,144.41163,144.27890,143.30067,143.50949,143.66866,143.23774,143.99055,143.98523,161.30915,157.20502,156.02619,119.71663,132.98774,134.39993,193.60334,113.17210,141.20504,6.86922,7.17492,7.08143,7.03557,6.47786,6.58110,6.66806,7.18029,5.62510,6.87170,2.60286,2.68915,2.65975,2.65019,2.52866,2.54565,2.55254,2.68970,2.50770,2.60890,4.26636,4.59840,4.51614,4.44352,3.83714,3.95264,4.02252,4.60470,2.96330,4.28880,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.74358,2.72136,2.08102,1.90804,1.64138,1.64755,1.65412,3.08079,1.64020,1.68270,0.0,0.0,0.0,0.0,0.0,143.99141,111.00055,126.26087,127.81447,171.15339,166.37357,163.04223,105.13920,219.40409,143.86212,0.0,0.06563,0.22478,0.19191,0.17674,0.00124,0.00307,0.00790,0.23200,0.00100,0.03850,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94510,6.97833,6.96818,6.96046,6.91640,6.92464,6.93102,6.98140,6.90730,6.94490,24.85896,25.34650,25.30826,25.28978,24.16859,24.34026,24.41873,25.35229,22.92460,24.85910,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94510,6.97833,6.96818,6.96046,6.91640,6.92464,6.93102,6.98140,6.90730,6.94490,6.94515,8.35305,7.51949,7.44048,6.19927,6.36112,6.40918,8.83610,5.16520,7.08190 -6.99990,6.94537,7.18379,7.12211,7.08043,6.74290,6.77290,6.80724,7.19300,6.68130,6.95379,2.34925,3.81704,2.87242,2.79598,1.88943,1.92793,1.94633,4.32470,1.84410,2.35150,4.59611,5.16719,5.04495,5.01825,3.93252,4.06132,4.18665,5.18650,2.68170,4.60300,143.98418,144.58286,144.41006,144.26579,143.30217,143.51073,143.66907,143.23774,143.99055,144.07334,161.30452,157.40458,156.01914,119.88169,132.69146,134.33782,193.60334,113.17210,141.36873,6.87072,7.18656,7.08139,7.03544,6.35864,6.58185,6.66894,7.19130,5.62510,6.96170,2.60565,2.68914,2.66141,2.65099,2.52869,2.54703,2.55655,2.68970,2.50770,2.60900,4.26507,4.59135,4.50835,4.44243,3.73391,3.95437,4.02250,4.59260,2.96330,4.30120,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.74406,2.69607,2.08078,1.90566,1.64263,1.65041,1.65568,3.08079,1.64020,1.68930,0.0,0.0,0.0,0.0,0.0,143.98066,111.30608,126.30456,127.97166,171.76357,166.96567,163.05287,105.13920,220.95541,143.79178,0.0,0.06383,0.25884,0.19009,0.16964,0.00084,0.00191,0.00644,0.26460,0.00030,0.03540,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94520,6.97826,6.96811,6.96044,6.91644,6.92472,6.93165,6.98140,6.90730,6.94490,24.86564,25.34636,25.30992,25.29639,24.17011,24.33457,24.43061,25.35229,22.92460,24.87659,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94520,6.97826,6.96811,6.96044,6.91644,6.92472,6.93165,6.98140,6.90730,6.94490,6.94090,8.34155,7.53628,7.44392,6.19945,6.35305,6.40947,8.83610,5.16520,7.07370 -7.09990,6.94519,7.18379,7.12058,7.08361,6.74664,6.77290,6.80045,7.19300,6.68130,6.89729,2.34212,3.72411,2.86635,2.77848,1.88943,1.92793,1.95265,4.32470,1.84410,2.34339,4.60307,5.16719,5.04495,5.01825,4.00607,4.07244,4.19821,5.18650,2.68170,4.60409,143.98350,144.51547,144.37566,144.23707,143.39475,143.54441,143.71367,143.38767,143.99055,144.05471,160.53405,157.16647,156.01914,120.21260,132.69146,134.36273,193.60334,113.17210,141.62299,6.87114,7.18656,7.08139,7.03985,6.35864,6.58185,6.68409,7.19130,5.62510,6.84860,2.60536,2.68845,2.65978,2.65026,2.53458,2.54745,2.55744,2.68970,2.50770,2.60980,4.26578,4.59135,4.50555,4.44243,3.73391,3.95437,4.03783,4.59260,2.96330,4.30429,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.74169,2.69607,2.08078,1.90746,1.64263,1.65041,1.65515,3.08079,1.64020,1.68000,0.0,0.0,0.0,0.0,0.0,143.98439,112.46934,126.40139,128.25889,169.62081,166.65625,162.57889,105.13920,220.95541,143.93666,0.0,0.06281,0.25884,0.18889,0.16964,0.00051,0.00191,0.00506,0.26460,0.00020,0.03440,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94523,6.97375,6.96648,6.95828,6.91967,6.92637,6.93303,6.97410,6.91460,6.94490,24.87290,25.34636,25.30794,25.29185,24.27540,24.34174,24.43822,25.35229,22.92460,24.89290,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94523,6.97375,6.96648,6.95828,6.91967,6.92637,6.93303,6.97410,6.91460,6.94490,6.94180,8.31859,7.53628,7.44254,6.22920,6.36268,6.40947,8.83610,5.16520,7.06099 -7.19989,6.94643,7.17412,7.11353,7.08361,6.74664,6.77616,6.80724,7.19300,6.68130,6.79300,2.33539,3.72411,2.86635,2.77848,1.86076,1.92567,1.94836,4.32470,1.84410,2.34090,4.61103,5.16719,5.05637,5.02206,4.01381,4.07606,4.20309,5.18650,2.68170,4.60300,143.98455,144.48866,144.30430,144.19174,143.39475,143.63234,143.74301,143.38767,143.99055,144.09915,160.53405,157.16647,156.16996,120.31522,132.99490,134.38295,193.60334,113.17210,141.92046,6.87157,7.16455,7.08201,7.04569,6.30433,6.58185,6.72981,7.19130,5.62510,6.79240,2.60451,2.68320,2.65939,2.65026,2.53458,2.54972,2.56151,2.68970,2.50770,2.60800,4.26706,4.57475,4.50555,4.45116,3.66769,3.95437,4.06308,4.59260,2.96330,4.31039,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.74128,2.73413,2.08078,1.90746,1.64263,1.65041,1.65472,3.08079,1.64020,1.67610,0.0,0.0,0.0,0.0,0.0,143.95870,112.46934,126.21919,128.19625,170.22493,166.61834,162.56329,105.13920,220.95541,144.01129,0.0,0.05963,0.25884,0.17918,0.16650,0.00051,0.00133,0.00310,0.26460,0.00020,0.02770,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94518,6.97375,6.96222,6.95686,6.92095,6.92980,6.93521,6.97410,6.91890,6.94490,24.88106,25.37623,25.30801,25.29585,24.27540,24.35567,24.45560,25.39430,22.92460,24.89290,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94518,6.97375,6.96222,6.95686,6.92095,6.92980,6.93521,6.97410,6.91890,6.94490,6.93966,8.31149,7.51908,7.44142,6.22920,6.36268,6.40328,8.83610,5.16520,7.04620 -7.29989,6.94466,7.17412,7.11347,7.08361,6.74664,6.78324,6.81004,7.19300,6.68130,6.94670,2.32770,3.72411,2.86635,2.77677,1.86076,1.91882,1.93685,4.32470,1.84410,2.32850,4.61696,5.16719,5.06874,5.02213,4.01381,4.07606,4.18665,5.18650,2.68170,4.60570,143.98424,144.48328,144.23551,144.14165,143.42658,143.65772,143.81639,143.38767,143.99262,144.05157,160.53405,156.80088,155.61634,120.55097,133.76611,134.55436,193.60334,113.17210,141.62299,6.87006,7.16455,7.08320,7.04569,6.30433,6.53582,6.72981,7.19130,5.62510,6.94540,2.60530,2.68320,2.65744,2.64949,2.54475,2.55408,2.56307,2.68970,2.54410,2.60800,4.26476,4.57475,4.50647,4.44824,3.66769,3.90575,4.06308,4.59260,2.96330,4.31039,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.74063,2.73413,2.10589,1.90746,1.64366,1.65169,1.65568,3.08079,1.64020,1.67500,0.0,0.0,0.0,0.0,0.0,143.99536,112.46934,126.02243,128.22321,170.22493,166.80887,163.30529,105.13920,220.95541,144.21274,0.0,0.06008,0.25884,0.17918,0.16686,0.00051,0.00133,0.00260,0.26460,0.00020,0.02600,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94520,6.97220,6.96099,6.95331,6.92121,6.93310,6.93761,6.97410,6.91890,6.94480,24.88878,25.41060,25.32093,25.29974,24.27540,24.35567,24.45950,25.42290,22.92460,24.89300,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94520,6.97220,6.96099,6.95331,6.92121,6.93310,6.93761,6.97410,6.91890,6.94480,6.94195,8.29524,7.47573,7.43194,6.22920,6.37751,6.42606,8.83610,5.16520,7.06099 -7.39990,6.94340,7.17412,7.10906,7.08361,6.72653,6.77547,6.81004,7.19300,6.68130,6.93550,2.30577,2.90048,2.84008,2.77016,1.86076,1.91597,1.93029,2.91670,1.84410,2.32089,4.63763,5.19305,5.07187,5.02957,4.02667,4.09149,4.18665,5.19800,3.98850,4.61890,143.98619,144.40979,144.22844,144.12627,143.43897,143.68817,143.82074,143.38767,143.99262,144.10040,159.48218,156.58972,155.61634,131.01170,133.21175,134.55002,161.04096,130.30844,141.62299,6.87832,7.16455,7.08320,7.04836,6.30820,6.52569,6.72981,7.19130,6.27260,6.94040,2.60531,2.68320,2.65592,2.64864,2.54475,2.55264,2.56397,2.68970,2.54410,2.60630,4.27300,4.57475,4.50688,4.46688,3.66769,3.89999,4.06308,4.59260,3.63069,4.32409,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.73022,2.23654,2.10589,1.89320,1.64366,1.65169,1.65568,2.27459,1.64020,1.67310,0.0,0.0,0.0,0.0,0.0,144.02155,123.55526,126.39093,128.20956,169.85296,166.45956,163.48043,123.23314,171.45012,144.09637,0.0,0.05972,0.25884,0.17918,0.16686,0.00051,0.00133,0.00276,0.26460,0.00020,0.02510,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94511,6.97160,6.95951,6.95310,6.92473,6.93344,6.93836,6.97410,6.91890,6.94480,24.91316,25.41060,25.33743,25.30285,24.30471,24.37803,24.47886,25.42290,24.29889,24.91220,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94511,6.97160,6.95951,6.95310,6.92473,6.93344,6.93836,6.97410,6.91890,6.94480,6.93960,7.63290,7.50684,7.43218,6.27029,6.38611,6.42606,7.67410,6.20960,7.06099 -7.49989,6.94520,7.21192,7.11826,7.09379,6.72653,6.77360,6.80340,7.22620,6.68130,6.94710,2.30116,2.90048,2.83334,2.77016,1.85724,1.89870,1.92807,2.91670,1.84410,2.32089,4.64404,5.19305,5.07685,5.03039,4.02667,4.10728,4.21514,5.19800,3.98850,4.61230,143.98400,144.40979,144.22844,144.11609,143.43897,143.72400,143.82798,143.38767,143.98640,143.97099,159.37207,156.58972,155.43638,131.01170,133.23589,134.55002,159.86699,130.30844,141.08352,6.88007,7.16455,7.09519,7.04836,6.30820,6.53582,6.73746,7.19130,6.27260,6.97360,2.60730,2.69665,2.65978,2.64949,2.54475,2.55264,2.56495,2.70190,2.54410,2.60670,4.27276,4.57475,4.50299,4.44824,3.66769,3.90354,4.07427,4.59260,3.63069,4.32569,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.73081,2.23654,2.10517,1.89320,1.64366,1.65169,1.65702,2.27459,1.64020,1.67320,0.0,0.0,0.0,0.0,0.0,143.98421,123.55526,126.41897,128.19608,169.95475,166.50072,162.78134,123.23314,171.45012,144.23354,0.0,0.06022,0.27214,0.18767,0.17110,0.00051,0.00133,0.00254,0.27760,0.00020,0.02140,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94521,6.97160,6.95778,6.95275,6.92473,6.93344,6.93885,6.97410,6.91890,6.94510,24.91737,25.41060,25.34878,25.30713,24.30471,24.37879,24.47886,25.42290,24.29889,24.90060,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94521,6.97160,6.95778,6.95275,6.92473,6.93344,6.93885,6.97410,6.91890,6.94510,6.94584,7.63290,7.50548,7.43218,6.27462,6.38611,6.43350,7.67410,6.25520,7.08800 -7.59990,6.94494,7.21192,7.11898,7.09761,6.73268,6.77041,6.80010,7.22620,6.68130,6.95000,2.29656,2.90048,2.83424,2.77016,1.85724,1.88960,1.92150,2.91670,1.84410,2.31939,4.64837,5.19305,5.07685,5.03683,4.02667,4.11583,4.21673,5.19800,3.98850,4.61890,143.98387,144.40979,144.16180,144.10883,143.43897,143.74053,143.83087,143.38767,143.99055,143.96517,159.37207,156.54278,155.37094,131.11584,133.49896,134.79232,159.86699,130.30844,140.83316,6.88090,7.16455,7.10770,7.04836,6.30820,6.52569,6.74685,7.19130,6.27260,6.93110,2.61090,2.69871,2.68267,2.65486,2.54475,2.55691,2.56739,2.70190,2.54410,2.60900,4.26999,4.56959,4.50299,4.43984,3.66769,3.89246,4.08087,4.59260,3.63069,4.30690,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.73253,2.23654,2.12498,1.89320,1.64673,1.65473,1.65821,2.27459,1.64220,1.67550,0.0,0.0,0.0,0.0,0.0,143.98968,123.55526,126.40459,128.09033,169.95475,166.51583,162.91341,123.23314,171.45012,144.12752,0.0,0.05980,0.27214,0.18095,0.17300,0.00051,0.00133,0.00242,0.27760,0.00020,0.01760,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.97160,6.95698,6.95261,6.92473,6.93665,6.93920,6.97410,6.91890,6.94490,24.92197,25.41060,25.35179,25.32019,24.31990,24.38949,24.47886,25.42290,24.29889,24.91220,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.97160,6.95698,6.95261,6.92473,6.93665,6.93920,6.97410,6.91890,6.94490,6.94612,7.62684,7.49069,7.41882,6.27462,6.38803,6.43621,7.67410,6.25520,7.10060 -7.69989,6.94630,7.21225,7.11899,7.09895,6.70921,6.77038,6.80300,7.22620,6.68130,6.91150,2.30190,2.96939,2.84326,2.79565,1.85705,1.88224,1.91866,2.97910,1.84410,2.31939,4.64439,5.22096,5.08031,5.03772,4.00370,4.09999,4.17838,5.23760,3.96800,4.61890,143.98426,144.22676,144.12108,144.10260,143.66552,143.81515,143.86460,143.65339,143.98640,144.03764,158.76291,156.81305,155.43880,129.02416,133.51117,134.92290,159.67298,128.10986,140.83316,6.87743,7.16517,7.11202,7.07202,6.30754,6.49793,6.69530,7.19130,6.27260,6.90720,2.61231,2.69879,2.68314,2.65736,2.54474,2.56386,2.56798,2.70190,2.54410,2.60980,4.26512,4.57013,4.50709,4.45160,3.66762,3.87995,4.04688,4.59260,3.63069,4.31240,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.73839,2.23528,2.12586,1.93416,1.64910,1.65694,1.65930,2.27459,1.64630,1.67750,0.0,0.0,0.0,0.0,0.0,143.96138,122.09466,126.20573,127.65881,170.62639,167.16174,164.01401,121.70336,172.05485,144.12752,0.0,0.05807,0.27227,0.18138,0.17320,0.00024,0.00120,0.00202,0.27760,0.00010,0.01510,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94520,6.96061,6.95337,6.95098,6.93352,6.93861,6.93950,6.96120,6.93210,6.94510,24.91772,25.41088,25.35454,25.32828,24.28115,24.37833,24.47512,25.42290,24.12160,24.91220,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94520,6.96061,6.95337,6.95098,6.93352,6.93861,6.93950,6.96120,6.93210,6.94510,6.94262,7.75048,7.49001,7.41164,6.29870,6.37702,6.43340,7.80580,6.26280,7.10060 -7.79990,6.94405,7.21225,7.11899,7.09895,6.70921,6.77038,6.79980,7.22620,6.68130,7.09670,2.29892,2.96939,2.83503,2.77768,1.85705,1.88494,1.91866,2.97910,1.84410,2.31939,4.64512,5.22096,5.07713,5.03024,4.00370,4.09999,4.17838,5.23760,3.96800,4.64500,143.98383,144.23662,144.12108,144.10260,143.65425,143.81474,143.86460,143.65339,143.98640,144.00576,158.76291,156.60971,155.55002,129.02416,133.17441,134.77670,159.67298,128.10986,140.49087,6.87499,7.18336,7.11202,7.05882,6.28838,6.49104,6.68424,7.19130,6.27260,7.04890,2.61221,2.69879,2.68314,2.65590,2.54468,2.56386,2.56918,2.70190,2.50439,2.60980,4.26278,4.60338,4.50313,4.43860,3.66762,3.84477,4.03688,4.61120,3.63069,4.31240,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.73841,2.24263,2.13974,1.94290,1.64039,1.65385,1.65872,2.27459,1.63050,1.67740,0.0,0.0,0.0,0.0,0.0,144.00810,122.09466,126.38757,128.07508,170.62639,167.08633,164.01401,121.70336,172.05485,143.58738,0.0,0.06039,0.27227,0.18804,0.17385,0.00024,0.00110,0.00173,0.27760,0.00010,0.01590,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.96115,6.95339,6.95098,6.93305,6.93861,6.93950,6.96120,6.93060,6.94510,24.92146,25.41088,25.35421,25.32828,24.28115,24.36330,24.47512,25.42290,24.12160,24.91220,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.96115,6.95339,6.95098,6.93305,6.93861,6.93950,6.96120,6.93060,6.94510,6.94416,7.75048,7.50895,7.41968,6.29870,6.38530,6.42880,7.80580,6.26280,7.11790 -7.89989,6.94535,7.21225,7.11918,7.10040,6.70921,6.76931,6.79880,7.22620,6.68130,6.94420,2.29640,2.96939,2.82032,2.77023,1.84751,1.87989,1.91866,2.97910,1.84410,2.32089,4.64895,5.22096,5.08031,5.03772,4.00370,4.10854,4.20423,5.23760,3.96800,4.64219,143.98405,144.23662,144.12108,144.10135,143.65425,143.81660,143.86708,143.65339,143.98640,144.03274,159.30837,156.60971,155.40643,129.02416,133.17441,134.77670,159.67298,128.10986,140.83316,6.87571,7.18336,7.11707,7.07202,6.28838,6.49104,6.68424,7.19130,6.27260,6.91370,2.61102,2.69879,2.67439,2.65533,2.54468,2.56395,2.57118,2.70190,2.50439,2.60900,4.26468,4.60338,4.50709,4.45160,3.66762,3.84477,4.03688,4.61120,3.63069,4.31330,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.73754,2.24263,2.13974,1.94712,1.63846,1.65385,1.65765,2.27459,1.63050,1.67500,0.0,0.0,0.0,0.0,0.0,143.98107,122.09466,126.57218,128.07442,170.90447,166.98867,163.32130,121.70336,172.05485,143.61419,0.0,0.06153,0.27227,0.20630,0.17854,0.00024,0.00110,0.00222,0.27760,0.00010,0.01630,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94521,6.96115,6.95330,6.95086,6.93305,6.93861,6.93956,6.96120,6.93060,6.94510,24.92465,25.41114,25.36073,25.32828,24.28115,24.39081,24.48082,25.42290,24.12160,24.91220,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94521,6.96115,6.95330,6.95086,6.93305,6.93861,6.93956,6.96120,6.93060,6.94510,6.94286,7.75048,7.50895,7.41968,6.27713,6.38530,6.43474,7.80580,6.26280,7.10060 -7.99989,6.94520,7.20944,7.11918,7.09773,6.72540,6.76931,6.80060,7.22620,6.70429,6.94480,2.29415,2.96939,2.82549,2.77768,1.84751,1.87989,1.91866,2.97910,1.84170,2.32020,4.65104,5.22096,5.08518,5.03772,4.00563,4.12990,4.21086,5.23760,3.96800,4.61720,143.98401,144.23662,144.12523,144.10592,143.65425,143.80709,143.86460,143.65339,143.98640,143.98900,159.30837,156.55773,155.40643,129.02416,133.44667,134.79123,159.67298,128.10986,140.37057,6.87406,7.16765,7.11707,7.05882,6.31995,6.49793,6.68474,7.17239,6.27939,6.93530,2.60923,2.69879,2.67314,2.65309,2.53532,2.55281,2.56654,2.70190,2.50439,2.60870,4.26483,4.58091,4.52257,4.43860,3.68448,3.87995,4.05004,4.61120,3.63069,4.31090,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.73620,2.24263,2.12831,1.94712,1.63058,1.64968,1.65642,2.27459,1.62690,1.67330,0.0,0.0,0.0,0.0,0.0,143.98426,122.09466,126.41138,127.95250,170.84805,166.39488,163.14491,121.70336,172.12592,144.14622,0.0,0.05987,0.26374,0.18991,0.17854,0.00028,0.00130,0.00252,0.27760,0.00010,0.01790,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94521,6.96115,6.95376,6.95098,6.93305,6.93841,6.93934,6.96120,6.93060,6.94510,24.93033,25.41567,25.37436,25.33120,24.28115,24.42829,24.48082,25.42290,24.12160,24.91220,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94521,6.96115,6.95376,6.95098,6.93305,6.93841,6.93934,6.96120,6.93060,6.94510,6.94497,7.75048,7.49363,7.41888,6.27713,6.38742,6.43474,7.80580,6.26280,7.12400 -8.09990,6.94514,7.20944,7.13169,7.10364,6.70921,6.76173,6.79854,7.22620,6.70310,6.93150,2.29221,2.96939,2.82032,2.76867,1.84751,1.87989,1.91618,2.97910,1.84170,2.32020,4.65293,5.22735,5.11747,5.05286,4.00563,4.13332,4.21520,5.23760,3.96800,4.62170,143.98468,144.23662,144.16450,144.10841,143.65979,143.80709,143.84598,143.65545,143.98640,143.96316,159.30837,156.60971,155.40643,129.02416,133.44667,134.79123,159.67298,128.10986,140.83316,6.87314,7.16765,7.12199,7.08450,6.31995,6.49793,6.68474,7.17239,6.27939,6.93550,2.60959,2.69879,2.68314,2.65444,2.53479,2.55281,2.56854,2.70190,2.50439,2.60870,4.26355,4.58213,4.53396,4.46471,3.68448,3.87995,4.04430,4.61120,3.63069,4.30540,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.73727,2.24263,2.12831,1.94328,1.63058,1.64738,1.65582,2.27459,1.62690,1.67630,0.0,0.0,0.0,0.0,0.0,143.98538,121.99957,125.97964,127.85205,170.84805,166.30025,163.09542,121.70336,172.12592,144.05278,0.0,0.06268,0.26579,0.20630,0.18137,0.00068,0.00160,0.00354,0.27760,0.00010,0.02090,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94518,6.96089,6.95376,6.95188,6.93305,6.93652,6.93922,6.96110,6.93060,6.94510,24.92913,25.41567,25.37436,25.33120,24.28115,24.42829,24.48082,25.42290,24.12160,24.91220,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94518,6.96089,6.95376,6.95188,6.93305,6.93652,6.93922,6.96110,6.93060,6.94510,6.94622,7.75048,7.49363,7.41888,6.27713,6.38530,6.43474,7.80580,6.26280,7.10060 -8.19989,6.94629,7.20944,7.13169,7.10040,6.70921,6.76173,6.79854,7.22620,6.70310,6.95780,2.29754,2.96939,2.81483,2.76026,1.85537,1.88190,1.91844,2.97910,1.84170,2.32020,4.64874,5.22735,5.08518,5.03012,4.01197,4.13332,4.21520,5.23760,3.96800,4.64500,143.98408,144.23662,144.16450,144.10883,143.65979,143.80729,143.84598,143.65545,143.98640,143.88461,159.09547,156.16435,155.25635,129.02416,133.44667,134.80613,159.67298,128.10986,140.25245,6.87899,7.16765,7.12199,7.07868,6.35204,6.52522,6.70098,7.17239,6.27939,6.42280,2.61022,2.69879,2.68218,2.65309,2.53479,2.55237,2.56854,2.70190,2.50439,2.60959,4.26877,4.58213,4.53190,4.46232,3.73610,3.89130,4.05123,4.61120,3.63069,4.30540,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.73292,2.19081,2.12191,1.93568,1.63058,1.64738,1.65410,2.19850,1.62690,1.68300,0.0,0.0,0.0,0.0,0.0,143.96172,121.99957,126.58195,128.36344,170.43469,166.24468,163.03532,121.70336,172.12592,143.57089,0.0,0.06178,0.26579,0.20630,0.18329,0.00072,0.00221,0.00390,0.27760,0.00010,0.01960,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94521,6.96089,6.95375,6.95188,6.93305,6.93652,6.93920,6.96110,6.93060,6.94510,24.92468,25.41567,25.36073,25.33032,24.28115,24.42829,24.48082,25.42290,24.12160,24.91670,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94521,6.96089,6.95375,6.95188,6.93305,6.93652,6.93920,6.96110,6.93060,6.94510,6.95001,7.75048,7.49363,7.41806,6.28553,6.40351,6.44096,7.80580,6.26280,7.13000 -8.29989,6.94442,7.20944,7.13169,7.10364,6.70921,6.76173,6.79354,7.22620,6.70310,7.09109,2.29574,2.96939,2.81433,2.75214,1.85415,1.87746,1.91652,2.97910,1.84170,2.32020,4.64868,5.22735,5.07975,5.02800,4.01197,4.13370,4.23838,5.23760,3.96800,4.64770,143.98379,144.23662,144.15806,144.10841,143.65979,143.80171,143.84598,143.65545,143.98640,143.86723,159.46948,156.56827,155.25635,129.02416,133.44667,134.97936,159.67298,128.10986,140.21312,6.87721,7.16765,7.12199,7.07820,6.35204,6.63154,6.70098,7.17239,6.27939,6.72369,2.61113,2.69879,2.68218,2.65444,2.53479,2.55081,2.56400,2.70190,2.50439,2.61149,4.26607,4.58213,4.53190,4.42412,3.73610,4.00053,4.06684,4.61120,3.63069,4.30109,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.73166,2.19081,2.05623,1.89752,1.63058,1.64738,1.65322,2.19850,1.62690,1.68570,0.0,0.0,0.0,0.0,0.0,144.00036,121.99957,126.67720,128.53239,170.47008,166.35724,162.47217,121.70336,172.12592,143.51526,0.0,0.06457,0.26579,0.20630,0.18329,0.00072,0.00251,0.00431,0.27760,0.00010,0.02110,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.96089,6.95402,6.95188,6.93305,6.93683,6.93922,6.96110,6.93060,6.94510,24.92407,25.40116,25.36073,25.32019,24.28115,24.42829,24.49106,25.40569,24.12160,24.91319,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.96089,6.95402,6.95188,6.93305,6.93683,6.93922,6.96110,6.93060,6.94510,6.95085,7.75048,7.49363,7.40854,6.27079,6.38698,6.44096,7.80580,6.26280,7.13200 -8.39989,6.94521,7.20904,7.13133,7.10732,6.71896,6.76929,6.79416,7.22620,6.70310,6.92130,2.28938,2.96916,2.80675,2.74837,1.85077,1.87589,1.90419,2.97910,1.84170,2.31840,4.65582,5.22710,5.08493,5.02789,4.04577,4.14489,4.24666,5.23760,3.96800,4.63079,143.98346,144.23470,144.13344,144.10820,143.65989,143.81660,143.84825,143.65545,143.98848,143.93846,159.46755,156.15935,155.04116,129.82411,134.44844,135.19999,159.67298,128.10986,140.22295,6.87977,7.16754,7.12185,7.08392,6.42555,6.63256,6.70282,7.17239,6.30080,6.78710,2.60979,2.69871,2.68121,2.65431,2.53480,2.55087,2.56161,2.70190,2.50439,2.61080,4.26998,4.58144,4.53250,4.43690,3.78375,4.00131,4.06775,4.61120,3.70200,4.30109,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.72959,2.17975,2.05577,1.89708,1.63058,1.64747,1.65273,2.19850,1.62690,1.68300,0.0,0.0,0.0,0.0,0.0,143.98411,122.00664,126.71557,128.59635,169.59075,166.09129,162.57889,121.70336,172.12592,143.90145,0.0,0.06428,0.26550,0.20384,0.18134,0.00073,0.00255,0.00440,0.27760,0.00010,0.02210,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94524,6.96088,6.95330,6.95177,6.93314,6.93801,6.93923,6.96110,6.93060,6.94500,24.92798,25.40105,25.36002,25.31685,24.29629,24.43421,24.49946,25.40569,24.12160,24.90730,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94524,6.96088,6.95330,6.95177,6.93314,6.93801,6.93923,6.96110,6.93060,6.94500,6.94741,7.70272,7.43779,7.39645,6.27086,6.40371,6.44990,7.80580,6.26280,7.13149 -8.49989,6.94517,7.17017,7.12393,7.10738,6.71862,6.76926,6.79314,7.18630,6.70310,7.14789,2.28847,2.96939,2.80697,2.74582,1.84363,1.87625,1.91982,2.97910,1.83150,2.31530,4.65670,5.25059,5.10565,5.02800,4.04574,4.14416,4.23866,5.26000,3.96800,4.64780,143.98468,144.23487,144.13375,144.11049,143.65979,143.81660,143.84598,143.65545,143.98848,144.01245,158.97336,156.06053,154.93114,129.71867,134.47565,135.28980,159.55070,128.10986,140.42971,6.88077,7.16765,7.12199,7.08602,6.42548,6.63154,6.70098,7.17239,6.30080,7.08530,2.60963,2.69349,2.68218,2.65444,2.53479,2.55215,2.56154,2.69450,2.50439,2.61080,4.27113,4.58213,4.53287,4.47196,3.78374,4.00053,4.05245,4.61120,3.70200,4.30109,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.72731,2.18018,2.05692,1.89752,1.63058,1.64724,1.65155,2.19850,1.62690,1.67770,0.0,0.0,0.0,0.0,0.0,143.98480,121.65464,126.38038,128.63688,169.79727,166.10164,162.37772,121.37248,172.42865,143.61419,0.0,0.06382,0.24675,0.19841,0.18010,0.00072,0.00300,0.00525,0.24880,0.00010,0.02210,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94518,6.96089,6.95330,6.95188,6.93313,6.93800,6.93912,6.96110,6.93060,6.94500,24.93049,25.41532,25.36018,25.31690,24.29564,24.43371,24.50664,25.42229,24.12160,24.92229,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94518,6.96089,6.95330,6.95188,6.93313,6.93800,6.93912,6.96110,6.93060,6.94500,6.94384,7.70899,7.43629,7.39154,6.29036,6.40777,6.45448,7.80580,6.26760,7.12100 -8.59989,6.94540,7.25775,7.12520,7.10606,6.70360,6.76926,6.79314,7.30949,6.53580,6.93880,2.28637,2.96939,2.79897,2.73817,1.83578,1.87480,1.91632,2.97910,1.81690,2.31840,4.65902,5.25059,5.10565,5.03812,4.00008,4.14416,4.23866,5.26000,3.85080,4.65030,143.98474,144.24307,144.13375,144.11049,143.65979,143.81660,143.84763,143.65545,143.98640,143.98652,159.46948,156.16435,154.98349,129.48024,133.61392,135.03404,161.29812,128.10986,140.22295,6.88088,7.24304,7.12130,7.08438,6.35204,6.63154,6.70098,7.29420,6.12520,6.95710,2.61093,2.69842,2.68266,2.65737,2.53479,2.55215,2.56154,2.70300,2.50439,2.61230,4.26994,4.63979,4.53287,4.47196,3.73610,4.00053,4.05245,4.66049,3.43570,4.31049,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.72651,2.18018,2.05692,1.89752,1.63058,1.64724,1.65155,2.19850,1.62690,1.67880,0.0,0.0,0.0,0.0,0.0,143.97999,121.65464,126.50829,128.59586,171.35399,166.14165,162.47006,121.37248,176.43841,143.49878,0.0,0.06580,0.39373,0.20630,0.18317,0.00072,0.00300,0.00570,0.41210,0.00010,0.02370,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94518,6.96089,6.95330,6.95180,6.93274,6.93800,6.93912,6.96110,6.93060,6.94510,24.93082,25.42053,25.37427,25.32104,24.20861,24.43371,24.50664,25.42229,24.12160,24.91670,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94518,6.96089,6.95330,6.95180,6.93274,6.93800,6.93912,6.96110,6.93060,6.94510,6.94509,7.72318,7.48425,7.40554,6.27079,6.40351,6.45230,7.80580,6.19970,7.13149 -8.69989,6.94627,7.25775,7.13169,7.10680,6.71792,6.77034,6.79850,7.30949,6.53580,6.97280,2.26999,2.86301,2.75227,2.70364,1.82604,1.86437,1.89710,2.86810,1.81690,2.31840,4.67627,5.27409,5.10565,5.04893,4.04574,4.18271,4.26161,5.28430,3.85080,4.66870,143.98415,144.24307,144.13375,144.11090,143.65979,143.80729,143.84598,143.65545,143.98640,144.12895,159.46948,156.06053,154.98349,131.66723,134.25810,135.03404,161.29812,131.42158,140.64697,6.88983,7.24304,7.13004,7.08438,6.35472,6.66586,6.72421,7.29420,6.12520,6.98640,2.61054,2.69842,2.68266,2.65498,2.53479,2.55215,2.56154,2.70300,2.50439,2.61160,4.27929,4.63979,4.53287,4.46477,3.73665,4.02518,4.07899,4.66049,3.43570,4.31590,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.71735,2.14377,2.02233,1.86300,1.63058,1.64724,1.65124,2.15490,1.62690,1.67630,0.0,0.0,0.0,0.0,0.0,143.96214,122.89372,127.26014,128.98931,170.30576,165.36907,162.37140,122.66326,176.43841,143.12089,0.0,0.06413,0.39373,0.20630,0.18422,0.00174,0.00313,0.00552,0.41210,0.00040,0.02370,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94520,6.96089,6.95375,6.95188,6.93274,6.93800,6.93910,6.96110,6.93060,6.94510,24.94949,25.42885,25.38554,25.32855,24.34486,24.45149,24.54606,25.43360,24.16540,24.91730,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94520,6.96089,6.95375,6.95188,6.93274,6.93800,6.93910,6.96110,6.93060,6.94510,6.93823,7.59490,7.44834,7.40554,6.27079,6.40777,6.45230,7.60910,6.19970,7.11000 -8.79989,6.94508,7.24173,7.12515,7.10529,6.71827,6.77061,6.79381,7.30949,6.53580,6.91910,2.26765,2.86289,2.75384,2.71656,1.82614,1.85784,1.88986,2.86810,1.81690,2.30180,4.67742,5.27385,5.12206,5.05456,4.06895,4.18717,4.24735,5.28430,3.85080,4.64869,143.98329,144.22343,144.13344,144.10613,143.68707,143.80781,143.84825,143.66577,143.98640,144.06012,159.46755,155.92730,154.91938,131.67309,134.26855,135.04534,161.29812,131.42158,140.73208,6.88448,7.23696,7.12024,7.07695,6.42980,6.65210,6.72153,7.29420,6.12520,6.90710,2.61205,2.69831,2.68255,2.65497,2.53532,2.55452,2.56246,2.70300,2.53450,2.61280,4.27242,4.60954,4.53250,4.46347,3.79030,4.02352,4.06775,4.66049,3.43570,4.31049,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.71941,2.15305,2.03536,1.87953,1.62814,1.64117,1.64766,2.15490,1.62690,1.67630,0.0,0.0,0.0,0.0,0.0,143.98675,122.89922,126.96937,128.68158,169.63255,165.42556,162.94022,122.66326,176.43841,143.87454,0.0,0.06414,0.39328,0.20426,0.18283,0.00196,0.00310,0.00526,0.41210,0.00170,0.02370,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94525,6.95956,6.95372,6.95177,6.93368,6.93801,6.93933,6.96060,6.93270,6.94510,24.94997,25.42874,25.39369,25.33537,24.35141,24.48310,24.53348,25.43360,24.16540,24.92229,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94525,6.95956,6.95372,6.95177,6.93368,6.93801,6.93933,6.96060,6.93270,6.94510,6.94154,7.59456,7.44776,7.40492,6.27086,6.41324,6.45497,7.60910,6.19970,7.10570 -8.89989,6.94549,7.24173,7.12374,7.10117,6.72021,6.77538,6.79850,7.30949,6.53580,6.96710,2.26362,2.86289,2.75665,2.72293,1.81913,1.85784,1.89715,2.86810,1.80780,2.29110,4.68187,5.27385,5.15444,5.06103,4.06895,4.18717,4.24735,5.28430,3.85080,4.66170,143.98272,144.22343,144.13375,144.11090,143.68707,143.80037,143.84556,143.66577,143.98640,144.05027,158.92078,155.84225,154.83639,131.67309,134.03532,135.06559,161.29812,131.42158,140.64697,6.88401,7.23696,7.10728,7.07695,6.42980,6.59057,6.71693,7.29420,6.12520,6.97460,2.61278,2.69831,2.68255,2.65497,2.53532,2.55452,2.56175,2.70300,2.53450,2.61350,4.27122,4.60954,4.53080,4.46347,3.79030,3.95786,4.05543,4.66049,3.43570,4.31049,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.71796,2.15305,2.03276,1.87953,1.62667,1.63036,1.64522,2.15490,1.62460,1.67710,0.0,0.0,0.0,0.0,0.0,143.97818,122.89922,126.40467,128.46931,169.83438,165.42556,162.74690,122.66326,176.72215,143.82694,0.0,0.06285,0.39328,0.19803,0.17842,0.00141,0.00252,0.00374,0.41210,0.00100,0.02370,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94527,6.95956,6.95408,6.95190,6.93368,6.93800,6.93910,6.96060,6.93270,6.94510,24.95409,25.43278,25.39455,25.33609,24.35141,24.48310,24.53348,25.43360,24.16540,24.93530,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94527,6.95956,6.95408,6.95190,6.93368,6.93800,6.93910,6.96060,6.93270,6.94510,6.94202,7.59456,7.46072,7.40381,6.29244,6.41674,6.45842,7.60910,6.19970,7.11000 -8.99989,6.94495,7.30532,7.12515,7.10529,6.68531,6.77061,6.79780,7.30949,6.53580,6.95640,2.26430,2.90839,2.75665,2.72041,1.81913,1.86440,1.89715,2.93880,1.80780,2.28980,4.68064,5.27385,5.13627,5.06103,3.93404,4.18717,4.26869,5.28430,3.73310,4.68380,143.98371,144.28902,144.13344,144.10966,143.68530,143.80037,143.84267,143.66577,143.98640,144.06556,158.93056,156.13850,154.97989,129.61752,133.34666,135.41768,161.29812,128.28900,140.64697,6.88163,7.23180,7.10728,7.07242,6.27541,6.55306,6.71812,7.29420,6.12520,6.96110,2.61395,2.69831,2.68255,2.65528,2.54467,2.55549,2.56406,2.70300,2.53450,2.61600,4.26768,4.60954,4.52416,4.44485,3.63077,3.90822,4.05543,4.66049,3.43570,4.31590,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.71879,2.16704,2.08435,1.89471,1.61860,1.62848,1.63873,2.17620,1.61590,1.67450,0.0,0.0,0.0,0.0,0.0,143.98942,122.21577,126.69574,128.51091,173.81679,165.24610,162.18364,121.60863,180.47609,143.39795,0.0,0.06499,0.39328,0.21303,0.18348,0.00114,0.00222,0.00316,0.41210,0.00100,0.01950,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94523,6.95965,6.95408,6.95204,6.93053,6.93801,6.93916,6.96060,6.92530,6.94510,24.95091,25.43278,25.38485,25.33699,24.23764,24.48310,24.53348,25.43360,24.00510,24.93130,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94523,6.95965,6.95408,6.95204,6.93053,6.93801,6.93916,6.96060,6.92530,6.94510,6.94128,7.71500,7.49925,7.38456,6.29205,6.40457,6.45244,7.79490,6.19970,7.11000 -9.09989,6.94516,7.30532,7.12374,7.10333,6.65092,6.77538,6.79288,7.30949,6.53580,6.94150,2.26030,2.93574,2.75216,2.70131,1.81913,1.86440,1.88962,2.93880,1.80780,2.28590,4.68486,5.27385,5.15444,5.06659,3.90205,4.18229,4.25617,5.28430,3.73310,4.66690,143.98379,144.36580,144.13375,144.10966,143.70295,143.80006,143.83708,143.69674,143.98433,144.04165,159.63732,156.13850,154.97989,128.67373,133.08287,134.90124,161.29812,128.28900,140.57579,6.87758,7.25747,7.10822,7.07242,6.22329,6.47034,6.67942,7.29420,6.12520,6.95659,2.61299,2.69831,2.67824,2.65300,2.54988,2.55549,2.56406,2.70300,2.54079,2.61350,4.26459,4.65069,4.52416,4.44485,3.58145,3.82110,4.04673,4.66049,3.43570,4.32190,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.71849,2.18794,2.10708,1.90365,1.60900,1.62213,1.63030,2.19680,1.60310,1.67070,0.0,0.0,0.0,0.0,0.0,143.98501,121.80864,126.47645,128.73492,174.78875,165.37959,162.71301,121.60863,180.47609,143.82694,0.0,0.06360,0.39328,0.22151,0.17842,0.00114,0.00220,0.00310,0.41210,0.00100,0.01900,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.95879,6.95410,6.95230,6.92684,6.93800,6.93916,6.95910,6.91920,6.94520,24.95657,25.43278,25.38489,25.35954,24.22517,24.48556,24.54265,25.43360,24.00510,24.93459,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.95879,6.95410,6.95230,6.92684,6.93800,6.93916,6.95910,6.91920,6.94520,6.94243,7.77159,7.51411,7.41283,6.26419,6.40457,6.45244,7.79490,6.19970,7.11359 -9.19989,6.94640,7.30532,7.12395,7.10333,6.65092,6.77641,6.80080,7.30949,6.53580,6.78830,2.25623,2.93574,2.75216,2.70545,1.81913,1.86440,1.88526,2.93880,1.80780,2.28590,4.69017,5.27385,5.15444,5.06659,3.90205,4.18229,4.24226,5.28430,3.73310,4.66690,143.98378,144.36580,144.13375,144.10613,143.70295,143.80006,143.84267,143.69674,143.98433,144.02225,159.63732,156.16118,154.97989,128.67373,133.08287,134.93328,161.29812,128.28900,140.64697,6.87170,7.25747,7.10843,7.08009,6.22329,6.44131,6.66635,7.29420,6.12520,6.77899,2.61298,2.69831,2.67760,2.65351,2.54988,2.55564,2.56406,2.70300,2.54079,2.61330,4.25872,4.65069,4.52416,4.46585,3.58145,3.80628,4.03718,4.66049,3.43570,4.31879,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.72107,2.18794,2.11871,1.98175,1.60900,1.62031,1.62739,2.19680,1.60310,1.66640,0.0,0.0,0.0,0.0,0.0,143.95927,121.80864,126.47645,128.66634,174.78875,165.37959,163.19789,121.60863,180.47609,143.82694,0.0,0.06239,0.39328,0.22151,0.17492,0.00082,0.00182,0.00292,0.41210,0.00040,0.01910,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.95879,6.95410,6.95204,6.92684,6.93800,6.93933,6.95910,6.91920,6.94520,24.96261,25.43278,25.38489,25.36218,24.22517,24.48556,24.54265,25.43360,24.00510,24.93459,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.95879,6.95410,6.95204,6.92684,6.93800,6.93933,6.95910,6.91920,6.94520,6.94337,7.77159,7.51411,7.41107,6.26419,6.40364,6.45244,7.79490,6.19970,7.11000 -9.29989,6.94520,7.30532,7.13552,7.10333,6.65092,6.77641,6.79288,7.30949,6.53580,6.95520,2.25252,2.93574,2.75072,2.69466,1.81610,1.85784,1.88526,2.93880,1.80780,2.28390,4.69268,5.27587,5.17132,5.06980,3.90205,4.18717,4.24226,5.28430,3.73310,4.66690,143.98378,144.36580,144.13344,144.10197,143.70295,143.80037,143.83708,143.69674,143.98433,143.98240,159.20892,155.84225,154.77983,128.67373,132.66347,134.87013,161.29812,128.28900,140.64697,6.86822,7.25747,7.11344,7.08058,6.22329,6.44031,6.55784,7.29420,6.12520,6.92260,2.61680,2.73852,2.68568,2.65632,2.55417,2.56219,2.56679,2.75530,2.54079,2.61590,4.25142,4.65069,4.53080,4.47479,3.58145,3.80339,3.91494,4.66049,3.43570,4.31530,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.72152,2.18794,2.12015,2.03962,1.60384,1.62021,1.62548,2.19680,1.60310,1.66370,0.0,0.0,0.0,0.0,0.0,143.98420,121.77866,126.22995,128.79195,174.88149,165.42556,163.19789,121.60863,180.47609,143.86833,0.0,0.06441,0.39328,0.22151,0.18716,0.00082,0.00182,0.00292,0.41210,0.00040,0.01910,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.95879,6.95408,6.95230,6.92684,6.93801,6.93953,6.95910,6.91920,6.94520,24.96630,25.43278,25.39254,25.36607,24.22517,24.48556,24.54265,25.43360,24.00510,24.94470,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.95879,6.95408,6.95230,6.92684,6.93801,6.93953,6.95910,6.91920,6.94520,6.94529,7.77159,7.53786,7.41454,6.28105,6.41674,6.46079,7.79490,6.19970,7.11000 -9.39989,6.94499,7.30532,7.14481,7.10333,6.65092,6.77158,6.79288,7.30949,6.53580,6.92769,2.25221,2.93574,2.76050,2.71280,1.81610,1.85203,1.88404,2.93880,1.80780,2.28390,4.69278,5.27587,5.16847,5.08092,3.90205,4.18717,4.25514,5.28430,3.73310,4.67930,143.98414,144.36580,144.13375,144.10052,143.70295,143.78424,143.82218,143.69674,143.98226,143.98046,159.20892,156.22339,155.10248,128.67373,132.66347,134.59493,161.29812,128.28900,140.57579,6.86608,7.25747,7.11327,7.04332,6.21461,6.44031,6.59753,7.29420,6.12520,6.94600,2.62425,2.74020,2.70226,2.68556,2.55425,2.56335,2.56998,2.75530,2.54079,2.62590,4.24183,4.65069,4.52416,4.44485,3.54012,3.80339,3.94810,4.66049,3.43570,4.29470,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.72304,2.18794,2.12360,2.05332,1.60384,1.62021,1.62548,2.19680,1.60310,1.66540,0.0,0.0,0.0,0.0,0.0,143.98859,121.77866,126.11970,128.30843,174.88149,165.58457,162.88793,121.60863,180.47609,143.61213,0.0,0.06496,0.39328,0.22151,0.19066,0.00082,0.00182,0.00290,0.41210,0.00040,0.02020,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94520,6.95879,6.95486,6.95303,6.92684,6.93800,6.93960,6.95910,6.91920,6.94530,24.96751,25.43278,25.39598,25.36926,24.22517,24.48386,24.53243,25.43360,24.00510,24.94470,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94520,6.95879,6.95486,6.95303,6.92684,6.93800,6.93960,6.95910,6.91920,6.94530,6.94538,7.77159,7.53786,7.42970,6.28105,6.40109,6.44735,7.79490,6.19970,7.11359 -9.49989,6.94527,7.30542,7.14524,7.10168,6.65055,6.77346,6.79914,7.30949,6.53580,6.96690,2.25165,2.93581,2.76070,2.72424,1.81103,1.83861,1.88332,2.93880,1.79950,2.28810,4.69362,5.29416,5.17248,5.08914,3.90086,4.18685,4.24207,5.30130,3.73310,4.67930,143.98468,144.36655,144.13354,144.10052,143.70281,143.78331,143.82032,143.69674,143.98433,144.00709,159.22375,156.56459,155.49971,128.66475,133.07410,134.47330,161.29812,128.28900,140.57579,6.85975,7.25833,7.12537,7.04658,6.21332,6.43827,6.49436,7.29420,6.12520,6.92370,2.62607,2.74055,2.69788,2.68446,2.55425,2.56384,2.57132,2.75530,2.54079,2.62810,4.23368,4.65092,4.49711,4.44800,3.53953,3.78738,3.86656,4.66049,3.43570,4.29349,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.72599,2.18814,2.12834,2.08068,1.60384,1.62021,1.62542,2.19680,1.60310,1.66270,0.0,0.0,0.0,0.0,0.0,143.98272,121.50700,126.05269,127.98558,175.07315,165.96243,163.25464,121.35775,180.74684,143.52556,0.0,0.06463,0.39373,0.22195,0.18863,0.00082,0.00181,0.00290,0.41210,0.00040,0.01910,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94518,6.95880,6.95490,6.95312,6.92681,6.93801,6.93960,6.95910,6.91920,6.94520,24.96873,25.45195,25.41048,25.37163,24.22378,24.48351,24.52554,25.46300,24.00510,24.94470,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94518,6.95880,6.95490,6.95312,6.92681,6.93801,6.93960,6.95910,6.91920,6.94520,6.94410,7.77213,7.51461,7.43642,6.28047,6.38714,6.43088,7.79490,6.19970,7.11359 -9.59989,6.94546,7.26842,7.14461,7.09726,6.69542,6.77346,6.80626,7.29980,6.63509,6.94679,2.25273,2.93581,2.76335,2.72688,1.81103,1.85286,1.88396,2.93880,1.79950,2.28810,4.69273,5.29416,5.15846,5.07010,3.98436,4.18685,4.22754,5.30130,3.73310,4.67930,143.98386,144.39544,144.15993,144.10052,143.65244,143.75954,143.81660,143.62038,143.98433,143.98902,158.07377,156.22412,155.10368,128.66475,133.32551,134.86976,159.84910,128.28900,141.06759,6.85554,7.18372,7.11392,7.04976,6.29628,6.43116,6.48046,7.20880,6.15940,6.93670,2.62906,2.74055,2.70507,2.68846,2.55425,2.56514,2.57628,2.75530,2.54079,2.63020,4.22647,4.60544,4.49525,4.44800,3.61406,3.77459,3.84762,4.63770,3.51480,4.28950,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.72665,2.18814,2.14275,2.09494,1.60384,1.62021,1.62474,2.19680,1.60310,1.65640,0.0,0.0,0.0,0.0,0.0,143.97890,121.50700,126.23377,128.25478,172.55070,165.57086,163.62595,121.35775,180.74684,143.52556,0.0,0.06077,0.34282,0.21175,0.18863,0.00082,0.00181,0.00290,0.35590,0.00040,0.01900,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.96124,6.95605,6.95330,6.92542,6.93674,6.93960,6.96280,6.91920,6.94520,24.96986,25.45195,25.39583,25.36944,24.30536,24.48351,24.52518,25.46300,24.00510,24.94570,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.96124,6.95605,6.95330,6.92542,6.93674,6.93960,6.96280,6.91920,6.94520,6.94497,7.77213,7.50044,7.41455,6.32615,6.40106,6.44730,7.79490,6.25590,7.08879 -9.69989,6.94630,7.26842,7.14461,7.09726,6.66250,6.77346,6.80892,7.29980,6.63509,6.96519,2.25257,2.93581,2.76999,2.72688,1.81103,1.86790,1.88396,2.93880,1.79950,2.28810,4.69372,5.28592,5.14280,5.08622,3.92000,4.16244,4.22754,5.30130,3.73310,4.69090,143.98389,144.39544,144.18633,144.11423,143.65244,143.74631,143.80750,143.62038,143.98433,143.95826,159.22375,156.56459,155.07241,128.66475,133.23633,134.86976,161.78350,128.28900,140.57579,6.85267,7.19506,7.11392,7.04136,6.21332,6.42880,6.48046,7.20880,6.09980,6.89930,2.63385,2.74055,2.70658,2.69448,2.55425,2.56514,2.57628,2.75530,2.54079,2.63290,4.21881,4.60544,4.49525,4.42152,3.53953,3.76781,3.84762,4.63770,3.42680,4.28659,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.72724,2.18814,2.14808,2.09494,1.60384,1.62021,1.62334,2.19680,1.60310,1.65530,0.0,0.0,0.0,0.0,0.0,143.96143,121.62866,126.37767,127.99017,174.48846,165.82812,163.62595,121.35775,180.74684,143.28700,0.0,0.06300,0.34282,0.22195,0.18863,0.00082,0.00201,0.00304,0.35590,0.00040,0.02090,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.96124,6.95670,6.95373,6.92542,6.93547,6.93894,6.96280,6.91920,6.94520,24.96830,25.45195,25.39409,25.36750,24.24651,24.46624,24.52518,25.46300,24.00510,24.95150,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.96124,6.95670,6.95373,6.92542,6.93547,6.93894,6.96280,6.91920,6.94520,6.94645,7.77213,7.50546,7.41455,6.28047,6.38714,6.44859,7.79490,6.18110,7.11359 -9.79989,6.94393,7.26842,7.14603,7.09935,6.66250,6.77123,6.79914,7.29980,6.63509,7.14610,2.25316,2.93581,2.77178,2.72688,1.81103,1.86790,1.88546,2.93880,1.79950,2.28600,4.69076,5.28592,5.14280,5.08622,3.92000,4.15674,4.24207,5.30130,3.73310,4.67930,143.98453,144.49468,144.25975,144.13334,143.38233,143.71491,143.76491,143.27879,143.98226,143.98445,159.41884,157.33586,155.10176,128.66475,133.23633,134.81304,161.78350,128.28900,140.69248,6.85063,7.19506,7.11392,7.03038,6.21332,6.43134,6.49436,7.20880,6.09980,6.98460,2.64071,2.74055,2.71218,2.69938,2.55425,2.56565,2.58397,2.75530,2.54079,2.63949,4.20992,4.60544,4.49525,4.39766,3.53953,3.76270,3.86656,4.63770,3.42680,4.26540,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.72482,2.18814,2.13519,2.08068,1.60384,1.61545,1.62022,2.19680,1.60310,1.65410,0.0,0.0,0.0,0.0,0.0,144.01061,121.62866,126.34909,127.99017,174.48846,165.98502,163.19762,121.35775,180.74684,143.56883,0.0,0.06579,0.34282,0.22195,0.19198,0.00082,0.00221,0.00431,0.35590,0.00040,0.02250,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94519,6.97436,6.95822,6.95580,6.92067,6.93194,6.93802,6.97940,6.90880,6.94530,24.96651,25.45195,25.39409,25.36750,24.24651,24.45656,24.52008,25.46300,24.00510,24.95150,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94519,6.97436,6.95822,6.95580,6.92067,6.93194,6.93802,6.97940,6.90880,6.94530,6.94519,7.77213,7.50546,7.41768,6.27278,6.35583,6.44738,7.79490,6.18110,7.10770 -9.89989,6.94514,7.26842,7.14826,7.10284,6.66250,6.74669,6.78818,7.29980,6.63509,6.93780,2.25595,2.93581,2.77178,2.72688,1.81940,1.86790,1.88546,2.93880,1.79950,2.28810,4.68919,5.28592,5.14233,5.08622,3.92000,4.15674,4.22642,5.30130,3.73310,4.68489,143.98475,144.49468,144.25975,144.13167,143.38233,143.71491,143.77649,143.27879,143.98433,143.99960,159.41884,157.57585,155.67788,128.66475,133.32551,134.81304,161.78350,128.28900,141.06759,6.85347,7.19506,7.11392,7.03848,6.21332,6.43134,6.52874,7.20880,6.09980,6.78590,2.64906,2.74484,2.71608,2.70781,2.55800,2.56921,2.59168,2.75530,2.54079,2.64820,4.20440,4.60544,4.49363,4.37976,3.53953,3.76270,3.89692,4.63770,3.42680,4.26340,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.72145,2.18814,2.13519,2.07236,1.60384,1.61545,1.61929,2.19680,1.60310,1.65340,0.0,0.0,0.0,0.0,0.0,143.98547,121.62866,126.35659,127.99017,174.23393,165.98502,163.61577,121.35775,180.74684,143.41029,0.0,0.06808,0.34282,0.22195,0.20322,0.00086,0.00290,0.00550,0.35590,0.00040,0.02340,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94517,6.97436,6.95822,6.95523,6.92067,6.93194,6.93810,6.97940,6.90880,6.94520,24.96354,25.45195,25.39409,25.36750,24.24651,24.45656,24.52008,25.46300,24.00510,24.94470,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94517,6.97436,6.95822,6.95523,6.92067,6.93194,6.93810,6.97940,6.90880,6.94520,6.94446,7.77213,7.50044,7.41768,6.27278,6.34614,6.42351,7.79490,6.18110,7.08879 -9.99989,6.94501,7.21149,7.14461,7.09942,6.67955,6.76371,6.78818,7.22509,6.63509,6.92900,2.25790,2.88928,2.77178,2.72688,1.81646,1.85286,1.88482,2.93170,1.79950,2.29689,4.68710,5.28592,5.14301,5.09090,3.98436,4.15674,4.22196,5.30130,3.88380,4.67930,143.98240,144.49468,144.25975,144.13167,143.38233,143.71326,143.76367,143.27879,143.98226,143.87254,159.41884,157.31136,155.10176,129.90694,133.78803,134.91307,161.78350,129.18728,140.71030,6.85074,7.19506,7.12238,7.04187,6.29628,6.43134,6.52874,7.20880,6.09980,6.42860,2.65817,2.74698,2.72513,2.71404,2.56613,2.58987,2.60164,2.75530,2.56270,2.65940,4.19256,4.60544,4.49363,4.37976,3.61406,3.76270,3.89436,4.63770,3.42680,4.24880,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.72168,2.18495,2.12834,2.06883,1.60339,1.61355,1.61911,2.19680,1.59450,1.65530,0.0,0.0,0.0,0.0,0.0,143.98818,122.32104,126.34558,127.91355,172.38912,166.40042,163.75241,121.46240,175.95411,143.34451,0.0,0.06639,0.30727,0.20900,0.19070,0.00052,0.00292,0.00552,0.32400,0.00040,0.02530,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94529,6.97436,6.95830,6.95586,6.92067,6.93194,6.93810,6.97940,6.90880,6.94530,24.96274,25.45762,25.40979,25.36750,24.30536,24.45656,24.52518,25.46300,24.20460,24.94330,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94529,6.97436,6.95830,6.95586,6.92067,6.93194,6.93810,6.97940,6.90880,6.94530,6.95059,7.69781,7.47451,7.41218,6.27278,6.35682,6.44738,7.74070,6.18110,7.10680 -10.09989,6.94558,7.18379,7.13335,7.09588,6.71476,6.77123,6.80762,7.19270,6.65570,6.65570,2.26358,2.84763,2.77178,2.73110,1.81646,1.85286,1.88912,2.85990,1.79950,2.30390,4.68200,5.28592,5.13981,5.08558,3.99120,4.16345,4.22642,5.30130,3.88380,4.67860,143.98389,144.57101,144.33117,144.17116,143.38233,143.68538,143.74796,143.27879,143.98226,143.81861,158.68874,157.07118,155.36780,130.94644,133.78803,135.09022,161.78350,130.91404,140.49679,6.84940,7.16417,7.10606,7.03848,6.23397,6.45671,6.61617,7.17609,6.09980,6.09980,2.66254,2.74698,2.72513,2.71404,2.57319,2.59605,2.60890,2.75530,2.56700,2.66140,4.18686,4.55229,4.49064,4.36330,3.54609,3.76270,3.92396,4.56090,3.42680,4.24820,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.72134,2.20763,2.12834,2.07371,1.59061,1.59931,1.61554,2.23590,1.58540,1.65530,0.0,0.0,0.0,0.0,0.0,143.97636,122.94733,126.39684,127.93155,172.18597,166.21483,163.51785,122.53100,175.95411,143.21518,0.0,0.06201,0.26880,0.20695,0.18328,0.00052,0.00345,0.00552,0.28320,0.00040,0.02490,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.97436,6.95965,6.95662,6.91701,6.92851,6.93620,6.97940,6.90880,6.94530,24.95922,25.45762,25.40979,25.36586,24.26592,24.45656,24.52008,25.46300,24.20460,24.94330,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.97436,6.95965,6.95662,6.91701,6.92851,6.93620,6.97940,6.90880,6.94530,6.95320,7.63670,7.47451,7.40246,6.30164,6.36654,6.43634,7.63860,6.18110,7.11760 -10.19990,6.94662,7.20801,7.14603,7.09750,6.69301,6.76371,6.81264,7.21910,6.65570,6.93430,2.26427,2.84763,2.77178,2.73142,1.81646,1.85286,1.88594,2.85990,1.79950,2.30390,4.68234,5.28592,5.13981,5.08642,3.99120,4.16345,4.22937,5.30130,3.88380,4.66279,143.98407,144.57101,144.33742,144.17323,143.38233,143.67692,143.74631,143.27879,143.97604,143.97267,159.28335,157.38340,155.74480,130.94644,133.78803,135.16216,161.78350,130.91404,140.49679,6.85241,7.18367,7.12238,7.03848,6.23397,6.45671,6.61617,7.18460,6.09980,6.92680,2.66542,2.74698,2.72513,2.71404,2.58420,2.60162,2.61412,2.75530,2.57319,2.66590,4.18699,4.57168,4.49064,4.36330,3.54609,3.76279,3.93203,4.57950,3.42680,4.24820,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.71606,2.20763,2.12376,2.01983,1.58906,1.59450,1.60538,2.23590,1.58540,1.65120,0.0,0.0,0.0,0.0,0.0,143.95489,122.94733,126.39684,127.91256,172.18597,166.21483,163.52374,122.53100,175.95411,143.53998,0.0,0.06433,0.28246,0.20900,0.19043,0.00172,0.00450,0.00639,0.28320,0.00040,0.02640,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94521,6.97436,6.96006,6.95670,6.91701,6.92821,6.93610,6.97940,6.90880,6.94560,24.95732,25.45762,25.40979,25.36750,24.26592,24.45689,24.52008,25.46300,24.20460,24.93769,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94521,6.97436,6.96006,6.95670,6.91701,6.92821,6.93610,6.97940,6.90880,6.94560,6.94576,7.63670,7.47451,7.39852,6.27812,6.35391,6.42076,7.63860,6.18110,7.11760 -10.29989,6.94402,7.20801,7.13335,7.09588,6.69301,6.76371,6.80604,7.21910,6.65570,7.16910,2.26415,2.84763,2.77178,2.73266,1.82074,1.85286,1.88594,2.85990,1.79950,2.29729,4.67987,5.27488,5.13981,5.08642,3.99120,4.16142,4.22937,5.30130,3.88380,4.65289,143.98202,144.57101,144.33742,144.21648,143.38233,143.67692,143.73805,143.27879,143.97604,143.97938,159.28335,157.38340,155.74480,130.94644,133.78803,135.15230,161.78350,130.91404,140.71030,6.85044,7.18367,7.11132,7.03848,6.23397,6.44619,6.62404,7.18460,6.09980,7.05250,2.66342,2.73449,2.72326,2.71256,2.58920,2.60162,2.61096,2.73550,2.57319,2.66300,4.18701,4.57051,4.48671,4.37170,3.54609,3.76340,3.93742,4.57950,3.42680,4.24510,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.70981,2.20763,2.12376,1.92629,1.58676,1.59231,1.59542,2.23590,1.58540,1.64780,0.0,0.0,0.0,0.0,0.0,144.00861,123.11453,126.39684,127.89228,172.05935,166.27094,163.52374,122.53100,175.95411,143.88075,0.0,0.06431,0.28246,0.22234,0.18596,0.00172,0.00430,0.00552,0.28320,0.00040,0.02580,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94531,6.97436,6.96006,6.95710,6.91701,6.92821,6.93402,6.97940,6.90880,6.94560,24.95583,25.45762,25.40979,25.36242,24.26592,24.45689,24.51368,25.46300,24.20460,24.93330,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94531,6.97436,6.96006,6.95710,6.91701,6.92821,6.93402,6.97940,6.90880,6.94560,6.94543,7.63670,7.47451,7.39906,6.27812,6.35391,6.42076,7.63860,6.18110,7.10680 -10.39989,6.94564,7.20801,7.13335,7.09588,6.69301,6.74373,6.80604,7.21910,6.65570,6.99650,2.26524,2.84763,2.77036,2.73142,1.82170,1.86718,1.89058,2.85990,1.79950,2.29729,4.68039,5.27488,5.13981,5.06500,3.99368,4.17698,4.22499,5.30130,3.88380,4.66279,143.98405,144.57101,144.33742,144.22480,143.38233,143.67692,143.73309,143.27879,143.97604,143.99048,159.28335,157.57585,155.07722,130.94644,134.12754,135.21626,161.78350,130.91404,140.71030,6.85026,7.18367,7.11132,7.04187,6.25081,6.44619,6.61617,7.18460,6.09980,6.87320,2.65727,2.73449,2.72299,2.71039,2.56861,2.59282,2.60367,2.73550,2.56300,2.65940,4.19298,4.57051,4.48671,4.38441,3.59451,3.76340,3.93203,4.57950,3.42680,4.24820,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.70555,2.20763,2.11886,1.92629,1.58238,1.58821,1.59274,2.23590,1.58160,1.63700,0.0,0.0,0.0,0.0,0.0,143.97512,123.11453,126.41953,128.26399,171.95745,165.44868,163.51678,122.53100,175.95411,143.67609,0.0,0.06676,0.28246,0.22234,0.19043,0.00142,0.00430,0.00576,0.28320,0.00040,0.02960,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94521,6.97436,6.96006,6.95734,6.91701,6.92821,6.93362,6.97940,6.90880,6.94560,24.95402,25.45762,25.38606,25.35514,24.26651,24.46761,24.52518,25.46300,24.20460,24.94240,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94521,6.97436,6.96006,6.95734,6.91701,6.92821,6.93362,6.97940,6.90880,6.94560,6.94490,7.63670,7.45558,7.39556,6.27812,6.34614,6.44840,7.63860,6.18110,7.10680 -10.49990,6.94555,7.20774,7.13120,7.09727,6.69334,6.74443,6.79928,7.21910,6.65570,6.96420,2.26550,2.84734,2.77326,2.72822,1.82777,1.86732,1.89087,2.85990,1.81780,2.29729,4.68004,5.22764,5.13946,5.06972,3.99396,4.15087,4.22620,5.23840,3.88380,4.66060,143.98321,144.56896,144.34648,144.28994,143.29556,143.65174,143.70025,143.27879,143.97811,144.06015,159.27548,157.56530,155.35694,130.94721,133.17937,135.16563,161.78350,130.91404,140.69248,6.84746,7.18365,7.10911,7.04152,6.20243,6.42826,6.61671,7.18460,6.09980,6.96370,2.65241,2.73446,2.72268,2.71015,2.56094,2.58294,2.59216,2.73550,2.55310,2.65379,4.19504,4.57029,4.48682,4.39902,3.55469,3.76017,3.93231,4.57950,3.42680,4.24880,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.70178,2.20696,2.11708,1.92185,1.57213,1.58170,1.58843,2.23590,1.57000,1.63120,0.0,0.0,0.0,0.0,0.0,143.97695,123.83910,126.37871,128.23899,171.76977,166.16277,163.47695,123.48270,175.38936,143.72152,0.0,0.06796,0.28244,0.22180,0.19186,0.00142,0.00349,0.00570,0.28320,0.00040,0.03150,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94525,6.97858,6.96128,6.95893,6.91711,6.92777,6.93049,6.97940,6.90880,6.94550,24.95379,25.43966,25.38549,25.35445,24.26723,24.44303,24.51158,25.45020,24.20460,24.94240,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94525,6.97858,6.96128,6.95893,6.91711,6.92777,6.93049,6.97940,6.90880,6.94550,6.94154,7.63666,7.50867,7.39833,6.27843,6.34657,6.43679,7.63860,6.18110,7.10770 -10.59989,6.94335,7.20035,7.11615,7.09490,6.69313,6.74273,6.79230,7.21910,6.65570,6.89830,2.26791,2.84734,2.77326,2.73367,1.82777,1.86979,1.89087,2.85990,1.81780,2.29729,4.67543,5.22764,5.13946,5.06972,3.99396,4.14386,4.24117,5.23840,3.88380,4.65840,143.98443,144.56896,144.34648,144.29618,143.29556,143.65174,143.69323,143.27879,143.98226,144.01113,159.27548,157.56530,155.35694,130.94721,133.17937,135.15266,161.78350,130.91404,140.67071,6.84372,7.18365,7.09278,7.03373,6.20243,6.44856,6.62539,7.18460,6.09980,6.82489,2.64624,2.73446,2.72268,2.71015,2.55469,2.57902,2.59031,2.73550,2.54780,2.64820,4.19747,4.57029,4.46275,4.39083,3.55469,3.76922,3.95117,4.57950,3.42680,4.25109,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.69756,2.20696,2.10888,1.89910,1.56851,1.57566,1.58337,2.23590,1.56650,1.62590,0.0,0.0,0.0,0.0,0.0,144.02258,123.83910,126.37871,128.14943,171.76977,166.28836,163.07786,123.48270,175.38936,143.76698,0.0,0.06713,0.28244,0.21260,0.19070,0.00142,0.00340,0.00570,0.28320,0.00040,0.03380,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94519,6.97858,6.96128,6.95927,6.91711,6.92777,6.93019,6.97940,6.90880,6.94530,24.95116,25.43966,25.38559,25.35445,24.26723,24.43213,24.51215,25.45020,24.20460,24.93730,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94519,6.97858,6.96128,6.95927,6.91711,6.92777,6.93019,6.97940,6.90880,6.94530,6.94390,7.63666,7.50867,7.39904,6.27843,6.34657,6.43679,7.63860,6.18110,7.10880 -10.69989,6.94637,7.23813,7.13124,7.09490,6.69313,6.74273,6.79928,7.25250,6.54770,6.72610,2.25905,2.84734,2.75623,2.71749,1.82777,1.86247,1.89326,2.85990,1.81780,2.29669,4.68732,5.26080,5.13946,5.06972,4.06976,4.18745,4.27423,5.27770,3.98180,4.65840,143.98071,144.56896,144.34648,144.29618,143.29556,143.61770,143.68972,143.27879,143.98226,144.08124,158.79160,157.56530,155.35694,131.74024,134.36507,135.16563,159.61437,131.71412,140.71030,6.84829,7.22905,7.09956,7.03771,6.26200,6.45275,6.62161,7.26259,6.19500,6.71800,2.63835,2.73446,2.72268,2.70723,2.54740,2.56385,2.58278,2.73550,2.53940,2.63690,4.20993,4.61831,4.49217,4.40813,3.63405,3.79761,3.95335,4.64759,3.52610,4.26050,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.69034,2.19289,2.10701,1.89910,1.56053,1.57161,1.57668,2.23590,1.55760,1.62230,0.0,0.0,0.0,0.0,0.0,143.95999,123.33277,126.65129,128.41569,169.56228,165.29103,162.14025,122.88635,172.42568,143.77938,0.0,0.06792,0.35113,0.22821,0.19410,0.00142,0.00335,0.00546,0.39150,0.00040,0.03040,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94537,6.97858,6.96293,6.95944,6.91711,6.92777,6.93019,6.97940,6.90880,6.94530,24.96199,25.44121,25.39459,25.35670,24.38415,24.47034,24.53066,25.45020,24.23639,24.93730,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94537,6.97858,6.96293,6.95944,6.91711,6.92777,6.93019,6.97940,6.90880,6.94530,6.94052,7.59069,7.44241,7.39833,6.29756,6.34657,6.43679,7.59220,6.26510,7.10680 -10.79989,6.94553,7.23813,7.11615,7.09490,6.69313,6.76086,6.79230,7.25250,6.54770,7.02529,2.25678,2.84734,2.76210,2.71598,1.82136,1.83946,1.88881,2.85990,1.79920,2.29669,4.68874,5.26080,5.14695,5.09018,4.04611,4.17748,4.26532,5.27770,3.98180,4.68109,143.98331,144.41557,144.32680,144.27370,143.40883,143.66670,143.70211,143.31780,143.98226,144.06756,158.83905,157.56120,155.35694,131.69435,134.33430,135.16563,159.61437,131.67943,140.67071,6.84235,7.22905,7.09956,7.04215,6.26200,6.43073,6.58594,7.26259,6.19500,7.03150,2.62983,2.73446,2.72268,2.69855,2.54394,2.55349,2.57183,2.73550,2.53940,2.62550,4.21252,4.61831,4.49570,4.42232,3.63405,3.79037,3.93713,4.64759,3.52610,4.26050,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.68983,2.18967,2.10378,1.90180,1.55685,1.56657,1.57200,2.23590,1.55460,1.62230,0.0,0.0,0.0,0.0,0.0,143.97746,123.33277,126.43711,128.10395,170.43091,166.19729,162.49250,122.88635,172.98045,143.31164,0.0,0.07013,0.35113,0.22821,0.19366,0.00142,0.00335,0.00570,0.39150,0.00040,0.03150,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94524,6.97307,6.96055,6.95884,6.92446,6.92872,6.93127,6.97750,6.91290,6.94530,24.96318,25.46251,25.40924,25.35715,24.35437,24.46761,24.53549,25.47180,24.23639,24.94540,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94524,6.97307,6.96055,6.95884,6.92446,6.92872,6.93127,6.97750,6.91290,6.94530,6.94118,7.59334,7.44411,7.39833,6.29568,6.34674,6.43679,7.59420,6.26510,7.10880 -10.89990,6.94534,7.33298,7.12164,7.10508,6.60411,6.76086,6.78519,7.39369,6.49339,6.88210,2.27474,5.42461,2.78078,2.71410,1.75137,1.83464,1.87682,7.35939,1.69250,2.28440,4.67059,5.27923,5.20180,5.10174,4.00803,4.15330,4.27232,5.28040,0.03430,4.68970,143.98427,144.41557,144.32680,144.24103,143.40883,143.66670,143.71945,143.31780,143.97811,144.09041,159.31149,157.79864,155.99407,99.94099,132.21628,134.66653,478.35446,84.63817,140.60347,6.81987,7.22905,7.10979,7.04085,6.13093,6.40717,6.53505,7.26259,5.64810,6.82339,2.58733,2.73446,2.70387,2.67235,2.15727,2.20217,2.54393,2.73550,2.12320,2.61450,4.23254,4.74935,4.58885,4.48075,3.55469,3.79037,3.92443,4.77979,3.44680,4.28969,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.68715,2.73453,2.10378,1.97662,1.37489,1.55638,1.56559,3.11070,1.31180,1.61470,0.0,0.0,0.0,0.0,0.0,143.98137,93.42429,125.27270,127.94530,173.62898,167.00206,162.62436,79.11517,579.10586,143.38767,0.0,0.07658,0.44241,0.23549,0.19366,0.00172,0.00385,0.00582,0.44380,0.00130,0.03470,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94520,6.97307,6.96055,6.95800,6.92446,6.92872,6.93284,6.97750,6.91290,6.94550,24.94271,25.53809,25.42422,25.37078,24.28653,24.44482,24.54626,25.54420,19.88870,24.94590,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94520,6.97307,6.96055,6.95800,6.92446,6.92872,6.93284,6.97750,6.91290,6.94550,6.94008,10.00590,7.56336,7.42575,6.27701,6.33719,6.41049,11.81500,2.09050,7.11220 -10.99990,6.94525,7.33298,7.11615,7.10501,6.60411,6.76557,6.79230,7.39369,6.49339,6.87470,2.25989,5.42461,2.76210,2.70507,1.71947,1.82674,1.86375,7.35939,1.69250,2.24590,4.68535,5.27923,5.20750,5.12560,4.00803,4.17748,4.27423,5.28040,0.03430,4.71810,143.98403,144.41288,144.31055,144.22875,143.40883,143.66670,143.72069,143.31780,143.97811,144.00424,159.31149,157.79864,155.73849,99.94099,132.14421,134.50948,478.35446,84.63817,140.37846,6.80230,7.22905,7.09956,7.03063,6.13093,6.37115,6.49085,7.26259,5.64810,6.85920,2.53695,2.70177,2.67153,2.66011,2.14699,2.17300,2.20081,2.70500,2.12320,2.60440,4.26535,4.78037,4.70277,4.58678,3.55469,3.79037,3.93815,4.78080,3.44680,4.30390,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.67490,2.73453,2.10378,2.03931,1.32746,1.39626,1.55511,3.11070,1.31180,1.60140,0.0,0.0,0.0,0.0,0.0,143.98317,93.42429,125.47657,127.70299,174.59621,166.54924,162.91978,79.11517,579.10586,143.59563,0.0,0.07443,0.44241,0.23150,0.18862,0.00172,0.00344,0.00532,0.44380,0.00130,0.03340,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94521,6.97307,6.96055,6.95794,6.92459,6.92950,6.93343,6.97750,6.91290,6.94550,24.95796,25.53809,25.42876,25.37613,24.28653,24.46761,24.55769,25.54420,19.88870,24.97100,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94521,6.97307,6.96055,6.95794,6.92459,6.92950,6.93343,6.97750,6.91290,6.94550,6.94423,10.00590,7.56749,7.43442,6.27701,6.33719,6.42102,11.81500,2.09050,7.12360 -11.09992,6.94523,7.33298,7.11615,7.10009,6.60411,6.76557,6.79320,7.39369,6.49339,7.01229,2.24188,5.40939,2.76183,2.69099,1.70538,1.79223,1.83616,7.35939,1.69250,2.24100,4.70335,5.31881,5.21438,5.12831,4.04611,4.17748,4.27807,5.34780,0.03430,4.73240,143.98288,144.36468,144.31055,144.22480,143.37789,143.66670,143.73805,143.31780,143.97604,143.95717,158.83905,157.60577,155.23707,99.94099,132.65458,134.66653,478.35446,84.63817,140.37846,6.78595,7.22905,7.10979,7.02647,6.07530,6.32848,6.43327,7.26259,5.64810,7.08300,2.49364,2.68187,2.66228,2.65022,2.14334,2.16743,2.19416,2.68850,2.12320,2.59010,4.29231,4.87273,4.75108,4.62480,3.63671,3.79567,3.96276,4.92580,3.44680,4.32280,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.66632,2.71690,2.10378,2.03931,1.32383,1.34721,1.45076,3.11070,1.31180,1.59880,0.0,0.0,0.0,0.0,0.0,143.98352,93.21218,125.37267,127.88868,173.86789,167.51218,163.55289,78.69554,579.10586,143.40207,0.0,0.07292,0.44241,0.23150,0.18862,0.00142,0.00331,0.00538,0.44380,0.00050,0.02770,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94526,6.97457,6.96055,6.95710,6.92690,6.92950,6.93362,6.97750,6.92410,6.94560,24.97619,25.54179,25.45398,25.41972,24.35437,24.47100,24.57844,25.54420,19.88870,24.99360,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94526,6.97457,6.96055,6.95710,6.92690,6.92950,6.93362,6.97750,6.92410,6.94560,6.94651,10.00590,7.53837,7.42575,6.29568,6.34494,6.44176,11.81500,2.09050,7.12360 -11.19990,6.94667,7.33439,7.11617,7.10196,6.61670,6.77063,6.79956,7.39369,6.49339,6.94170,2.22322,5.45474,2.75281,2.67294,1.69122,1.73324,1.80562,7.35939,1.66450,2.20090,4.72345,5.35174,5.23241,5.16140,4.04603,4.19077,4.29498,5.35460,0.03430,4.77460,143.98382,144.42794,144.31243,144.22896,143.36009,143.61378,143.72606,143.31780,143.97396,144.03006,161.82167,157.62354,155.23322,99.52253,132.63039,134.65220,478.35446,84.63817,140.37846,6.76914,7.20548,7.09893,7.01745,6.07517,6.30900,6.42291,7.26259,5.64810,6.95030,2.45049,2.66390,2.64904,2.63688,2.14334,2.16719,2.19331,2.66680,2.12320,2.56530,4.31864,4.92168,4.75733,4.69424,3.63569,3.82458,3.96480,4.92580,3.44680,4.35730,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.65859,2.72606,2.10419,2.04374,1.32379,1.34457,1.37064,3.11070,1.31180,1.59100,0.0,0.0,0.0,0.0,0.0,143.95378,92.53701,125.23136,127.64317,174.29929,168.80457,163.91830,78.65345,588.65081,143.35889,0.0,0.07108,0.44244,0.22078,0.17859,0.00142,0.00342,0.00576,0.44380,0.00050,0.03040,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.97544,6.96312,6.95768,6.92386,6.92940,6.93342,6.97750,6.91840,6.94570,24.99538,25.56131,25.52224,25.42858,24.35434,24.49324,24.58832,25.57370,19.88870,25.00609,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.97544,6.96312,6.95768,6.92386,6.92940,6.93342,6.97750,6.91840,6.94570,6.94299,10.04797,7.53975,7.42654,6.17964,6.34423,6.44192,11.81500,2.09050,7.12360 -11.29990,6.94363,7.33439,7.11617,7.08697,6.61670,6.76528,6.79956,7.39369,6.49339,7.11530,2.20872,5.45474,2.73432,2.61830,1.69122,1.73324,1.78028,7.35939,1.66450,2.17790,4.73490,5.35174,5.22836,5.16434,4.04603,4.23520,4.32546,5.35460,0.03430,4.79510,143.98415,144.42794,144.31243,144.22896,143.36009,143.61378,143.72606,143.31780,143.96982,144.05625,161.82167,157.62354,155.23322,99.52253,132.17355,134.65220,478.35446,84.63817,140.59358,6.75140,7.20548,7.07905,7.00192,6.07517,6.22165,6.39714,7.26259,5.64810,7.12470,2.41399,2.65717,2.63670,2.63030,2.14334,2.16719,2.19112,2.65990,2.12320,2.53940,4.33741,4.92168,4.77111,4.71027,3.63569,3.83946,3.96264,4.92580,3.44680,4.36810,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.65145,2.72606,2.11706,2.04374,1.32379,1.34457,1.36724,3.11070,1.31180,1.58800,0.0,0.0,0.0,0.0,0.0,144.01679,92.53701,125.58585,128.49110,174.29929,167.54796,163.78031,78.65345,588.65081,143.41029,0.0,0.07259,0.44244,0.22078,0.18303,0.00188,0.00422,0.00631,0.44380,0.00050,0.03490,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94520,6.97544,6.96312,6.95768,6.92386,6.92940,6.93342,6.97750,6.91840,6.94590,25.00842,25.56131,25.52290,25.44496,24.35434,24.52559,24.61441,25.57370,19.88870,25.05590,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94520,6.97544,6.96312,6.95768,6.92386,6.92940,6.93342,6.97750,6.91840,6.94590,6.94173,10.04797,7.56581,7.42654,6.17964,6.34423,6.44192,11.81500,2.09050,7.11270 -11.39991,6.94480,7.33439,7.11611,7.08697,6.61670,6.77081,6.79956,7.39369,6.49339,6.92629,2.19817,5.45474,2.72067,2.60108,1.69122,1.73324,1.77616,7.35939,1.66450,2.16999,4.74663,5.35174,5.22836,5.16619,4.04603,4.26260,4.36737,5.35460,0.03430,4.79510,143.98350,144.47864,144.31451,144.24269,143.36009,143.61378,143.72606,143.31780,143.96982,144.05029,161.82167,157.25124,155.23322,99.52253,132.17355,134.65220,478.35446,84.63817,140.67467,6.73955,7.20548,7.07905,6.99242,6.07517,6.22165,6.39714,7.26259,5.64810,6.90090,2.38188,2.65469,2.63473,2.61643,2.14334,2.16719,2.18900,2.65990,2.12320,2.28710,4.35766,4.92168,4.77789,4.72123,3.66521,3.87698,3.97536,4.92580,3.44680,4.37429,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.64398,2.72606,2.10419,1.99882,1.32379,1.34080,1.36198,3.11070,1.31180,1.58760,0.0,0.0,0.0,0.0,0.0,143.99246,92.53701,125.80151,128.74519,174.29929,166.78230,162.77260,78.65345,588.65081,143.57295,0.0,0.07194,0.44244,0.22078,0.17841,0.00188,0.00421,0.00631,0.44380,0.00050,0.03040,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94524,6.97544,6.96312,6.95768,6.92143,6.92931,6.93276,6.97750,6.91840,6.94590,25.01903,25.56131,25.52720,25.45348,24.35434,24.53377,24.62440,25.57370,19.88870,25.06259,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94524,6.97544,6.96312,6.95768,6.92143,6.92931,6.93276,6.97750,6.91840,6.94590,6.94201,10.04797,7.56581,7.42654,6.17964,6.35925,6.44192,11.81500,2.09050,7.10860 -11.49990,6.94495,7.33439,7.11890,7.09427,6.61670,6.77081,6.80297,7.39369,6.49339,6.96199,2.18853,5.45474,2.69412,2.58124,1.69122,1.73324,1.76758,7.35939,1.66450,2.16840,4.75641,5.35384,5.26951,5.19084,4.08930,4.27589,4.37554,5.35460,0.03430,4.79510,143.98563,144.47864,144.31076,144.22563,143.41613,143.62966,143.75582,143.41441,143.96982,144.00723,163.21829,156.75135,155.08781,99.52253,132.75381,134.76616,478.35446,84.63817,140.99003,6.72043,7.20548,7.04286,6.98074,6.07517,6.29168,6.37450,7.26259,5.64810,6.57859,2.34741,2.65469,2.61736,2.61366,2.14334,2.16719,2.18900,2.65990,2.12320,2.26029,4.37301,4.92168,4.78070,4.72876,3.78500,3.89002,4.02850,4.92580,3.44680,4.37720,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.64151,2.72606,2.09548,1.99194,1.32379,1.34080,1.35944,3.11070,1.31180,1.59580,0.0,0.0,0.0,0.0,0.0,143.98948,92.51903,125.57071,128.66568,172.99445,166.41344,162.78373,78.65345,588.65081,143.60594,0.0,0.07425,0.44244,0.22078,0.17847,0.00188,0.00450,0.00660,0.44380,0.00050,0.03340,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94513,6.97271,6.96235,6.95624,6.92143,6.92949,6.93358,6.97280,6.91840,6.94590,25.02671,25.56761,25.53027,25.45900,24.38164,24.57648,24.65653,25.57370,19.88870,25.06080,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94513,6.97271,6.96235,6.95624,6.92143,6.92949,6.93358,6.97280,6.91840,6.94590,6.94409,10.04797,7.53274,7.42025,6.12676,6.37953,6.44796,11.81500,2.09050,7.09270 -11.59990,6.94579,7.33439,7.11881,7.09156,6.61674,6.77261,6.80658,7.39369,6.49339,6.93940,2.17345,5.44016,2.66835,2.56460,1.69122,1.73238,1.74488,7.35939,1.66450,2.16570,4.77233,5.35384,5.27320,5.20488,4.09157,4.28766,4.38452,5.35460,0.03430,4.80440,143.98411,144.47864,144.29264,144.21731,143.41613,143.58037,143.75582,143.41441,143.96982,143.98786,163.21829,156.75135,155.05318,99.52253,132.68072,134.76616,478.35446,84.63817,140.99003,6.70695,7.20548,7.03707,6.98102,6.07517,6.22714,6.34730,7.26259,5.64810,6.60319,2.31864,2.65469,2.61468,2.60412,2.14334,2.16719,2.18900,2.65990,2.12320,2.26029,4.38830,4.92168,4.78070,4.74981,3.78500,3.88897,4.00513,4.92580,3.44680,4.39750,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.63662,2.72606,2.10453,2.00547,1.32379,1.34080,1.35944,3.11070,1.31180,1.58850,0.0,0.0,0.0,0.0,0.0,143.97201,92.64395,125.92000,128.70874,172.92660,166.11185,163.14810,78.65345,588.65081,143.46996,0.0,0.07132,0.44244,0.19407,0.17642,0.00095,0.00450,0.00642,0.44380,0.00050,0.02880,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94521,6.97271,6.96474,6.95624,6.92143,6.93036,6.93398,6.97280,6.91840,6.94590,25.04260,25.56761,25.53027,25.47644,24.38248,24.59261,24.67061,25.57370,19.88870,25.06460,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94521,6.97271,6.96474,6.95624,6.92143,6.93036,6.93398,6.97280,6.91840,6.94590,6.94502,10.04797,7.53689,7.42025,6.12676,6.37953,6.44940,11.81500,2.09050,7.09270 -11.69990,6.94654,7.29320,7.12209,7.09508,6.72594,6.77650,6.81973,7.39369,6.49339,6.75610,2.16075,5.39447,2.62348,2.58036,1.67559,1.72304,1.74218,7.35939,1.65850,2.16009,4.78578,5.35382,5.27299,5.21230,4.06997,4.28864,4.40183,5.35460,0.03430,4.81090,143.98447,144.52951,144.30097,144.22875,143.07289,143.52422,143.75520,142.81633,143.96982,143.97441,163.19986,157.81308,155.08348,99.93541,132.19618,134.78106,478.35446,84.63817,140.97015,6.69379,7.12578,7.03401,6.97714,6.07517,6.19281,6.33447,7.12660,5.64810,6.41170,2.29101,2.63438,2.58542,2.54153,2.14334,2.16743,2.18920,2.64750,2.12320,2.26010,4.40278,4.92158,4.78065,4.74728,3.77299,3.89005,4.04222,4.92580,3.44680,4.41880,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.63435,2.71690,2.11180,2.00797,1.32383,1.34100,1.35956,3.11070,1.31180,1.58760,0.0,0.0,0.0,0.0,0.0,143.95647,93.03798,126.63862,128.32572,174.04704,166.34271,162.76015,78.65345,590.73724,143.45144,0.0,0.06756,0.44241,0.19145,0.17370,0.00096,0.00423,0.00632,0.44380,0.00050,0.03040,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94519,6.98944,6.96746,6.95627,6.91900,6.92996,6.93343,7.00200,6.90160,6.94590,25.05833,25.60117,25.53338,25.49277,24.36422,24.58938,24.65811,25.62190,19.88870,25.07610,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94519,6.98944,6.96746,6.95627,6.91900,6.92996,6.93343,7.00200,6.90160,6.94590,6.94567,10.00646,7.56451,7.41943,6.12745,6.33661,6.44814,11.81500,2.09050,7.09370 -11.79990,6.94516,7.34889,7.12293,7.10198,6.66889,6.77086,6.80316,7.39369,6.49339,6.97200,2.14631,5.38608,2.61836,2.55809,1.65810,1.71428,1.73774,7.35939,1.65180,2.15330,4.79885,5.44351,5.28016,5.23204,4.11837,4.32597,4.40337,5.51060,0.03430,4.81260,143.98326,144.57425,144.39620,144.23645,143.06409,143.50475,143.72730,142.81633,143.96775,143.95521,163.19986,158.03180,155.08348,99.93541,132.64745,134.65510,478.35446,84.63817,140.99003,6.68572,7.21711,7.03705,6.97639,6.07517,6.19200,6.30620,7.28540,5.64810,6.59820,2.26818,2.53376,2.37496,2.36085,2.14334,2.16743,2.18920,2.53600,2.12320,2.26010,4.41753,4.92158,4.78462,4.75729,3.79126,3.90995,4.04756,4.92580,3.44680,4.43770,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.62649,2.71690,2.11148,2.04043,1.32383,1.34100,1.35956,3.11070,1.31180,1.58700,0.0,0.0,0.0,0.0,0.0,143.98498,92.33945,126.60591,128.36756,173.11592,165.55592,162.83674,77.70007,593.08463,143.55646,0.0,0.07266,0.44241,0.21928,0.17876,0.00087,0.00366,0.00558,0.44380,0.00050,0.03060,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94525,6.98987,6.96841,6.95762,6.91686,6.92539,6.93306,7.00200,6.90160,6.94600,25.06960,25.62073,25.53365,25.51637,24.39806,24.62091,24.67137,25.62190,19.88870,25.08430,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94525,6.98987,6.96841,6.95762,6.91686,6.92539,6.93306,7.00200,6.90160,6.94600,6.94660,10.00646,7.53878,7.42638,6.12745,6.32784,6.44814,11.81500,2.09050,7.09270 -11.89990,6.94542,7.23511,7.11865,7.09154,6.71474,6.77627,6.81812,7.28950,6.63630,7.00269,2.11687,2.73237,2.61911,2.55969,1.65432,1.69952,1.74168,2.77030,1.64350,2.16150,4.82854,5.44508,5.30022,5.23976,4.18773,4.33968,4.40918,5.51060,4.09580,4.80799,143.98486,144.57744,144.41246,144.24560,143.04715,143.47881,143.69715,142.81633,143.96775,143.86347,161.61010,158.03380,155.05318,131.55011,133.31911,134.73638,163.99626,131.42158,140.67467,6.69627,7.22240,7.03707,6.97922,6.09204,6.20129,6.33358,7.28540,6.06979,6.29010,2.27933,2.39967,2.38032,2.36276,2.15973,2.18575,2.19860,2.40030,2.14340,2.28109,4.41693,4.92168,4.79655,4.75626,3.82850,3.91829,4.05928,4.92580,3.76710,4.43770,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.62205,2.18335,2.10532,2.04479,1.32944,1.35134,1.36510,2.19490,1.32220,1.59580,0.0,0.0,0.0,0.0,0.0,143.97967,122.28745,126.27330,128.21400,171.17255,165.58484,162.57889,120.75982,174.23727,143.48231,0.0,0.06691,0.33481,0.19638,0.17380,0.00086,0.00363,0.00633,0.34970,0.00050,0.03470,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94517,6.99070,6.96967,6.95908,6.91670,6.92461,6.93262,7.00200,6.90160,6.94600,25.10122,25.62712,25.53811,25.50484,24.48347,24.62324,24.67686,25.63090,24.37910,25.07939,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94517,6.99070,6.96967,6.95908,6.91670,6.92461,6.93262,7.00200,6.90160,6.94600,6.95103,7.60166,7.50080,7.42189,6.18773,6.32776,6.44940,7.60910,6.09770,7.10860 -11.99990,6.94513,7.23511,7.12262,7.09154,6.71474,6.77627,6.81692,7.28950,6.63630,6.93730,2.11486,2.73237,2.60529,2.55387,1.65432,1.71392,1.73720,2.77030,1.64350,2.16150,4.83026,5.45091,5.30719,5.24968,4.18773,4.35270,4.40342,5.51060,4.09580,4.81260,143.98486,144.57744,144.41246,144.25226,143.04715,143.47881,143.69715,142.81633,143.97189,144.00038,161.61010,157.95093,155.03587,131.31948,133.31911,134.73638,163.99626,131.24565,140.97015,6.70038,7.22240,7.08732,6.98920,6.09204,6.20129,6.30316,7.28540,6.06979,6.79320,2.29947,2.41807,2.40015,2.38691,2.18310,2.20147,2.22321,2.41820,2.15600,2.30140,4.40090,4.92168,4.79664,4.72276,3.82850,3.89059,4.03428,4.92580,3.76710,4.42800,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.62904,2.18335,2.10532,2.05740,1.33964,1.35932,1.37720,2.19490,1.33420,1.59580,0.0,0.0,0.0,0.0,0.0,143.98573,122.20020,126.38262,128.14664,171.17255,164.83643,162.85000,120.75982,174.23727,143.38767,0.0,0.06729,0.33481,0.19638,0.17696,0.00086,0.00421,0.00660,0.34970,0.00050,0.03470,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94517,6.99070,6.96967,6.95908,6.91670,6.92461,6.93229,7.00200,6.90160,6.94580,25.10388,25.62712,25.54836,25.51976,24.48347,24.64305,24.68654,25.63090,24.37910,25.07939,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94517,6.99070,6.96967,6.95908,6.91670,6.92461,6.93229,7.00200,6.90160,6.94580,6.94442,7.61501,7.50080,7.42189,6.18773,6.33108,6.45012,7.61929,6.09770,7.09370 -12.09990,6.94534,7.23511,7.12262,7.09541,6.71474,6.77121,6.80890,7.28950,6.63630,6.92170,2.11071,2.66874,2.60529,2.55135,1.65432,1.71392,1.74056,2.68000,1.64350,2.16009,4.83462,5.45091,5.30022,5.24968,4.24766,4.35270,4.40342,5.51060,4.09580,4.83510,143.98671,144.57744,144.41246,144.28473,143.04715,143.48005,143.67816,142.81633,143.97189,143.95320,160.26776,157.11116,154.83615,131.31948,133.63820,134.76289,162.15602,131.24565,140.67467,6.70938,7.22240,7.03707,6.99544,6.11314,6.21684,6.34104,7.28540,6.08230,6.71910,2.31649,2.45730,2.41716,2.39826,2.18773,2.22468,2.24148,2.46520,2.18560,2.31519,4.39288,4.91045,4.78462,4.68370,3.81528,3.89059,4.04712,4.91600,3.76710,4.42800,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.62875,2.15979,2.09986,2.02743,1.34721,1.36490,1.38838,2.16740,1.33909,1.59580,0.0,0.0,0.0,0.0,0.0,143.98140,123.15783,126.49405,128.18803,169.43466,164.83643,162.76094,122.09117,174.23727,142.95516,0.0,0.06780,0.33481,0.20172,0.17847,0.00128,0.00421,0.00660,0.34970,0.00050,0.03510,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94508,6.99070,6.96961,6.96000,6.91670,6.92461,6.93074,7.00200,6.90160,6.94580,25.10744,25.62712,25.54836,25.51680,24.56699,24.63454,24.68654,25.63090,24.37910,25.09149,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94508,6.99070,6.96961,6.96000,6.91670,6.92461,6.93074,7.00200,6.90160,6.94580,6.94670,7.61501,7.48289,7.42044,6.23955,6.36491,6.45844,7.61929,6.16690,7.10860 -12.19990,6.94631,7.22426,7.11367,7.09508,6.72953,6.78118,6.81793,7.28950,6.63630,6.71840,2.10811,2.66847,2.60508,2.55054,1.65438,1.70633,1.74069,2.68000,1.64350,2.15330,4.83819,5.45246,5.29903,5.24862,4.24779,4.35249,4.39617,5.51060,4.09580,4.82850,143.98365,144.57694,144.36857,144.25122,143.05265,143.52020,143.69777,142.81633,143.98226,144.08545,160.25366,157.08006,155.29300,131.32124,134.24503,134.88213,162.15602,131.24565,140.97015,6.72203,7.22089,7.06259,6.99670,6.11332,6.22565,6.35149,7.28540,6.08230,6.51929,2.33509,2.47768,2.44255,2.41811,2.19587,2.23563,2.25377,2.48710,2.18560,2.32980,4.38693,4.86934,4.77761,4.67778,3.81185,3.88494,4.04918,4.90280,3.76710,4.40799,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.62683,2.15961,2.09964,2.02491,1.35657,1.38375,1.39879,2.16740,1.33909,1.58700,0.0,0.0,0.0,0.0,0.0,143.96127,123.13845,126.51637,128.21893,169.42920,165.04850,162.94978,122.09117,174.23727,143.22953,0.0,0.06290,0.33445,0.19370,0.16074,0.00128,0.00360,0.00626,0.34970,0.00050,0.03060,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94523,6.99043,6.96766,6.95905,6.91673,6.92671,6.93235,7.00200,6.90160,6.94530,25.11431,25.62703,25.55780,25.51979,24.56700,24.63501,24.67957,25.63090,24.37910,25.09309,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94523,6.99043,6.96766,6.95905,6.91673,6.92671,6.93235,7.00200,6.90160,6.94530,6.94032,7.61491,7.44906,7.41387,6.24010,6.36617,6.43944,7.61929,6.16690,7.09370 -12.29990,6.94509,7.22517,7.12580,7.10027,6.69833,6.77146,6.80965,7.28950,6.63630,7.02669,2.10920,2.66847,2.60508,2.55377,1.65438,1.69403,1.73736,2.68000,1.64350,2.14550,4.83588,5.45246,5.30693,5.25250,4.24779,4.35521,4.39617,5.51060,4.09580,4.82850,143.98352,144.76676,144.41236,144.27620,142.75358,143.48200,143.66577,142.70628,143.98226,144.05005,160.25366,157.90753,155.74844,131.32124,133.51188,134.65510,162.15602,131.24565,140.97015,6.72303,7.22089,7.07254,7.00201,6.14657,6.23282,6.35149,7.28540,6.08230,6.77260,2.35001,2.48073,2.45160,2.43284,2.21648,2.25234,2.27809,2.48710,2.18710,2.35410,4.37302,4.86934,4.77020,4.66824,3.81185,3.88396,4.04747,4.90280,3.76710,4.40610,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.63093,2.16845,2.10251,2.04769,1.35971,1.38682,1.40382,2.18290,1.33909,1.58700,0.0,0.0,0.0,0.0,0.0,143.98658,123.13845,126.38997,128.10215,169.42920,165.30988,163.03825,122.09117,174.23727,143.38973,0.0,0.06876,0.33445,0.19627,0.17662,0.00128,0.00360,0.00666,0.34970,0.00050,0.03710,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94523,7.00507,6.96951,6.96060,6.90766,6.92461,6.93115,7.00740,6.89789,6.94530,25.11070,25.62703,25.56268,25.52622,24.56700,24.64307,24.67957,25.63090,24.37910,25.09149,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94523,7.00507,6.96951,6.96060,6.90766,6.92461,6.93115,7.00740,6.89789,6.94530,6.94203,7.61491,7.48997,7.42638,6.24010,6.33281,6.42060,7.61929,6.16690,7.09370 -12.39990,6.94535,7.22517,7.12580,7.09750,6.69833,6.77719,6.81793,7.28950,6.63630,6.93520,2.10561,2.66847,2.60508,2.55377,1.65438,1.68683,1.73203,2.68000,1.64350,2.14550,4.83973,5.46974,5.31220,5.25349,4.24748,4.35249,4.39165,5.51060,4.09580,4.83510,143.98420,144.78298,144.41799,144.29139,142.75358,143.46389,143.61151,142.70628,143.98226,144.05619,160.25366,158.17591,155.74844,130.60276,133.32213,134.50279,162.15602,130.12192,140.80937,6.72696,7.22089,7.07254,7.00473,6.14657,6.22845,6.31510,7.28540,6.08230,6.79729,2.36526,2.48073,2.46329,2.44808,2.24041,2.26272,2.28211,2.48710,2.20750,2.36969,4.36169,4.86934,4.74836,4.66556,3.79138,3.87327,3.98744,4.90280,3.76710,4.39179,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.63309,2.16845,2.10298,2.05700,1.36534,1.39137,1.40906,2.18290,1.35920,1.58390,0.0,0.0,0.0,0.0,0.0,143.98108,122.87690,126.30584,128.08574,169.43785,165.58155,163.30023,122.09117,174.23727,143.25416,0.0,0.06748,0.33445,0.19627,0.17642,0.00128,0.00324,0.00626,0.34970,0.00050,0.03710,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94520,7.00507,6.97039,6.96323,6.90688,6.92434,6.93041,7.00740,6.89789,6.94530,25.11476,25.62703,25.57095,25.53186,24.56242,24.64307,24.67957,25.63090,24.37910,25.09149,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94520,7.00507,6.97039,6.96323,6.90688,6.92434,6.93041,7.00740,6.89789,6.94530,6.94173,7.65680,7.50063,7.43479,6.24010,6.32207,6.42060,7.68510,6.16690,7.10180 -12.49990,6.94522,7.22517,7.12358,7.09085,6.69833,6.78545,6.82518,7.28950,6.63630,6.94590,2.09383,2.66847,2.60508,2.54377,1.65438,1.68683,1.72540,2.68000,1.64350,2.14120,4.85138,5.46974,5.30693,5.25250,4.24748,4.35223,4.40357,5.51060,4.09580,4.84400,143.98429,144.78298,144.41799,144.29139,142.75358,143.48200,143.61873,142.70628,143.98433,144.08513,159.35023,157.95355,155.58947,130.60276,133.51188,134.50279,160.86222,130.12192,140.70634,6.74070,7.22089,7.06510,7.00201,6.14657,6.23766,6.39354,7.28540,6.08230,6.95060,2.37784,2.48443,2.46395,2.44978,2.27714,2.28385,2.30818,2.48710,2.24800,2.38240,4.36286,4.86934,4.68590,4.65256,3.79138,3.87290,3.99518,4.90280,3.76710,4.39280,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.62385,2.16845,2.10298,2.01765,1.37772,1.39279,1.40906,2.18290,1.37190,1.57670,0.0,0.0,0.0,0.0,0.0,143.98387,122.87690,126.38997,128.26630,169.43785,165.58854,163.15928,122.09117,174.23727,143.15982,0.0,0.06462,0.33445,0.19627,0.16610,0.00128,0.00311,0.00570,0.34970,0.00050,0.03510,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94520,7.00507,6.96951,6.96288,6.90688,6.92434,6.93041,7.00740,6.89789,6.94520,25.12803,25.62703,25.57095,25.53192,24.56242,24.62506,24.68005,25.63090,24.37910,25.09530,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94520,7.00507,6.96951,6.96288,6.90688,6.92434,6.93041,7.00740,6.89789,6.94520,6.94034,7.65680,7.48997,7.43479,6.27548,6.33097,6.42717,7.68510,6.21649,7.10700 -12.60081,6.94526,7.24680,7.12358,7.09085,6.69687,6.78254,6.81527,7.28950,6.63630,6.93730,2.08949,2.66847,2.60501,2.53915,1.65438,1.68437,1.71509,2.68000,1.64350,2.14120,4.85576,5.46974,5.31220,5.26045,4.25480,4.35223,4.40707,5.51060,4.09580,4.84400,143.98601,144.78298,144.44771,144.29972,142.75358,143.48324,143.61873,142.70628,143.98433,144.06009,159.35023,157.95355,155.58947,130.60276,133.51295,134.50279,160.86222,130.12192,140.64301,6.74970,7.22089,7.07254,7.01187,6.18438,6.28418,6.45067,7.28540,6.08230,7.06709,2.38984,2.48443,2.46502,2.45686,2.27727,2.30498,2.31803,2.48710,2.24800,2.39630,4.35985,4.86934,4.68590,4.65214,3.79138,3.88177,4.06603,4.90280,3.76710,4.37860,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.61970,2.16845,2.09163,1.97131,1.37876,1.40015,1.41441,2.18290,1.37190,1.58390,0.0,0.0,0.0,0.0,0.0,143.98302,122.87690,126.30704,128.21170,169.22818,165.65602,163.34104,122.09117,174.23727,143.15982,0.0,0.06407,0.33445,0.20587,0.16610,0.00148,0.00311,0.00570,0.34970,0.00120,0.03360,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94511,7.00507,6.96945,6.96288,6.90688,6.92292,6.93001,7.00740,6.89789,6.94520,25.13306,25.62703,25.57170,25.53353,24.56242,24.63423,24.69632,25.63090,24.37910,25.09530,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94511,7.00507,6.96945,6.96288,6.90688,6.92292,6.93001,7.00740,6.89789,6.94520,6.94154,7.65680,7.48991,7.43479,6.27548,6.33097,6.42717,7.68510,6.21649,7.11020 -12.69990,6.94637,7.24680,7.10806,7.08959,6.69687,6.78545,6.82518,7.28950,6.63630,6.83020,2.08923,2.65289,2.59570,2.53353,1.65438,1.68659,1.71833,2.65320,1.64350,2.14500,4.85714,5.46974,5.30693,5.26135,4.26212,4.35656,4.41211,5.51060,4.25450,4.84400,143.98360,144.73281,144.44771,144.29139,142.98969,143.52896,143.62739,142.70628,143.98226,144.01136,159.35023,157.43209,155.51035,130.60276,133.64535,134.62845,160.86222,130.12192,140.64301,6.75447,7.22089,7.07254,7.00201,6.20350,6.28826,6.46888,7.28540,6.17690,6.76310,2.39765,2.48443,2.46502,2.45686,2.29848,2.32462,2.33721,2.48710,2.27830,2.39910,4.35682,4.86934,4.68590,4.63594,3.81185,3.88396,4.08689,4.90280,3.78450,4.37860,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.61572,2.16311,2.06721,1.85514,1.38947,1.40115,1.41266,2.18290,1.38600,1.58440,0.0,0.0,0.0,0.0,0.0,143.95993,123.11254,126.53991,128.28917,169.01875,165.47661,163.12042,122.49197,169.54899,143.08198,0.0,0.06221,0.33445,0.20122,0.15856,0.00134,0.00311,0.00536,0.34970,0.00120,0.03360,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94523,6.99351,6.96723,6.96246,6.90928,6.92292,6.93041,7.00740,6.89789,6.94530,25.13479,25.62586,25.57170,25.53423,24.57254,24.65236,24.70451,25.63090,24.55920,25.09370,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94523,6.99351,6.96723,6.96246,6.90928,6.92292,6.93041,7.00740,6.89789,6.94530,6.94389,7.65680,7.48249,7.42785,6.27548,6.35194,6.43043,7.68510,6.21649,7.11020 -12.79990,6.94477,7.19362,7.12358,7.08959,6.70251,6.78254,6.81527,7.19620,6.68319,6.93679,2.09252,2.65289,2.59823,2.53353,1.67015,1.69074,1.71833,2.65320,1.64350,2.14550,4.85225,5.47812,5.29882,5.26135,4.26212,4.35656,4.41788,5.52530,4.25450,4.84379,143.98385,144.90029,144.44771,144.29139,142.74832,143.52896,143.62739,142.70628,143.98226,143.97450,160.14882,157.14449,155.51035,129.16392,133.64535,134.75381,161.14217,128.45050,140.55603,6.74767,7.17108,7.06510,7.00201,6.21987,6.28853,6.46757,7.19800,6.17690,6.84180,2.40073,2.48443,2.46502,2.45686,2.31104,2.32862,2.34220,2.48710,2.27830,2.40030,4.34693,4.85059,4.68237,4.62345,3.81185,3.88430,4.08602,4.86990,3.78450,4.36700,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.61816,2.16311,2.06224,1.84835,1.37392,1.39490,1.40289,2.18290,1.34280,1.59020,0.0,0.0,0.0,0.0,0.0,143.99306,122.98567,126.62948,128.28917,168.56919,165.36305,162.96704,122.27181,169.54899,143.07584,0.0,0.06475,0.24580,0.21098,0.16610,0.00142,0.00321,0.00594,0.25080,0.00120,0.03500,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,7.00533,6.96723,6.96246,6.90129,6.92292,6.93041,7.00740,6.89040,6.94530,25.13030,25.61744,25.57170,25.54528,24.56682,24.63544,24.70451,25.63090,24.55920,25.09360,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,7.00533,6.96723,6.96246,6.90129,6.92292,6.93041,7.00740,6.89040,6.94530,6.94567,7.74209,7.48249,7.42093,6.24419,6.36357,6.43043,7.78510,6.20570,7.11460 -12.89990,6.94509,7.19362,7.12550,7.09136,6.70251,6.78254,6.80865,7.19620,6.68319,7.03550,2.09299,2.66925,2.59823,2.53353,1.67124,1.69210,1.72146,2.68190,1.66960,2.14550,4.85210,5.47812,5.27212,5.25248,4.25480,4.35656,4.42159,5.52530,4.23880,4.84400,143.98227,144.90029,144.43134,144.27328,142.74832,143.52896,143.62739,142.70628,143.98226,143.99085,159.40090,156.53825,155.46176,129.16392,133.85062,134.85994,161.14217,128.45050,140.70634,6.74339,7.16050,7.05218,7.00201,6.19775,6.28418,6.45693,7.19800,6.13600,6.98370,2.40625,2.48443,2.46630,2.45903,2.31742,2.34179,2.36166,2.48710,2.31190,2.40250,4.33714,4.83390,4.65666,4.61091,3.79138,3.88430,4.06552,4.86990,3.75269,4.36460,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.61838,2.17378,2.06224,1.85589,1.36253,1.39490,1.40289,2.18290,1.34280,1.59050,0.0,0.0,0.0,0.0,0.0,143.98642,122.73873,127.05891,128.43532,168.74660,165.32587,162.78558,121.84423,169.25055,143.07175,0.0,0.06647,0.24580,0.21098,0.16822,0.00130,0.00321,0.00594,0.25080,0.00120,0.03710,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94529,7.00533,6.96723,6.96246,6.90129,6.92370,6.93129,7.00740,6.89040,6.94530,25.13024,25.59448,25.56500,25.53423,24.56295,24.62350,24.70451,25.59960,24.55920,25.09360,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94529,7.00533,6.96723,6.96246,6.90129,6.92370,6.93129,7.00740,6.89040,6.94530,6.94488,7.74209,7.47101,7.41510,6.27348,6.38821,6.43245,7.78510,6.20570,7.10700 -12.99990,6.94489,7.19368,7.11972,7.09154,6.70229,6.75375,6.80352,7.19620,6.68319,6.94740,2.09355,2.66955,2.59829,2.53366,1.67123,1.69066,1.72114,2.68190,1.66960,2.15060,4.85133,5.47922,5.27221,5.25100,4.25479,4.35594,4.42372,5.52530,4.23880,4.83930,143.98589,144.90195,144.43207,144.27724,142.74734,143.54904,143.63275,142.70628,143.98433,144.02154,159.40421,156.54327,155.59891,129.14724,133.84175,134.79559,161.14217,128.45050,140.80937,6.73837,7.19962,7.06576,7.00241,6.19727,6.27488,6.45876,7.20080,6.13600,6.92080,2.41227,2.48808,2.47047,2.46394,2.32038,2.34493,2.36922,2.48879,2.31190,2.40910,4.32610,4.81139,4.65691,4.61273,3.77881,3.88165,4.05947,4.86990,3.75269,4.33399,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.61911,2.17399,2.07948,1.85686,1.36224,1.38621,1.40104,2.18290,1.34280,1.59140,0.0,0.0,0.0,0.0,0.0,143.99067,122.71778,127.05656,128.45776,168.74703,165.38219,162.73763,121.84423,169.25055,143.06356,0.0,0.06727,0.24592,0.21127,0.16831,0.00130,0.00320,0.00533,0.25080,0.00120,0.03840,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94512,7.00538,6.96626,6.96220,6.90121,6.92367,6.93110,7.00740,6.89040,6.94520,25.12799,25.59460,25.56510,25.53230,24.56288,24.62296,24.69480,25.59960,24.55920,25.09149,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94512,7.00538,6.96626,6.96220,6.90121,6.92367,6.93110,7.00740,6.89040,6.94520,6.94340,7.74310,7.47151,7.41863,6.27336,6.38801,6.42677,7.78510,6.20570,7.10180 -13.09989,6.94583,7.19368,7.12081,7.09154,6.70229,6.75618,6.80830,7.19620,6.68319,6.93080,2.09107,2.70249,2.59829,2.53366,1.67123,1.69066,1.71364,2.71740,1.66960,2.14179,4.85475,5.47922,5.27043,5.25100,4.26197,4.35594,4.42372,5.52530,4.23880,4.84189,143.98452,144.90195,144.43207,144.24394,142.74734,143.52865,143.64431,142.70628,143.98433,144.00994,159.40421,157.07414,155.36490,129.14724,133.73865,134.62465,161.14217,128.45050,140.80937,6.73730,7.19962,7.06379,7.00290,6.21119,6.27488,6.44272,7.20080,6.13600,6.94070,2.41542,2.51494,2.47226,2.46431,2.32956,2.34822,2.36944,2.51699,2.31479,2.41199,4.32187,4.81139,4.65691,4.61273,3.76553,3.88165,4.01048,4.86990,3.75269,4.32699,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.61457,2.17399,2.10117,1.85686,1.36119,1.37914,1.40010,2.18290,1.34280,1.59050,0.0,0.0,0.0,0.0,0.0,143.97115,122.22374,127.08547,128.45776,168.54277,165.38219,162.93650,121.31947,169.25055,143.19057,0.0,0.06654,0.24592,0.20696,0.16831,0.00142,0.00330,0.00563,0.25080,0.00130,0.03570,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94519,7.00538,6.96725,6.96164,6.90121,6.92367,6.93270,7.00740,6.89040,6.94520,25.12981,25.59460,25.56510,25.54784,24.55949,24.63449,24.70222,25.59960,24.42470,25.09909,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94519,7.00538,6.96725,6.96164,6.90121,6.92367,6.93270,7.00740,6.89040,6.94520,6.94396,7.74310,7.47726,7.42806,6.27336,6.36642,6.43646,7.78510,6.20570,7.10180 -13.19990,6.94479,7.19368,7.12081,7.08976,6.70229,6.75608,6.80830,7.19620,6.68319,6.80760,2.09007,2.70249,2.59829,2.54374,1.67014,1.68753,1.70942,2.71740,1.65710,2.14179,4.85472,5.48506,5.28455,5.25572,4.26197,4.35883,4.42372,5.52530,4.23880,4.82990,143.98478,144.90195,144.43207,144.24394,142.74734,143.52865,143.64431,142.70628,143.98433,144.04163,159.40421,157.07414,155.50261,129.14724,133.59732,134.44618,161.14217,128.45050,140.70634,6.73466,7.19962,7.06379,7.00290,6.21450,6.27488,6.44272,7.20080,6.13600,6.79500,2.42152,2.53003,2.50547,2.48721,2.32956,2.34822,2.36929,2.53780,2.31479,2.41400,4.31313,4.81139,4.65448,4.61273,3.75739,3.88165,4.00782,4.86990,3.75269,4.31659,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.61242,2.17399,2.10117,1.85686,1.36119,1.37914,1.39520,2.18290,1.34280,1.59550,0.0,0.0,0.0,0.0,0.0,143.99274,122.13659,126.85783,128.21400,168.57374,165.38876,163.04861,121.31947,169.60938,143.43703,0.0,0.06639,0.24592,0.20696,0.17901,0.00142,0.00340,0.00592,0.25080,0.00130,0.03500,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94517,7.00538,6.96725,6.96164,6.90121,6.92367,6.93270,7.00740,6.89040,6.94520,25.13127,25.59531,25.56809,25.55140,24.55949,24.63449,24.70222,25.59960,24.42470,25.09280,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94517,7.00538,6.96725,6.96164,6.90121,6.92367,6.93270,7.00740,6.89040,6.94520,6.94243,7.74310,7.48518,7.43792,6.27336,6.36642,6.43076,7.78510,6.20570,7.10700 -13.29989,6.94757,7.25042,7.15169,7.09154,6.70229,6.75608,6.80830,7.26790,6.45240,7.12100,2.09687,2.77650,2.59663,2.53194,1.67014,1.69066,1.71364,2.81930,1.65710,2.13260,4.85069,5.48506,5.28505,5.25728,4.24539,4.35918,4.43026,5.52530,4.22869,4.82359,143.98615,144.92631,144.42852,144.24394,142.89580,143.52370,143.64555,142.80410,143.98433,143.89655,159.30715,157.07414,155.50261,127.42239,133.59732,134.26242,161.14217,126.68811,140.41591,6.72929,7.20410,7.07219,7.00082,6.16325,6.26661,6.41838,7.20650,6.09500,7.03130,2.42654,2.61644,2.51480,2.49742,2.32956,2.34822,2.36944,2.67340,2.31479,2.42350,4.30274,4.81139,4.65436,4.59995,3.75421,3.81304,3.99162,4.86990,3.65800,4.31300,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.60929,2.25334,2.07753,1.91294,1.34632,1.36416,1.38488,2.31970,1.22080,1.59050,0.0,0.0,0.0,0.0,0.0,143.93516,121.04242,126.87650,128.38255,169.04627,165.29362,162.76306,119.83797,169.90043,143.75664,0.0,0.07212,0.44387,0.22223,0.18297,0.00142,0.00340,0.00592,0.52350,0.00130,0.03720,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94511,6.99810,6.96749,6.96157,6.90005,6.92384,6.93270,7.00260,6.89040,6.94520,25.11770,25.58868,25.56809,25.55140,24.43524,24.56827,24.69216,25.58940,24.38750,25.09280,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94511,6.99810,6.96749,6.96157,6.90005,6.92384,6.93270,7.00260,6.89040,6.94520,6.94943,7.84791,7.48518,7.44810,6.27718,6.36642,6.43076,7.89340,6.20570,7.12170 -13.39990,6.94504,7.25042,7.15506,7.10348,6.62459,6.72499,6.78636,7.26790,6.45240,6.96410,2.12274,2.92897,2.60605,2.54674,1.67346,1.69414,1.72054,2.93380,1.65710,2.15169,4.82230,5.48506,5.27510,5.25572,4.07842,4.31400,4.41874,5.52530,3.67290,4.79510,143.98388,144.92631,144.42852,144.25726,142.89580,143.49569,143.64555,142.80410,143.98018,143.97923,159.81369,157.20007,155.74625,127.42239,132.55707,134.06515,161.14217,126.68811,141.18510,6.69352,7.20410,7.07219,7.00082,6.09227,6.25422,6.28808,7.20650,5.71550,6.63300,2.43649,2.69236,2.52988,2.51442,2.32956,2.35187,2.37040,2.70610,2.31479,2.43009,4.25702,4.81139,4.65430,4.59241,3.52971,3.75655,3.83725,4.86990,3.17330,4.27570,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.62234,2.33408,2.07986,1.97357,1.33932,1.36320,1.38436,2.34450,1.22080,1.59550,0.0,0.0,0.0,0.0,0.0,143.98750,118.84905,126.88503,128.16470,173.85607,166.44086,162.88555,118.21588,187.61726,143.95117,0.0,0.08085,0.45006,0.23816,0.20548,0.00142,0.00340,0.00684,0.52350,0.00130,0.03880,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.99810,6.96885,6.96157,6.90005,6.92384,6.93206,7.00260,6.89040,6.94540,25.07771,25.58868,25.56611,25.53340,24.11977,24.47656,24.66088,25.58940,23.84690,25.07300,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94522,6.99810,6.96885,6.96157,6.90005,6.92384,6.93206,7.00260,6.89040,6.94540,6.94544,7.84791,7.54391,7.45906,6.25728,6.36132,6.42070,7.89340,6.20570,7.08290 -13.49990,6.94533,7.25042,7.15506,7.11114,6.62459,6.72499,6.78646,7.26790,6.45240,6.96360,2.13713,2.92897,2.67834,2.56552,1.67346,1.69591,1.72298,2.93380,1.65710,2.15549,4.80819,5.48506,5.28505,5.25100,4.02306,4.27906,4.41204,5.52530,3.67290,4.78520,143.98360,144.92631,144.42852,144.24394,142.89580,143.49569,143.70665,142.80410,143.98018,143.81152,159.81369,157.07414,155.61877,127.42239,132.45138,134.00765,161.14217,126.68811,140.41591,6.66743,7.20410,7.10772,7.01858,5.87631,6.20425,6.27932,7.20650,5.71550,6.38379,2.44217,2.69236,2.52988,2.51508,2.33129,2.36678,2.37636,2.70610,2.31479,2.44200,4.22525,4.81139,4.65713,4.59241,3.39920,3.73829,3.81458,4.86990,3.17330,4.23350,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.62502,2.33408,2.12500,2.00126,1.22979,1.35216,1.37018,2.34450,1.22080,1.60300,0.0,0.0,0.0,0.0,0.0,143.98160,118.84905,125.57466,127.93417,175.54552,167.36457,162.99865,118.21588,187.61726,144.07768,0.0,0.08120,0.45006,0.23816,0.20548,0.00130,0.00340,0.00724,0.52350,0.00130,0.03980,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94523,6.99810,6.96885,6.95862,6.90005,6.92384,6.93270,7.00260,6.89040,6.94540,25.06230,25.58868,25.56450,25.52810,24.11977,24.46336,24.63350,25.58940,23.84690,25.06380,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94523,6.99810,6.96885,6.95862,6.90005,6.92384,6.93270,7.00260,6.89040,6.94540,6.95354,7.84791,7.54994,7.46226,6.25728,6.36642,6.42596,7.89340,6.20570,7.12170 -13.59990,6.94525,7.35422,7.17517,7.11861,6.55388,6.71330,6.78194,7.38949,6.45240,6.92360,2.15574,2.98315,2.68639,2.58715,1.67346,1.69591,1.72378,3.01890,1.65710,2.16910,4.78950,5.57906,5.28505,5.25100,3.79751,4.24277,4.36556,5.61800,3.50810,4.79500,143.98424,144.92631,144.38264,144.24144,142.89580,143.47222,143.71161,142.80410,143.98018,143.85021,160.66481,157.76653,155.83848,123.10337,132.22615,133.90717,166.56950,120.63162,140.86689,6.63271,7.24350,7.13389,7.01858,5.75010,6.09910,6.25484,7.27030,5.29919,6.25980,2.44624,2.69236,2.53747,2.51688,2.32839,2.36200,2.37636,2.70610,2.31479,2.44700,4.18647,4.82899,4.65713,4.59322,3.24083,3.59341,3.75941,4.86990,2.82519,4.20840,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.63303,2.37228,2.12965,2.00873,1.22269,1.30890,1.36329,2.39240,1.20470,1.61750,0.0,0.0,0.0,0.0,0.0,143.98328,116.79208,125.44769,127.58096,182.78274,168.38758,164.22140,115.78228,193.60334,143.59357,0.0,0.09178,0.49369,0.32813,0.22293,0.00088,0.00330,0.00684,0.52350,0.00030,0.04230,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94520,6.99810,6.96999,6.95838,6.90005,6.92604,6.93282,7.00260,6.89040,6.94540,25.03090,25.58885,25.56611,25.53060,23.88008,24.45074,24.56548,25.58940,23.77020,25.04110,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94520,6.99810,6.96999,6.95838,6.90005,6.92604,6.93282,7.00260,6.89040,6.94540,6.95167,8.12325,7.56280,7.46786,6.22413,6.33848,6.41690,8.28969,6.00350,7.09890 -13.69990,6.94472,7.35422,7.17628,7.11861,6.55388,6.71330,6.78110,7.38949,6.45240,6.91730,2.16685,2.98315,2.69915,2.61359,1.67346,1.70064,1.75110,3.01890,1.65710,2.19470,4.77786,5.57906,5.33461,5.24896,3.79751,4.22970,4.33064,5.61800,3.50810,4.78430,143.98440,145.08081,144.38264,144.24144,142.57972,143.42695,143.71161,142.41768,143.99055,143.96753,160.84281,157.76653,155.83848,123.10337,132.05870,133.83440,166.56950,120.63162,141.18510,6.59801,7.24350,7.13389,7.02964,5.69688,6.05879,6.20599,7.27030,5.29919,6.55130,2.45752,2.69236,2.56490,2.52672,2.32839,2.36929,2.38178,2.70610,2.31479,2.45760,4.14049,4.82899,4.65713,4.59314,3.19077,3.53333,3.73293,4.86990,2.82519,4.15280,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.63839,2.37228,2.15295,2.03083,1.22269,1.26212,1.36186,2.39240,1.20470,1.62190,0.0,0.0,0.0,0.0,0.0,143.99426,116.79208,124.47471,127.18503,182.78274,168.62411,164.42662,115.78228,193.60334,143.28700,0.0,0.09316,0.49369,0.32813,0.22708,0.00064,0.00352,0.00724,0.52350,0.00030,0.04650,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94519,7.01362,6.97219,6.95838,6.89271,6.92604,6.93282,7.02160,6.88080,6.94490,25.01616,25.58885,25.56450,25.51664,23.88008,24.42721,24.55358,25.58940,23.77020,25.03540,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94519,7.01362,6.97219,6.95838,6.89271,6.92604,6.93282,7.02160,6.88080,6.94490,6.94601,8.12325,7.57239,7.47191,6.21724,6.33848,6.41690,8.28969,6.00350,7.08290 -13.79990,6.94539,7.36429,7.16570,7.11669,6.54620,6.71935,6.78110,7.38949,6.45240,7.05740,2.17177,2.99336,2.70854,2.66250,1.67700,1.70525,1.76190,3.01890,1.65710,2.19470,4.77362,5.56144,5.31305,5.24720,3.76191,4.22820,4.32410,5.61800,3.50810,4.78500,143.98363,144.87756,144.37931,144.22938,142.59863,143.43600,143.71326,142.41768,143.99055,143.97033,160.30470,157.52000,155.80935,122.38688,132.12221,133.82402,166.56950,120.63162,141.18510,6.58914,7.25115,7.12985,7.03130,5.69303,6.01994,6.19520,7.27030,5.29919,6.87460,2.46697,2.69628,2.57790,2.53450,2.35961,2.38235,2.39260,2.70610,2.32880,2.46070,4.12216,4.75992,4.65605,4.59210,3.18578,3.53024,3.72170,4.77250,2.82519,4.12199,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.63937,2.37802,2.15859,2.03630,1.22215,1.26000,1.36290,2.39240,1.20470,1.61750,0.0,0.0,0.0,0.0,0.0,143.98022,116.89316,124.66340,126.42704,183.86036,168.53601,164.31153,115.78228,193.60334,143.27263,0.0,0.09257,0.50241,0.33760,0.22353,0.00062,0.00300,0.00752,0.52350,0.00030,0.04880,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94523,7.01269,6.97175,6.95830,6.90238,6.92619,6.93340,7.02160,6.88080,6.94490,25.00909,25.58901,25.56130,25.49500,23.87060,24.40644,24.54070,25.58940,23.77020,25.03900,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94523,7.01269,6.97175,6.95830,6.90238,6.92619,6.93340,7.02160,6.88080,6.94490,6.94587,8.17080,7.56875,7.47250,6.23812,6.34839,6.41809,8.28969,6.00350,7.08290 -13.89990,6.94517,7.37689,7.18522,7.11790,6.53660,6.69714,6.77110,7.38949,6.45240,6.90280,2.18065,3.00613,2.74287,2.66710,1.67835,1.71167,1.76394,3.01890,1.65710,2.19470,4.76452,5.58972,5.34260,5.24314,3.71740,4.22237,4.30080,5.61800,3.50810,4.77470,143.98494,144.94560,144.39599,144.22106,142.50809,143.41852,143.72462,142.41768,143.99055,144.04310,160.36794,157.36631,155.78750,121.50291,131.98271,133.81327,166.56950,120.63162,141.46672,6.57559,7.26073,7.13722,7.04415,5.68821,5.98107,6.19105,7.27030,5.29919,6.09030,2.47416,2.70119,2.58522,2.54000,2.35920,2.39425,2.41080,2.70610,2.32880,2.46280,4.10143,4.76621,4.65822,4.59625,3.17954,3.51879,3.65460,4.77250,2.82519,4.10329,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.64141,2.38521,2.15965,2.06050,1.22147,1.25214,1.35640,2.39240,1.20470,1.60660,0.0,0.0,0.0,0.0,0.0,143.98478,116.33507,123.67857,126.41825,185.33087,168.51897,164.88725,115.78228,193.60334,143.48437,0.0,0.09644,0.51332,0.34521,0.24948,0.00061,0.00323,0.00768,0.52350,0.00030,0.05450,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94517,7.01714,6.97260,6.95775,6.89914,6.92539,6.93379,7.02160,6.88080,6.94490,24.99410,25.58920,25.55287,25.49450,23.85875,24.38802,24.50200,25.58940,23.77020,25.00760,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94517,7.01714,6.97260,6.95775,6.89914,6.92539,6.93379,7.02160,6.88080,6.94490,6.94236,8.23025,7.57675,7.47310,6.23566,6.35460,6.41900,8.28969,6.00350,7.06880 -13.99990,6.94527,7.38949,7.21199,7.13199,6.52700,6.64930,6.76109,7.38949,6.45240,6.64930,2.19140,3.01890,2.81930,2.68009,1.67700,1.71270,1.77150,3.01890,1.65710,2.20290,4.75386,5.61800,5.33999,5.24720,3.67290,4.20640,4.27230,5.61800,3.50810,4.77540,143.98410,145.01370,144.43353,144.22730,142.41768,143.40001,143.71119,142.41768,143.99055,144.10442,160.43123,157.82828,155.80935,120.63162,131.80266,133.14160,166.56950,120.63162,141.46672,6.55941,7.27030,7.13490,7.03509,5.68340,5.97050,6.10290,7.27030,5.29919,6.51760,2.47976,2.70610,2.59610,2.54460,2.36149,2.39610,2.42280,2.70610,2.32880,2.46430,4.07964,4.77250,4.65470,4.56240,3.17330,3.48910,3.58699,4.77250,2.82519,4.07489,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,5.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.63984,2.39240,2.17209,2.03630,1.22080,1.23400,1.33680,2.39240,1.20470,1.60660,0.0,0.0,0.0,0.0,0.0,143.98269,115.78228,122.55953,126.14635,186.91938,168.94460,165.45881,115.78228,193.60334,143.30137,0.0,0.10153,0.52350,0.34778,0.29338,0.00059,0.00343,0.00798,0.52350,0.00030,0.05620,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94521,7.02160,6.97350,6.95840,6.89590,6.92360,6.93350,7.02160,6.88080,6.94490,24.97612,25.58940,25.55730,25.49500,23.84690,24.38750,24.46260,25.58940,23.77020,25.00520,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.94521,7.02160,6.97350,6.95840,6.89590,6.92360,6.93350,7.02160,6.88080,6.94490,6.93941,8.28969,7.58710,7.51080,6.23320,6.33600,6.41809,8.28969,6.00350,7.06880 diff --git a/Tests/Scripts/analyze-paced.py b/Tests/Scripts/analyze-paced.py new file mode 100644 index 00000000..f782bf78 --- /dev/null +++ b/Tests/Scripts/analyze-paced.py @@ -0,0 +1,331 @@ +#!/usr/bin/env python3 +import sys +import os + +_prev_excepthook = sys.excepthook + +def _dep_hint_excepthook(exc_type, exc, tb): + # Catch missing-module cases and print one install command for all deps + if exc_type is ModuleNotFoundError or exc_type is ImportError: + script_path = os.path.abspath(__file__) + script_dir = os.path.dirname(script_path) + sys.stderr.write( + "Required package(s) missing; install with:\n" + " python -m pip install matplotlib pandas" + ) + sys.exit(1) + + # Fallback to the default handler for non-import errors + _prev_excepthook(exc_type, exc, tb) + +sys.excepthook = _dep_hint_excepthook + +import re +from enum import Enum +import argparse +import pandas as pd +import tkinter as tk +from tkinter import ttk, messagebox +from matplotlib.figure import Figure +from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk +from matplotlib.lines import Line2D + +class RunMode(Enum): + OneShot = "one-shot" + Full = "full" + RoundRobin = "round-robin" + +class AutocompleteCombobox(ttk.Combobox): + """A Combobox that filters its dropdown list as you type.""" + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._all_values = [] + self.bind('', self._on_keyrelease) + + def set_completion_list(self, completion_list): + self._all_values = sorted(completion_list, key=str.lower) + self['values'] = self._all_values + + def _on_keyrelease(self, event): + text = self.get() + if text == '': + data = self._all_values + else: + data = [v for v in self._all_values if text.lower() in v.lower()] + self['values'] = data + +class PolledPlotApp(tk.Tk): + def __init__(self, folder, name, run_mode, golds_folder=None): + super().__init__() + self.title("Polled CSV Plotter") + self.geometry("900x650") + + # Persist per-series visibility across Y selections + self.visible = {} # {series_label: bool} + # Persist per-series style for legend proxies + self.styles = {} # {series_label: dict(color=..., linestyle=..., marker=...)} + + # Load CSVs according to run mode + self.dfs = self.load_csvs(folder, name, golds_folder, run_mode) + if not self.dfs: + messagebox.showerror("Error", "No valid CSV files found for the given inputs.") + self.destroy() + return + + # Initialize columns/UI + cols = list(self.dfs[0][1].columns) + if len(cols) < 2: + messagebox.showerror("Error", "CSV files must have at least two columns.") + self.destroy() + return + + self.x_col = cols[0] + self.y_choices = cols[1:] + + ctrl = ttk.Frame(self) + ctrl.pack(side=tk.TOP, fill=tk.X, padx=8, pady=8) + + ttk.Label(ctrl, text="X-axis:").pack(side=tk.LEFT) + ttk.Label(ctrl, text=self.x_col, width=15).pack(side=tk.LEFT, padx=(0, 20)) + ttk.Label(ctrl, text="Y-axis:").pack(side=tk.LEFT) + + self.y_combo = AutocompleteCombobox(ctrl, state="normal", width=50) + self.y_combo.set_completion_list(self.y_choices) + self.y_combo.set(self.y_choices[0]) + self.y_combo.pack(side=tk.LEFT, padx=(0, 10)) + self.y_combo.bind("<>", self.on_select) + + ttk.Button(ctrl, text="Exit", command=self.destroy).pack(side=tk.RIGHT) + + # Matplotlib figure/canvas/toolbar + self.fig = Figure(figsize=(6, 4)) + self.ax = self.fig.add_subplot(111) + + self.canvas = FigureCanvasTkAgg(self.fig, master=self) + self.canvas.draw() + self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1) + + self.toolbar = NavigationToolbar2Tk(self.canvas, self) + self.toolbar.update() + self.toolbar.pack(side=tk.TOP, fill=tk.X) + + # One pick handler for the lifetime of the app + self.fig.canvas.mpl_connect("pick_event", self.on_pick) + + # Initial draw + self.draw_plot(self.x_col, self.y_choices[0]) + + def load_csvs(self, folder, name, golds_folder, run_mode): + """ + Returns list of (label, DataFrame) based on run mode. + + RoundRobin: + - Load: folder/name_robin_#.csv + + OneShot: + - Must load: folder/name_oneshot.csv (mandatory) + - Must also load: golds_folder/name_gold.csv + + Full: + - Load: folder/name_full_#.csv + - Must also load: golds_folder/name_gold.csv + - Also try to include: folder/name_oneshot.csv (if present) + """ + out = [] + + def try_load_csv(path, label=None): + try: + df = pd.read_csv(path, header=0) + if df.shape[1] >= 2: + lab = label if label is not None else os.path.basename(path) + out.append((lab, df)) + if lab not in self.visible: + self.visible[lab] = True + else: + print(f"Skipping {path}: not enough columns") + except Exception as e: + print(f"Skipping {path}: {e}") + + try: + folder_files = sorted(os.listdir(folder)) + except FileNotFoundError: + print(f"Folder not found: {folder}") + folder_files = [] + + oneshot_fname = f"{name}_oneshot.csv" + gold_fname = f"{name}_gold.csv" + + if run_mode == RunMode.RoundRobin: + robin_re = re.compile(rf'^{re.escape(name)}_robin_(\d+)\.csv$') + for fname in folder_files: + if robin_re.match(fname): + try_load_csv(os.path.join(folder, fname)) + + elif run_mode == RunMode.OneShot: + # Mandatory oneshot + oneshot_path = os.path.join(folder, oneshot_fname) + if os.path.isfile(oneshot_path): + try_load_csv(oneshot_path) + else: + print(f"ERROR: Oneshot file is mandatory but not found: {oneshot_path}") + return [] # cause error popup upstream + + # Gold must be available for the comparison basis + if not golds_folder: + print("ERROR: Golds folder is required in one-shot mode.") + return [] + gold_path = os.path.join(golds_folder, gold_fname) + if os.path.isfile(gold_path): + try_load_csv(gold_path) + else: + print(f"ERROR: Gold file is mandatory but not found: {gold_path}") + return [] + + elif run_mode == RunMode.Full: + full_re = re.compile(rf'^{re.escape(name)}_full_(\d+)\.csv$') + for fname in folder_files: + if full_re.match(fname): + try_load_csv(os.path.join(folder, fname)) + # Always try to include oneshot and gold as context + oneshot_path = os.path.join(folder, oneshot_fname) + if os.path.isfile(oneshot_path): + try_load_csv(oneshot_path) + else: + print(f"Oneshot file not found (optional in full): {oneshot_path}") + if golds_folder: + gold_path = os.path.join(golds_folder, gold_fname) + if os.path.isfile(gold_path): + try_load_csv(gold_path) + else: + print(f"ERROR: Gold file is mandatory but not found: {gold_path}") + return [] + else: + print("ERROR: Golds folder is required in one-shot mode.") + return [] + + return out + + def _legend_handles(self, legend): + """ + Compatibility shim: + - Matplotlib >= 3.8 exposes 'legend_handles' + - Older versions use 'legendHandles' + """ + h = getattr(legend, "legend_handles", None) + if h is None: + h = getattr(legend, "legendHandles", []) + return h + + def draw_plot(self, x_col, y_col): + self.ax.clear() + + plotted = [] # list of (label, line) + + # Plot data and capture styles once for each label + for label, df in self.dfs: + line, = self.ax.plot(df[x_col], df[y_col], label=label) + line.set_visible(self.visible.get(label, True)) + plotted.append((label, line)) + + if label not in self.styles: + self.styles[label] = dict( + color=line.get_color(), + linestyle=line.get_linestyle(), + marker=line.get_marker(), + ) + + self.ax.set_xlabel(x_col) + self.ax.set_ylabel(y_col) + self.ax.set_title(f"{y_col} vs {x_col}") + + # Build legend from proxy artists so entries never disappear + proxies = [] + labels = [] + for label, line in plotted: + st = self.styles.get(label, {}) + proxy = Line2D( + [0], [0], + color=st.get("color", "k"), + linestyle=st.get("linestyle", "-"), + marker=st.get("marker", None), + ) + proxy.set_alpha(1.0 if line.get_visible() else 0.2) + proxies.append(proxy) + labels.append(label) + + leg = self.ax.legend(handles=proxies, labels=labels, loc="best", + fancybox=True, shadow=True) + + # IMPORTANT: legend clones the handles; attach pick + mapping to the cloned artists + legend_handles = self._legend_handles(leg) + for h, (label, line) in zip(legend_handles, plotted): + h.set_picker(5) # pickable handle + h._origline = line # map legend handle -> real line + h.set_alpha(1.0 if line.get_visible() else 0.2) + + # Also make legend text clickable and mapped to the real line + for t, (label, line) in zip(leg.get_texts(), plotted): + t.set_picker(True) + t._origline = line + + self.canvas.draw() + + def on_select(self, event): + # Redraw with same visibility choices + self.draw_plot(self.x_col, self.y_combo.get()) + + def on_pick(self, event): + # Toggle for both legend handles and legend texts + artist = event.artist + origline = getattr(artist, "_origline", None) + if origline is None: + return + + new_vis = not origline.get_visible() + origline.set_visible(new_vis) + + # Persist by label + label = origline.get_label() + self.visible[label] = new_vis + + # Refresh legend proxy alphas to reflect visibility + leg = self.ax.get_legend() + if leg is not None: + for h in self._legend_handles(leg): + l = getattr(h, "_origline", None) + if l is not None: + h.set_alpha(1.0 if l.get_visible() else 0.2) + + self.canvas.draw() + +def parse_args(): + parser = argparse.ArgumentParser( + description="Interactive plot of polled data sequences from test runs." + ) + parser.add_argument( + "--folder", required=True, + help="Folder containing data generated in the current test run." + ) + parser.add_argument( + "--golds", + help="Folder containing gold run data (required for one-shot mode)." + ) + parser.add_argument( + "--name", required=True, + help="Test case name (prefix of CSV files)." + ) + parser.add_argument( + "--run-mode", required=True, + type=RunMode, + choices=list(RunMode), + help="Specify a mode of execution" + ) + return parser.parse_args() + +def main(): + args = parse_args() + app = PolledPlotApp(folder=args.folder, name=args.name, run_mode=args.run_mode, golds_folder=args.golds) + app.mainloop() + +if __name__ == "__main__": + main() diff --git a/Tests/aux-data.lock.json b/Tests/aux-data.lock.json new file mode 100644 index 00000000..5c2e8721 --- /dev/null +++ b/Tests/aux-data.lock.json @@ -0,0 +1,3 @@ +{ + "pinnedCommitHash": "340d15ae64a23c54dded7793805f01dc2fcb4166" +} diff --git a/Tests/pull-aux.ps1 b/Tests/pull-aux.ps1 new file mode 100644 index 00000000..fad0cfa1 --- /dev/null +++ b/Tests/pull-aux.ps1 @@ -0,0 +1,193 @@ +param( + [string]$Owner = "planetchili", + [string]$Repo = "IPMAuxTestData", + [string]$MainRepoPath = ".\", + [string]$AuxDataRepoPath = ".\AuxData", + [string]$DataSubdirName = "Data", + [string]$LockFile = "aux-data.lock.json" +) + +$ErrorActionPreference = "Stop" + +# Preserve original location and prep temp download folder +$origLocation = Get-Location +$dlTemp = Join-Path $env:TEMP ("auxdata-pull-" + ([guid]::NewGuid().ToString("N"))) + +try { + # ---- Resolve paths relative to the script location (PS5-compatible) ---- + if (-not [System.IO.Path]::IsPathRooted($AuxDataRepoPath)) { + $AuxDataRepoPath = Join-Path $PSScriptRoot $AuxDataRepoPath + } + try { + $resolvedAux = Resolve-Path -LiteralPath $AuxDataRepoPath -ErrorAction Stop + $AuxDataRepoPath = $resolvedAux.Path + } catch { + # Keep as intended path (may not exist yet; cloning will create it) + $AuxDataRepoPath = $AuxDataRepoPath + } + + if (-not [System.IO.Path]::IsPathRooted($MainRepoPath)) { + $MainRepoPath = Join-Path $PSScriptRoot $MainRepoPath + } + $MainRepoPath = (Resolve-Path -LiteralPath $MainRepoPath).Path + + # --- 1) Load lock file --- + $lockFilePath = Join-Path $MainRepoPath $LockFile + if (-not (Test-Path -LiteralPath $lockFilePath)) { + throw "Lock file not found at '$lockFilePath'. Aborting." + } + $lock = Get-Content -LiteralPath $lockFilePath | ConvertFrom-Json + if (-not $lock.pinnedCommitHash) { + throw "Lock file missing 'pinnedCommitHash'. Aborting." + } + $pinnedCommit = "$($lock.pinnedCommitHash)".Trim() + + # --- 2) Ensure Aux repo exists (clone if not present), prefer HTTPS remote --- + if (-not (Test-Path -LiteralPath $AuxDataRepoPath)) { + Write-Host "AuxData repo not found at '$AuxDataRepoPath'. Cloning https://github.com/$Owner/$Repo.git ..." + git clone "https://github.com/$Owner/$Repo.git" "$AuxDataRepoPath" | Out-Null + } + + # Make sure it’s a valid git repo (has .git) + if (-not (Test-Path -LiteralPath (Join-Path $AuxDataRepoPath ".git"))) { + throw "'$AuxDataRepoPath' exists but is not a git repository." + } + + Set-Location $AuxDataRepoPath + + # Force HTTPS for both fetch and push (push not used here, but keeps repo clean) + $curUrl = git remote get-url origin 2>$null + if ($curUrl -match '^git@github\.com:') { + git remote set-url origin "https://github.com/$Owner/$Repo.git" | Out-Null + git config --unset-all remote.origin.pushurl 2>$null + git remote set-url --push origin "https://github.com/$Owner/$Repo.git" | Out-Null + } + + # --- 3) Fetch and checkout pinned commit (detached HEAD is fine for pull) --- + Write-Host "Fetching origin..." + git fetch origin --tags | Out-Null + + Write-Host "Checking out pinned commit $pinnedCommit..." + git checkout --detach $pinnedCommit | Out-Null + + # --- 4) Read manifest --- + $manifestPath = Join-Path $AuxDataRepoPath "etl-manifest.json" + if (-not (Test-Path -LiteralPath $manifestPath)) { + throw "Manifest file not found at '$manifestPath' for pinned commit $pinnedCommit." + } + $manifest = Get-Content -LiteralPath $manifestPath | ConvertFrom-Json + if (-not $manifest.etlFiles) { + Write-Host "Manifest has no 'etlFiles' entries. Nothing to pull." + return + } + + # Paths + $dataRoot = Join-Path $AuxDataRepoPath $DataSubdirName + if (-not (Test-Path -LiteralPath $dataRoot)) { New-Item -ItemType Directory -Path $dataRoot | Out-Null } + + # Temp folder for downloads + New-Item -ItemType Directory -Path $dlTemp | Out-Null + + # --- 5) Helper: cache releases by tag to avoid repeated API calls --- + $releaseCache = @{} # tag -> release JSON + + function Get-ReleaseByTag([string]$tag) { + if ($releaseCache.ContainsKey($tag)) { return $releaseCache[$tag] } + $url = "https://api.github.com/repos/$Owner/$Repo/releases/tags/$tag" + $headers = @{ + "User-Agent" = "auxdata-pull-script" + "Accept" = "application/vnd.github+json" + } + try { + $rel = Invoke-RestMethod -Uri $url -Headers $headers -Method Get + } catch { + throw "Failed to fetch release for tag '$tag' from $url. $_" + } + $releaseCache[$tag] = $rel + return $rel + } + + # --- 6) Iterate manifest entries and ensure ETLs present & valid --- + foreach ($entry in $manifest.etlFiles) { + $etlName = $entry.name + $expectedHash = $entry.hash + $tag = $entry.releaseTag + + if (-not $etlName -or -not $expectedHash -or -not $tag) { + Write-Warning "Skipping malformed manifest entry (name/hash/tag missing): $($entry | ConvertTo-Json -Depth 3)" + continue + } + + $etlPath = Join-Path $dataRoot $etlName + + $needsDownload = $true + if (Test-Path -LiteralPath $etlPath) { + try { + $actualHash = (Get-FileHash -LiteralPath $etlPath -Algorithm SHA256).Hash + if ($actualHash -ieq $expectedHash) { + Write-Host "OK : $etlName already present and matches hash." + $needsDownload = $false + } else { + Write-Host "HASH: $etlName present but hash mismatch; will re-fetch." + } + } catch { + Write-Host "WARN: Failed to hash existing file $etlName; will re-fetch." + } + } + + if (-not $needsDownload) { continue } + + Write-Host "GET : $etlName from release tag '$tag'..." + + # Fetch release once per tag + $release = Get-ReleaseByTag -tag $tag + + # Find asset named ".tar.gz" + $assetName = "$etlName.tar.gz" + $asset = $null + foreach ($a in $release.assets) { + if ($a.name -ieq $assetName) { $asset = $a; break } + } + if (-not $asset) { + throw "Asset '$assetName' not found in release '$tag'." + } + + $downloadUrl = $asset.browser_download_url + if (-not $downloadUrl) { + throw "browser_download_url missing for asset '$assetName' in release '$tag'." + } + + # Download tar.gz to temp + $archivePath = Join-Path $dlTemp $assetName + Write-Host "DL : $assetName ..." + try { + Invoke-WebRequest -Uri $downloadUrl -OutFile $archivePath + } catch { + throw "Failed to download '$assetName' from $downloadUrl. $_" + } + + # Extract into Data directory (overwrites file if present) + Write-Host "XT : Extracting $assetName ..." + tar -xzf $archivePath -C $dataRoot + + # Verify hash post-extract + if (-not (Test-Path -LiteralPath $etlPath)) { + throw "Extraction did not produce expected file '$etlName' in '$dataRoot'." + } + $postHash = (Get-FileHash -LiteralPath $etlPath -Algorithm SHA256).Hash + if ($postHash -ine $expectedHash) { + throw "Hash mismatch after extract for '$etlName'. Expected $expectedHash, got $postHash." + } + + Write-Host "OK : $etlName downloaded and verified." + } + + Write-Host "All ETLs are present and verified." +} +finally { + # Cleanup temp and restore working directory + if (Test-Path -LiteralPath $dlTemp) { + Remove-Item -Recurse -Force $dlTemp + } + Set-Location $origLocation +} diff --git a/Tests/push-aux.ps1 b/Tests/push-aux.ps1 new file mode 100644 index 00000000..25fff135 --- /dev/null +++ b/Tests/push-aux.ps1 @@ -0,0 +1,218 @@ +# Parameters +$Owner = "planetchili" # AuxTestData GitHub organization +$Repo = "IPMAuxTestData" # The AuxTestData repo +$MainRepoPath = ".\" # Path to the main repo (should contain the aux-test-data.lock.json) +$AuxDataRepoPath = ".\AuxData" # Path to the AuxTestData repo (ignored by main repo) +$DataSubdirName = "Data" # Subdirectory inside AuxTestData that holds BOTH CSVs and .etl files +$LockFile = "aux-data.lock.json" # Lock file in the main repo that pins the testdata commit (commit hash ONLY) +$NewReleaseTag = "etl-update-$(Get-Date -Format 'yyyyMMddHHmmss')" # New release tag based on the current timestamp + +# Load GitHub token from environment variable +$GitHubToken = $env:AUXTESTDATA_GITHUB_TOKEN +if (-not $GitHubToken) { + Write-Error "Environment variable AUXTESTDATA_GITHUB_TOKEN is not set. Aborting." + exit 1 +} +$Headers = @{ Authorization = "Bearer $GitHubToken" } + +# Preserve original location; resolve paths +$origLocation = Get-Location +try { + # Resolve paths to absolute + $MainRepoPath = (Resolve-Path $MainRepoPath).Path + $AuxDataRepoPath = (Resolve-Path $AuxDataRepoPath).Path + + # Ensure we are in the correct working directory for the test data repo + Set-Location -Path $AuxDataRepoPath + + # Make sure fetch works anonymously (HTTPS remote) + $curUrl = git remote get-url origin 2>$null + if ($curUrl -match '^git@github\.com:') { + git remote set-url origin https://github.com/$Owner/$Repo.git + git config --unset-all remote.origin.pushurl 2>$null + git remote set-url --push origin https://github.com/$Owner/$Repo.git + } + + # Fetch the latest changes from the test data repo + Write-Host "Fetching the latest changes from the test data repository..." + git fetch origin + + # Load the test data lock file to get the pinned commit hash + $lockFilePath = Join-Path $MainRepoPath $LockFile + if (-not (Test-Path $lockFilePath)) { + Write-Warning "Lock file not found. Bootstrapping from origin/master..." + $seedCommit = (git rev-parse origin/master).Trim() + if (-not $seedCommit) { Write-Error "Failed to resolve origin/master for bootstrap."; exit 1 } + Write-Host "Checking out seed commit $seedCommit..." + git checkout $seedCommit + $lock = @{ pinnedCommitHash = $seedCommit } + $lock | ConvertTo-Json -Depth 3 | Set-Content -Path $lockFilePath + } else { + $lock = Get-Content -Path $lockFilePath | ConvertFrom-Json + } + $pinnedCommit = $lock.pinnedCommitHash # Commit hash from the main repo to pin to + + # Ensure we're on a local branch (master) based on the pinned commit (avoid detached HEAD) + git rev-parse --verify master > $null 2>&1 + if ($LASTEXITCODE -ne 0) { + git checkout -B master $pinnedCommit + } else { + git checkout master + git reset --hard $pinnedCommit + } + git branch --set-upstream-to=origin/master master > $null 2>&1 + + # Paths inside the AuxData repo for actual data + $dataRoot = Join-Path $AuxDataRepoPath $DataSubdirName + + # Load the manifest (stored at repo root, not in Data) + $manifestFilePath = Join-Path $AuxDataRepoPath "etl-manifest.json" + if (Test-Path $manifestFilePath) { + $manifest = Get-Content -Path $manifestFilePath | ConvertFrom-Json + } else { + $manifest = @{ etlFiles = @() } + } + + # Collect current ETL files in the single data directory + if (-not (Test-Path $dataRoot)) { New-Item -ItemType Directory -Path $dataRoot | Out-Null } + $currentETLs = Get-ChildItem -Path $dataRoot -Filter "*.etl" + + # Prepare a staging folder for gzipped ETLs that need to be uploaded (kept under the repo root) + $stagingFolder = Join-Path $AuxDataRepoPath "etl-staging" + if (Test-Path $stagingFolder) { + Remove-Item -Recurse -Force $stagingFolder + } + New-Item -ItemType Directory -Path $stagingFolder | Out-Null + + # Track new files to upload + $filesToUpload = @() + + # Map existing manifest entries by name for quick lookup + $manifestByName = @{} + foreach ($e in $manifest.etlFiles) { $manifestByName[$e.name] = $e } + + # Compute deltas and update manifest entries IN-PLACE (prevents duplicates) + $deletedETLs = @() + $addedETLs = @() + + # Detect deletions: anything in manifest not present in filesystem + foreach ($k in $manifestByName.Keys) { + if (-not ($currentETLs.Name -contains $k)) { + $deletedETLs += $manifestByName[$k] + } + } + + # Process current ETLs: update existing or mark as added + foreach ($etl in $currentETLs) { + $name = $etl.Name + $newHash = (Get-FileHash $etl.FullName -Algorithm SHA256).Hash + if ($manifestByName.ContainsKey($name)) { + $entry = $manifestByName[$name] + if ($entry.hash -ne $newHash) { + # Update hash + bump releaseTag to new one (changed content) + $entry.hash = $newHash + $entry.releaseTag = $NewReleaseTag + } + } else { + # New file → create new entry with this release tag + $addedETLs += $etl + $manifest.etlFiles += @( + @{ + name = $name + hash = $newHash + releaseTag = $NewReleaseTag + } + ) + } + } + + # Remove deleted entries from manifest + if ($deletedETLs.Count -gt 0) { + $manifest.etlFiles = $manifest.etlFiles | Where-Object { $deletedETLs -notcontains $_ } + } + + # Save the updated manifest (at repo root) + $manifest | ConvertTo-Json -Depth 3 | Set-Content -Path $manifestFilePath + + # --- Generic repo commit for any detected changes (Data or manifest) --- + $repoChangesCommitted = $false + git add -- $dataRoot $manifestFilePath + git diff --cached --quiet + if ($LASTEXITCODE -ne 0) { + Write-Host "Repository changes detected (Data and/or manifest). Committing..." + git commit -m "Update data (CSVs/ETLs) and manifest" + # Push to branch (not a commit hash) + git push origin master + $repoChangesCommitted = $true + } else { + Write-Host "No changes to Data or manifest; nothing to commit." + } + + # Prepare the new release (if there are any new/changed ETLs to upload) + # 'Changed' are those whose manifest entry got updated in-place (releaseTag == $NewReleaseTag) + newly added ETLs + $etlsNeedingUpload = @() + foreach ($etl in $currentETLs) { + $entry = $manifest.etlFiles | Where-Object { $_.name -eq $etl.Name } + if ($entry -and $entry.releaseTag -eq $NewReleaseTag) { + $etlsNeedingUpload += $etl + } + } + + if ($etlsNeedingUpload.Count -gt 0) { + Write-Host "Preparing new release for ETLs..." + + # Deduplicate just in case + $toPackage = $etlsNeedingUpload | Select-Object -Property Name,FullName -Unique + foreach ($etl in $toPackage) { + $tarFile = Join-Path $stagingFolder "$($etl.Name).tar.gz" + Write-Host "Creating tarball for ETL: $($etl.Name)..." + tar -czf $tarFile -C $dataRoot $etl.Name + $filesToUpload += $tarFile + } + + # Current HEAD (after potential commit/push) + $currentHead = (git rev-parse HEAD).Trim() + + # Create new GitHub release for the ETLs (tag pointing to the new commit) + $releaseUrl = "https://api.github.com/repos/$Owner/$Repo/releases" + $releaseBody = @{ + tag_name = $NewReleaseTag + target_commitish = $currentHead + name = "ETL Update $NewReleaseTag" + body = "Upload of updated ETLs." + draft = $false + prerelease = $false + } | ConvertTo-Json -Depth 3 + + $releaseResponse = Invoke-RestMethod -Uri $releaseUrl -Method Post -Body $releaseBody -Headers $Headers + $releaseId = $releaseResponse.id + + # Upload ETLs as release assets (manifest is NOT uploaded) + foreach ($file in $filesToUpload) { + $uploadUrl = "https://uploads.github.com/repos/$Owner/$Repo/releases/$releaseId/assets?name=" + [System.Net.WebUtility]::UrlEncode([System.IO.Path]::GetFileName($file)) + Invoke-RestMethod -Uri $uploadUrl -Method Post -Headers $Headers -InFile $file -ContentType "application/gzip" + } + + Write-Host "New ETL release created and uploaded." + } + + # Write the updated lock file with the new pinned commit hash (no commit to main repo here) + if ($repoChangesCommitted -or ($etlsNeedingUpload.Count -gt 0)) { + Write-Host "Writing updated lock file (no commit to main repo will be made)..." + $lock.pinnedCommitHash = (git rev-parse HEAD) + # Lock contains ONLY the commit hash; release tags are resolved from the manifest when pulling. + $lock | ConvertTo-Json -Depth 3 | Set-Content -Path $lockFilePath + Write-Host "Lock file written to $lockFilePath." + } + + # Cleanup: remove staging folder after run + if (Test-Path $stagingFolder) { + Remove-Item -Recurse -Force $stagingFolder + } +} +finally { + # Restore original working directory + Set-Location $origLocation +} + +Write-Host "Push process complete."